#617Div.3

本文解析了两道算法竞赛题目,包括简化机器人操作指令和利用秘术最大化金币获取。通过运用STL map和贪心策略,提供了高效的问题解决方案。

C.Yet Another Walking Robot

map的应用

大意: 一个机器人(0,0)点可以进行上(U,y+1)、下(D,y-1)、左(L,x+1)、右(R,x-1)的操作,给你系列操作符(UDLR)让你简化(删除)他的操作指令,达到的终点都是同一位置。只能简化一个区间的。如果不能删除,输出-1,否则输出删除的左端点l和右端点r,使r-l+1应该尽可能小,若有多个相同的答案,输出一个就行。

题解: 用stl::map开一个数组vis,标记走过的点,进行判断,如果这个点在原来被标记过,并且使得r-l+1小,则来跟新vis[]和左端点l右端点r。

ac代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    int t, n;
    string s;
    cin >> t;
    while (t--)
    {
        cin >> n >> s;
        int l = -1, r = n;
        map<pair<int, int>, int> vis;
        pair<int, int> zb = {0, 0};
        vis[zb] = 0;                //vis[]代表起始端
        for (int i = 0; i < n; i++) //i代表尾端
        {
            if (s[i] == 'L')
                ++zb.first;
            if (s[i] == 'R')
                --zb.first;
            if (s[i] == 'U')
                ++zb.second;
            if (s[i] == 'D')
                --zb.second;
            if (vis.count(zb)) //在map中,若能找到就输出1,否则为0
            {
                if (i - vis[zb] < r - l)
                {
                    r = i;
                    l = vis[zb];
                }
            }
            vis[zb] = i + 1; //储存当前坐标的起始位置
        }
        if (l == -1)
            cout << -1 << endl;
        else
            cout << l+1 << " " << r+1 << endl;
    }

    return 0;
}

D. Fight with Monsters

贪心

大意: 我和对手去杀n个怪物,我每杀死一个怪物就能获得1金币。我的攻击力是a,对手的攻击力是b,每个怪物的血量是i-hp。我先手攻击,但是我能使用k次秘术,能使对手放弃一次攻击怪物的机会。输出我最多能获得多少金币。

题解: 1我们可以设tmp=a+b,并对hp%tmp;2若tmp=0,我们可以往前倒回一个回合,此时怪物hp=tmp,这时我们再使用秘术,计算使用t次秘术,并存入数组num[]中,t=[tmp/a]-1,([tmp/a]的意思是向上取整)。3 若tmp!=0,当前hp=hp%tmp,t=[tmp/a]-1,并存放到数组中。4对num[]数组进行排序,计算能再k次能的最大击杀数。

ac代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    ios::sync_with_stdio(false);
    int n, a, b, k, hp, ans = 0;
    vector<int> num;
    ll tmp;
    cin >> n >> a >> b >> k;
    tmp = a + b;
    while (n--)
    {
        cin >> hp;
        hp %= tmp;
        if (!hp)
            hp = tmp;
        int t = ceil(hp * 1.0 / a) - 1;
        num.push_back(t);
    }
    sort(num.begin(), num.end());
    for (vector<int>::iterator iter = num.begin(); iter != num.end(); ++iter)
    {
        if (k >= *iter)
        {
            ans++;
            k -= *iter;
        }
        else
            break;
    }
    cout << ans << endl;
    return 0;
}
<h2 class="level2">一、研究背景与意义</h2> <div class="content"> 复杂肝胆管结石是肝胆外科难治性疾病之一,具有结石分布广泛、胆管狭窄发生率高、肝实质萎缩明显等特点,术后结石残留率(20%-50%)和复发率(23.8%)居高不下,严重影响患者预后<document id="2"></document><document id="8"></document>。精准定位结石、评估胆管狭窄及肝内血管解剖是提高手术疗效的关键,但传统影像学检查(如超声、CT)存在二维图像空间分辨率有限、难以实时动态评估等不足<document id="3"></document>。 </div> <div class="content"> 三维可视化技术通过对肝脏、胆道及血管的数字化重建,可立体显示结石分布、胆管狭窄部位及血管解剖关系,显著降低结石残留率(0% vs 9.5%)和手术时间(218.8min vs 254.7min)<document id="2"></document><document id="4"></document>;术中超声可实时定位深部结石、评估胆管通畅性,弥补术前三维重建静态评估的局限<document id="38"></document>。然而,目前关于两者联合应用的系统性研究较少,其在复杂肝胆管结石中的协同价值尚未明确。本研究旨在探索三维可视化联合术中超声的应用效果,为优化复杂肝胆管结石诊疗策略提供依据。 </div> <h2 class="level2">二、国内外研究现状</h2> <div class="content"> 国外研究表明,三维重建技术可提高肝切除术的精准性,其引导的手术在结石清除率(100% vs 90.5%)和胆管狭窄矫正率(98.2% vs 85.7%)方面优于传统手术<document id="2"></document>。术中超声在实时定位肝内微小结石(<5mm)中表现突出,但其单独应用受限于操作者经验,对复杂胆管解剖的整体评估不足<document id="6"></document>。 </div> <div class="content"> 国内研究中,三维可视化技术已广泛用于肝胆管结石的术前规划,如MI-3DVS软件可实现胆道系统的个体化重建,引导腹腔镜解剖性肝切除的结石清除率达100%<document id="3"></document><document id="4"></document>;术中超声联合胆道镜可提高复杂病例的结石取出率(93.3% vs 78.6%)<document id="8"></document>。但现有研究多聚焦单一技术的应用,对三维可视化与术中超声的联合评估、动态协同机制探讨不足,尤其缺乏对双侧肝胆管结石、合并肝萎缩病例的针对性分析<document id="35"></document><document id="39"></document>。 </div> <h2 class="level2">三、研究目的与内容</h2> <h2 class="level2" style="font-size:16pt">(一)研究目的</h2> <div class="content"> 1. 评估三维可视化联合术中超声在复杂肝胆管结石术前规划、术中定位及术后疗效中的应用价值;<br> 2. 比较联合技术与单一技术(三维可视化或术中超声)在手术指标(出血量、时间)、结石清除率及复发率中的差异;<br> 3. 建立基于联合技术的复杂肝胆管结石个体化诊疗流程。 </div> <h2 class="level2" style="font-size:16pt">(二)研究内容</h2> <div class="content"> 1. 病例选择:回顾性收集2022年1月至2024年1月80例复杂肝胆管结石患者,分为联合组(40例,三维可视化+术中超声)和对照组(40例,单一三维可视化或术中超声),纳入标准:结石分布≥2个肝段、合并胆管狭窄或肝萎缩<document id="24"></document><document id="31"></document>;<br> 2. 技术应用:联合组术前通过三维重建明确手术范围,术中超声实时验证结石清除情况及胆管通畅性;对照组采用单一技术引导手术<document id="4"></document><document id="38"></document>;<br> 3. 疗效评价:比较两组手术时间、术中出血量、结石清除率(术后1周CT/MRCP评估)、术后6个月复发率及并发症(胆瘘、胆管炎)发生率<document id="2"></document><document id="8"></document>。 </div> <h2 class="level2">四、研究方法与技术路线</h2> <h2 class="level2" style="font-size:16pt">(一)研究方法</h2> <div class="content"> 1. 三维重建:采用64排螺旋CT采集数据(层厚0.625mm),通过MI-3DVS软件进行肝脏、胆道、血管分割与重建,测量结石体积、胆管狭窄程度及拟切除肝段体积<document id="4"></document><document id="36"></document>;<br> 2. 术中超声:采用高频探头(5-10MHz)实时探查肝内结石、评估胆管直径及血流情况,重点验证三维重建显示的狭窄部位和血管走形<document id="38"></document><document id="41"></document>;<br> 3. 统计学分析:采用SPSS 26.0,计量资料以(x±s)表示,组间比较用t检验;计数资料以率表示,用χ²检验,P<0.05为差异有统计学意义。 </div> <h2 class="level2" style="font-size:16pt">(二)技术路线</h2> <div class="content"> 病例筛选→分组(联合组/对照组)→联合组:术前三维重建+术中超声引导手术;对照组:单一技术引导手术→术后1周评估结石清除率→术后3、6个月随访(复发率、并发症)→数据统计分析→结论 </div> <h2 class="level2">五、预期成果与创新点</h2> <h2 class="level2" style="font-size:16pt">(一)预期成果</h2> <div class="content"> 1. 明确三维可视化联合术中超声可提高复杂肝胆管结石的结石清除率(≥95%),降低复发率(<5%);<br> 2. 形成《三维可视化联合术中超声在复杂肝胆管结石中的应用指南》;<br> 3. 发表核心期刊论文2-3篇,申请实用新型专利1项。 </div> <h2 class="level2" style="font-size:16pt">(二)创新点</h2> <div class="content"> 1. 首次系统探讨三维可视化与术中超声的协同机制,弥补术前静态评估与术中动态验证的技术断层;<br> 2. 针对双侧肝胆管结石、合并肝萎缩等复杂病例,建立基于联合技术的个体化手术方案<document id="35"></document><document id="39"></document>。 </div> <h2 class="level2">六、参考文献</h2> <div class="reference">[1] Fang CH, et al. Outcomes of Hepatectomy for Hepatolithiasis Based on 3-Dimensional Reconstruction Technique. J Am Coll Surg, 2013, 217(2):280-288.<document id="2"></document></div> <div class="reference">[2] 王小方, 等. 三维可视化在解剖性肝切除治疗肝胆管结石中的应用效果. 中国当代医药, 2023, 30(6):59-62.<document id="3"></document></div> <div class="reference">[3] 范应方, 等. 3D技术在精准肝胆管结石外科诊治中的应用研究. 南方医科大学博士学位论文, 2021.<document id="4"></document></div> <div class="reference">[4] Zhang ZH, et al. Value of multidisciplinary team in minimally invasive treatment of complex intrahepatic bile duct stones. BioScience Trends, 2021, 15(3):161-170.<document id="8"></document></div> <div class="reference">[5] 三维可视化技术在腹腔镜解剖性肝切除治疗Ⅰ型肝胆管结石病中的应用. 中国普通外科杂志, 2022, 31(5):621-627.<document id="38"></document></div> <div class="reference">[6] 三维可视化技术在复杂肝胆管结石病中的应用研究. 中华外科杂志, 2020, 58(8):612-617.<document id="35"></document></div> <div class="reference">[7] Yang ZQ, et al. Application of three-dimensional visualization technology in early surgical repair of bile duct injury during laparoscopic cholecystectomy. BMC Surgery, 2024, 24:271.<document id="6"></document></div> <div class="reference">[8] 解剖性肝切除治疗复发性肝胆管结石病. 中华肝胆外科杂志, 2021, 27(3):176-179.<document id="31"></document></div> <div class="btn-container"> <a href="#" class="download-btn">下载Word文档</a> </div>直接运行,提供word下载按钮
07-28
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"> <title>黑马点评</title> <!-- 引入样式 --> <link rel="stylesheet" href="./css/element.css"> <link href="./css/blog-detail.css" rel="stylesheet"> <link href="./css/main.css" rel="stylesheet"> <style type="text/tailwindcss"> @layer utilities { .content-auto { content-visibility: auto; } .comment-input { @apply w-full min-h-[120px] border border-gray-300 text-lg leading-relaxed resize-none outline-none bg-white mb-3 px-4 py-3 rounded-lg transition-all duration-300; } .comment-input:focus { @apply border-primary ring-1 ring-primary/20; } .comment-input::placeholder { @apply text-gray-400; } .comment-box { @apply flex p-4 border-b border-gray-100; } .comment-icon { @apply w-10 h-10 rounded-full overflow-hidden mr-3 flex-shrink-0; } .comment-icon img { @apply w-full h-full object-cover; } .comment-user { @apply font-medium text-gray-800; } .comment-info { @apply flex-1; } .send-btn { @apply bg-primary hover:bg-primary/90 text-white px-6 py-2 rounded-full transition-all duration-300 disabled:opacity-50 disabled:cursor-not-allowed; } } </style> <style> .header { position: relative; } .foot-view span { font-size: 12px; } .liked { color: #ff6633; } /* 评论输入框样式 */ .comment-container { position: fixed; bottom: 0; left: 0; right: 0; height: 0; background-color: white; z-index: 150; display: flex; flex-direction: column; box-shadow: -2px -2px 10px rgba(0,0,0,0.05); transition: height 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); } .comment-container.active { height: 60%; /* 增加评论容器高度 */ } .comment-header { height: 56px; padding: 0 16px; display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid #E5E7EB; } .comment-header .cancel-btn { color: #6B7280; font-size: 16px; background: none; border: none; cursor: pointer; } .comment-header .send-btn { color: white; background-color: #FF7A00; border: 1px solid #FF7A00; /* 橙色边框 */ padding: 8px 16px; border-radius: 20px; font-size: 14px; font-weight: 500; transition: background-color 0.2s; } .comment-header .send-btn:hover { background-color: #FF6600; border-color: #FF6600; /* 悬停时边框颜色加深 */ } .comment-content { padding: 16px; display: flex; flex-direction: column; height: 100%; } /* 新增样式 */ .loading { display: flex; justify-content: center; align-items: center; height: 40px; color: #9CA3AF; } .empty-comment { text-align: center; padding: 20px 0; color: #9CA3AF; font-size: 14px; } .load-more { display: flex; justify-content: center; align-items: center; padding: 15px 0; color: #6B7280; font-size: 14px; cursor: pointer; } </style> </head> <body> <div id="app"> <div class="header"> <div class="header-back-btn" @click="goBack"><i class="el-icon-arrow-left"></i></div> <div class="header-title"></div> <div class="header-share">...</div> </div> <div style="height: 85%; overflow-y: scroll; overflow-x: hidden"> <div class="blog-info-box" ref="swiper" @touchstart="moveStart" @touchmove="moving" @touchend="moveEnd"> <div class="swiper-item" v-for="(img, i) in blog.images" :key="i"> <img :src="img" alt="" style="width: 100%" height="100%"> </div> </div> <div class="basic"> <div class="basic-icon" @click="toOtherInfo"> <img :src="blog.icon || &#39;/imgs/icons/default-icon.png&#39;" alt="用户头像"> </div> <div class="basic-info"> <div class="name">{{blog.name}}</div> <span class="time">{{formatTime(new Date(blog.createTime))}}</span> </div> <div style="width: 20%"> <div class="logout-btn" @click="follow" v-show="!user || user.id !== blog.userId "> {{followed ? &#39;取消关注&#39; : &#39;关注&#39;}} </div> </div> </div> <div class="blog-text" v-html="blog.content"> </div> <div class="shop-basic"> <div class="shop-icon"> <img :src="shop.image" alt="店铺图片"> </div> <div style="width: 80%"> <div class="name">{{shop.name}}</div> <div> <el-rate v-model="shop.score/10"> </el-rate> </div> <div class="shop-avg">¥{{shop.avgPrice}}/人</div> </div> </div> <div class="zan-box"> <div> <svg t="1646634642977" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2187" width="20" height="20"> <path d="M160 944c0 8.8-7.2 16-16 16h-32c-26.5 0-48-21.5-48-48V528c0-26.5 21.5-48 48-48h32c8.8 0 16 7.2 16 16v448zM96 416c-53 0-96 43-96 96v416c0 53 43 96 96 96h96c17.7 0 32-14.3 32-32V448c0-17.7-14.3-32-32-32H96zM505.6 64c16.2 0 26.4 8.7 31 13.9 4.6 5.2 12.1 16.3 10.3 32.4l-23.5 203.4c-4.9 42.2 8.6 84.6 36.8 116.4 28.3 31.7 68.9 49.9 111.4 49.9h271.2c6.6 0 10.8 3.3 13.2 6.1s5 7.5 4 14l-48 303.4c-6.9 43.6-29.1 83.4-62.7 112C815.8 944.2 773 960 728.9 960h-317c-33.1 0-59.9-26.8-59.9-59.9v-455c0-6.1 1.7-12 5-17.1 69.5-109 106.4-234.2 107-364h41.6z m0-64h-44.9C427.2 0 400 27.2 400 60.7c0 127.1-39.1 251.2-112 355.3v484.1c0 68.4 55.5 123.9 123.9 123.9h317c122.7 0 227.2-89.3 246.3-210.5l47.9-303.4c7.8-49.4-30.4-94.1-80.4-94.1H671.6c-50.9 0-90.5-44.4-84.6-95l23.5-203.4C617.7 55 568.7 0 505.6 0z" p-id="2188" :fill="blog.isLike ? &#39;#ff6633&#39; : &#39;#82848a&#39;"></path> </svg> </div> <div class="zan-list"> <div class="user-icon-mini" v-for="u in likes" :key="u.id"> <img :src="u.icon || &#39;/imgs/icons/default-icon.png&#39;" alt="点赞用户头像"> </div> <div style="margin-left:10px;text-align: center;line-height: 24px;">{{blog.liked}}人点赞</div> </div> </div> <div class="blog-divider"></div> <div class="blog-comments"> <div class="comments-head"> <div>网友评价 <span>{{totalComments}}条</span></div> <div @click="loadMoreComments" v-if="hasMore && !isLoading"> <i class="el-icon-arrow-right"></i> </div> <div v-else-if="isLoading"> <i class="el-icon-loading is-spinning"></i> 加载中... </div> <div v-else>没有更多评论了</div> </div> <!-- 加载状态 --> <div v-if="isLoading && comments.length === 0" class="loading"> <i class="el-icon-loading is-spinning"></i> <span>加载评论中...</span> </div> <!-- 空评论状态 --> <div v-else-if="comments.length === 0 && !isLoading" class="empty-comment"> 暂无评论,快来发表第一条评论吧 </div> <!-- 评论列表 --> <div class="comment-list" v-else> <div class="comment-box" v-for="comment in comments" :key="comment.id"> <div class="comment-icon"> <img :src="comment.icon || &#39;/imgs/icons/default-icon.png&#39;" alt="评论用户头像"> </div> <div class="comment-info"> <div class="comment-user"> {{comment.name}} <span v-if="comment.level">Lv{{comment.level}}</span> </div> <div style="padding: 5px 0; font-size: 14px"> {{comment.content}} </div> <div style="display: flex; justify-content: space-between; align-items: center; margin-top: 5px; color: #999;"> <div>{{formatCommentTime(comment.createTime)}}</div> </div> </div> </div> <!-- 加载更多按钮 --> <div v-if="hasMore && !isLoading" class="load-more" @click="loadMoreComments"> 查看更多评论 <i class="el-icon-arrow-down"></i> </div> </div> </div> <div class="blog-divider"></div> </div> <div class="foot"> <div class="foot-box"> <div class="foot-view" @click="addLike()"> <svg t="1646634642977" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2187" width="26" height="26"> <path d="M160 944c0 8.8-7.2 16-16 16h-32c-26.5 0-48-21.5-48-48V528c0-26.5 21.5-48 48-48h32c8.8 0 16 7.2 16 16v448zM96 416c-53 0-96 43-96 96v416c0 53 43 96 96 96h96c17.7 0 32-14.3 32-32V448c0-17.7-14.3-32-32-32H96zM505.6 64c16.2 0 26.4 8.7 31 13.9 4.6 5.2 12.1 16.3 10.3 32.4l-23.5 203.4c-4.9 42.2 8.6 84.6 36.8 116.4 28.3 31.7 68.9 49.9 111.4 49.9h271.2c6.6 0 10.8 3.3 13.2 6.1s5 7.5 4 14l-48 303.4c-6.9 43.6-29.1 83.4-62.7 112C815.8 944.2 773 960 728.9 960h-317c-33.1 0-59.9-26.8-59.9-59.9v-455c0-6.1 1.7-12 5-17.1 69.5-109 106.4-234.2 107-364h41.6z m0-64h-44.9C427.2 0 400 27.2 400 60.7c0 127.1-39.1 251.2-112 355.3v484.1c0 68.4 55.5 123.9 123.9 123.9h317c122.7 0 227.2-89.3 246.3-210.5l47.9-303.4c7.8-49.4-30.4-94.1-80.4-94.1H671.6c-50.9 0-90.5-44.4-84.6-95l23.5-203.4C617.7 55 568.7 0 505.6 0z" p-id="2188" :fill="blog.isLike ? &#39;#ff6633&#39; : &#39;#82848a&#39;"></path> </svg> <span :class="{liked: blog.isLike}">{{blog.liked}}</span> </div> </div> <div style="width: 40%"> </div> <div class="foot-box"> <div class="foot-view" @click="showCommentBox"> <i class="el-icon-chat-square"></i> </div> </div> </div> <!-- 评论输入框 --> <div class="comment-container" ref="commentContainer"> <div class="comment-header"> <button class="cancel-btn" @click="hideCommentBox">取消</button> <h3>评论</h3> <button class="send-btn" @click="sendComment" :disabled="!commentText.trim()">发送</button> </div> <div class="comment-content"> <textarea class="comment-input" v-model="commentText" placeholder="输入评论内容..." ref="commentInput"></textarea> </div> </div> </div> <script src="./js/vue.js"></script> <script src="./js/axios.min.js"></script> <!-- 引入组件库 --> <script src="./js/element.js"></script> <script src="./js/common.js"></script> <script> let each = function (ary, callback) { for (let i = 0, l = ary.length; i < l; i++) { if (callback(ary[i], i) === false) break } } const app = new Vue({ el: "#app", data: { util, blog: {}, shop: {}, likes: [], user: {}, // 登录用户 followed: false, // 是否关注了 _width: 0, duration: 300, container: null, items: [], active: 0, start: { x: 0, y: 0 }, move: { x: 0, y: 0 }, sensitivity: 60, resistance: 0.3, commentText: &#39;&#39;, // 评论内容 commentContainer: null, // 评论相关数据 comments: [], // 当前页评论列表 totalComments: 0, // 评论总数 currentPage: 1, // 当前页码 pageSize: 10, // 每页大小 hasMore: false, // 是否有更多数据 isLoading: false, // 是否正在加载 }, created() { let id = util.getUrlParam("id"); this.queryBlogById(id); this.fetchComments(id); }, mounted() { this.commentContainer = this.$refs.commentContainer; }, methods: { init() { // 获得父容器节点 this.container = this.$refs.swiper // 获得所有的子节点 this.items = this.container.querySelectorAll(&#39;.swiper-item&#39;) this.updateItemWidth() this.setTransform() this.setTransition(&#39;none&#39;) }, goBack() { history.back(); }, toOtherInfo(){ if(this.blog.userId === this.user.id){ location.href = "/info.html" }else{ location.href = "/other-info.html?id=" + this.blog.userId } }, queryBlogById(id) { axios.get("/blog/" + id) .then(({data}) => { data.images = data.images.split(",") this.blog = data; this.$nextTick(this.init); this.queryShopById(data.shopId) this.queryLikeList(id); this.queryLoginUser(); }) .catch(this.$message.error) }, queryShopById(shopId) { axios.get("/shop/" + shopId) .then(({data}) => { data.image = data.images.split(",")[0] this.shop = data }) .catch(this.$message.error) }, queryLikeList(id){ axios.get("/blog/likes/" + id) .then(({data}) => this.likes = data) .catch(this.$message.error) }, addLike(){ axios.put("/blog/like/" +this.blog.id) .then(({data}) => { axios.get("/blog/" + this.blog.id) .then(({data}) => { data.images = data.images.split(",") this.blog = data; this.queryLikeList(this.blog.id); }) .catch(this.$message.error) }) .catch(err => { this.$message.error(err) }) }, isFollowed(){ axios.get("/follow/or/not/" + this.blog.userId) .then(({data}) => this.followed = data) .catch(this.$message.error) }, follow(){ axios.put("/follow/" + this.blog.userId + "/" + !this.followed) .then(() => { this.$message.success(this.followed ? "已取消关注" : "已关注") this.followed = !this.followed }) .catch(this.$message.error) }, formatTime(b) { return b.getFullYear() + "年" + (b.getMonth() + 1) + "月" + b.getDate() + "日 "; }, formatMinutes(m) { if (m < 10) m = "0" + m return m; }, queryLoginUser(){ // 查询用户信息 axios.get("/user/me") .then(({ data }) => { // 保存用户 this.user = data; if(this.user.id !== this.blog.userId){ this.isFollowed(); } }) .catch(console.log) }, // 轮播图相关方法 updateItemWidth() { this._width = this.container.offsetWidth || document.documentElement.offsetWidth }, setTransform(offset) { offset = offset || 0 each(this.items, (item, i) => { let distance = (i - this.active) * this._width + offset let transform = `translate3d(${distance}px, 0, 0)` item.style.webkitTransform = transform item.style.transform = transform }) }, setTransition(duration) { duration = duration || this.duration duration = typeof duration === &#39;number&#39; ? (duration + &#39;ms&#39;) : duration each(this.items, (item) => { item.style.webkitTransition = duration item.style.transition = duration }) }, moveStart(e) { this.start.x = e.changedTouches[0].pageX this.start.y = e.changedTouches[0].pageY this.setTransition(&#39;none&#39;) }, moving(e) { e.preventDefault() e.stopPropagation() let distanceX = e.changedTouches[0].pageX - this.start.x let distanceY = e.changedTouches[0].pageY - this.start.y if (Math.abs(distanceX) > Math.abs(distanceY)) { this.isMoving = true this.move.x = this.start.x + distanceX this.move.y = this.start.y + distanceY if ((this.active === 0 && distanceX > 0) || (this.active === (this.items.length - 1) && distanceX < 0)) { distanceX = distanceX * this.resistance } this.setTransform(distanceX) } }, moveEnd(e) { if (this.isMoving) { e.preventDefault() e.stopPropagation() let distance = this.move.x - this.start.x if (Math.abs(distance) > this.sensitivity) { if (distance < 0) { this.next() } else { this.prev() } } else { this.back() } this.reset() this.isMoving = false; } }, next() { let index = this.active + 1 this.go(index) }, prev() { let index = this.active - 1 this.go(index) }, reset() { this.start.x = 0 this.start.y = 0 this.move.x = 0 this.move.y = 0 }, back() { this.setTransition() this.setTransform() }, destroy() { this.setTransition(&#39;none&#39;) }, go(index) { this.active = index if (this.active < 0) { this.active = 0 } else if (this.active > this.items.length - 1) { this.active = this.items.length - 1 } this.$emit(&#39;change&#39;, this.active) this.setTransition() this.setTransform() }, // 评论相关方法 showCommentBox() { if (!this.user.id) { this.$message.warning("请先登录"); return; } this.commentContainer.classList.add(&#39;active&#39;); setTimeout(() => { this.$refs.commentInput.focus(); }, 300); }, hideCommentBox() { this.commentContainer.classList.remove(&#39;active&#39;); this.commentText = &#39;&#39;; }, sendComment() { const content = this.commentText.trim(); if (content) { // 使用FormData格式,与后端接口参数匹配 const formData = new FormData(); formData.append(&#39;comment&#39;, content); formData.append(&#39;blogId&#39;, this.blog.id); axios.post("/blog-comments", formData) .then(() => { this.$message.success("评论发送成功"); this.hideCommentBox(); this.commentText = &#39;&#39;; // 刷新第一页评论 this.fetchComments(this.blog.id, 1); }) .catch(err => { this.$message.error("评论发送失败: " + err.response?.data?.message || err.message); console.error(err); }); } else { this.$message.warning("请输入评论内容"); } }, // 获取评论列表 - 适配后端分页接口 fetchComments(blogId, page = 1) { // 如果是加载第一页,清空现有评论 if (page === 1) { this.comments = []; } this.isLoading = true; axios.get(`/blog-comments/${blogId}`, { params: { page: page, size: this.pageSize } }) .then((response) => { // 确保响应数据存在 if (!response.data) { this.$message.warning("评论数据为空"); this.hasMore = false; this.isLoading = false; return; } const pageResult = response.data; // 验证必要字段存在 if (pageResult.records === undefined || pageResult.totalRecords === undefined) { this.$message.warning("评论数据格式异常,缺少必要字段"); this.hasMore = false; this.isLoading = false; return; } // 更新评论列表 if (page === 1) { this.comments = pageResult.records || []; } else { this.comments = [...this.comments, ...(pageResult.records || [])]; } // 更新分页信息 this.totalComments = pageResult.totalRecords || 0; this.currentPage = pageResult.currentPage || page; this.pageSize = pageResult.pageSize || this.pageSize; // 判断是否还有更多数据 this.hasMore = this.comments.length < this.totalComments; }) .catch(err => { this.$message.error(&#39;评论加载失败: &#39; + err.response?.data?.message || &#39;网络错误&#39;); console.error(err); }) .finally(() => { this.isLoading = false; }); }, // 加载更多评论 loadMoreComments() { if (!this.isLoading && this.hasMore) { this.fetchComments(this.blog.id, this.currentPage + 1); } }, // 格式化评论时间(最终修复版) formatCommentTime(timestamp) { if (!timestamp) return &#39;&#39;; // 尝试将时间戳转换为数字 let timeValue; // 处理字符串类型的时间戳 if (typeof timestamp === &#39;string&#39;) { // 移除所有非数字字符 const cleanTimestamp = timestamp.replace(/[^\d]/g, &#39;&#39;); // 如果清理后为空字符串,尝试其他解析方法 if (!cleanTimestamp) { // 尝试直接解析原始字符串 try { timeValue = Number(timestamp); } catch (e) { console.error(&#39;Failed to parse timestamp:&#39;, timestamp); return &#39;未知时间&#39;; } } else { timeValue = Number(cleanTimestamp); } } else if (typeof timestamp === &#39;number&#39;) { timeValue = timestamp; } else { console.error(&#39;Unsupported timestamp type:&#39;, typeof timestamp); return &#39;未知时间&#39;; } // 验证转换后的时间戳是否为有效数字 if (isNaN(timeValue)) { console.error(&#39;Invalid timestamp value:&#39;, timestamp); return &#39;未知时间&#39;; } // 处理零值或负值时间戳 if (timeValue <= 0) { return &#39;未知时间&#39;; } // 根据时间戳范围智能判断(优化处理超长时间戳) let commentDate; // 特殊处理:如果时间戳大于当前时间的2倍,可能是前端时间戳生成问题 const currentTime = Date.now(); if (timeValue > currentTime * 2) { // 尝试将超长时间戳除以10的幂,直到合理范围 let adjustedTimestamp = timeValue; while (adjustedTimestamp > currentTime * 2 && adjustedTimestamp > 1e15) { adjustedTimestamp = Math.floor(adjustedTimestamp / 10); } // 使用调整后的时间戳 commentDate = new Date(adjustedTimestamp); } else { // 默认作为毫秒级时间戳处理 commentDate = new Date(timeValue); } // 验证日期有效性 if (isNaN(commentDate.getTime())) { console.error(&#39;Invalid date from timestamp:&#39;, timestamp); return &#39;未知时间&#39;; } // 计算与当前时间的差值(毫秒) const now = new Date(); const diffMs = now - commentDate; // 处理未来时间(diffMs为负数) if (diffMs < 0) { // 未来时间显示完整日期 return commentDate.toISOString().slice(0, 10); } // 计算差值(分钟、小时、天) const diffMinutes = Math.floor(diffMs / 60000); const diffHours = Math.floor(diffMs / 3600000); const diffDays = Math.floor(diffMs / 86400000); // 相对时间显示 if (diffMinutes < 1) return &#39;刚刚&#39;; if (diffMinutes < 60) return `${diffMinutes}分钟前`; if (diffHours < 24) return `${diffHours}小时前`; if (diffDays < 7) return `${diffDays}天前`; // 超过7天,显示完整日期 return commentDate.toISOString().slice(0, 10); } } }) </script> </body> </html>时间显示错了,传进来的"createTime": 1749989266662,后端System.currentTimeMillis()产生的,时间显示错了
06-16
“Error while preparing statement [SELECT loc.CWMS仓号, loc.物料大类, loc.CWMS仓名, loc.板数, stock.物料编码, stock.lpn, stock.现有量, stock.库龄, stock.仓库名称, stock.超期日期, TRY_CAST(stock.超期日期 AS TIMESTAMP) AS 超期日期_安全转换, /* STR_TO_DATE(stock.超期日期, &#39;%Y-%m-%d %H:%i:%s.%f&#39;) AS 超期日期_日期格式,*/ lpn.仓库已用栈板数, ROUND(CAST(lpn.仓库已用栈板数 AS FLOAT) / loc.板数 * 100, 2) AS 仓库场地利用率百分比, /*DATEDIFF(DAY, GETDATE(), stock.超期日期) AS 当前天数差, CASE WHEN DATEDIFF(stock.超期日期, CURDATE()) > 30 THEN &#39;未超期&#39; WHEN DATEDIFF(stock.超期日期, CURDATE()) BETWEEN 7 AND 30 THEN &#39;即将超期&#39; ELSE &#39;已超期&#39; END AS 超期分类*/ /* lpn.库龄分类30天内栈板数, lpn.库龄分类30到90天栈板数, lpn.库龄分类90天以上栈板数, ROUND(CAST(lpn.仓库已用栈板数 AS FLOAT) / loc.板数 * 100, 2) AS 仓库场地利用率百分比, ROUND(CAST(lpn.库龄分类30天内栈板数 AS FLOAT) / lpn.仓库已用栈板数 * 100, 2) AS 库龄30天内占比百分比, ROUND(CAST(lpn.库龄分类30到90天栈板数 AS FLOAT) / lpn.仓库已用栈板数 * 100, 2) AS 库龄30到90天占比百分比, ROUND(CAST(lpn.库龄分类90天以上栈板数 AS FLOAT) / lpn.仓库已用栈板数 * 100, 2) AS 库龄90天以上占比百分比, */ CASE WHEN stock.库龄 <= 30 THEN &#39;30天内&#39; WHEN stock.库龄 > 30 AND stock.库龄 <= 90 THEN &#39;30天到90天&#39; ELSE &#39;90天以上&#39; END AS 库龄分类 FROM file_cwmscode_slw AS loc LEFT JOIN cwms3_inv_zszp_v AS stock ON loc.CWMS仓号=stock.仓库编码 LEFT JOIN (SELECT 仓库编码, COUNT(DISTINCT lpn) AS 仓库已用栈板数 FROM cwms3_inv_zszp_v GROUP by 仓库编码) AS lpn ON loc.CWMS仓号=lpn.仓库编码 /*LEFT JOIN ( SELECT 仓库编码, COUNT(DISTINCT lpn) AS 仓库已用栈板数, COUNT(DISTINCT CASE WHEN 库龄 <= 30 THEN lpn END) AS 库龄分类30天内栈板数, COUNT(DISTINCT CASE WHEN 库龄 > 30 AND 库龄 <= 90 THEN lpn END) AS 库龄分类30到90天栈板数, COUNT(DISTINCT CASE WHEN 库龄 > 90 THEN lpn END) AS 库龄分类90天以上栈板数 FROM cwms3_inv_zszp_v GROUP BY 仓库编码) AS lpn ON loc.CWMS仓号 = lpn.仓库编码 */ WHERE lpn.仓库已用栈板数 IS NOT NULL ]”cdjd.com.dremio.exec.rpc.RpcException: cdjd.com.dremio.common.exceptions.UserRemoteException: SYSTEM ERROR: DataServiceRunTimeException: Encountered unexpected token: "(" "(" at line 1, column 166. Was expecting one of: "&" "," "::" ";" "<<" ">>" "ACTION" "ANY" "AS" "BYTE" "CASCADE" "CAST" "CHANGE" "CHAR" "CHARACTER" "COLLATE" "COLUMN" "COLUMNS" "COMMENT" "COMMIT" "CONNECT" "CYCLE" "DESC" "DESCRIBE" "DISABLE" "DIV" "DO" "DUPLICATE" "ENABLE" "END" "EXCEPT" "EXCLUDE" "EXTRACT" "FALSE" "FIRST" "FN" "FOLLOWING" "FOR" "FORMAT" "FROM" "GROUP" "HAVING" "INDEX" "INSERT" "INTERSECT" "INTERVAL" "INTO" "ISNULL" "KEY" "LAST" "MATERIALIZED" "MINUS" "NEXTVAL" "NO" "NOLOCK" "NULLS" "OF" "OPEN" "ORDER" "OVER" "PARTITION" "PATH" "PERCENT" "PRECISION" "PRIMARY" "PRIOR" "RANGE" "READ" "REPLACE" "ROW" "ROWS" "SCHEMA" "SEPARATOR" "SEQUENCE" "SESSION" "SIBLINGS" "SIZE" "START" "TABLE" "TEMP" "TEMPORARY" "TO" "TOP" "TRUE" "TRUNCATE" "TYPE" "UNION" "UNSIGNED" "VALIDATE" "VALUE" "VALUES" "VIEW" "WHERE" "WINDOW" "XML" "ZONE" "[" "^" "|" [Error Id: a9633218-022b-459e-b76c-4e46bb2fba6f on :0] (cdjd.com.dremio.exec.rpc.UserRpcException) com.huawei.roma.data.service.common.exception.DataServiceRunTimeException: Encountered unexpected token: "(" "(" at line 1, column 166. Was expecting one of: "&" "," "::" ";" "<<" ">>" "ACTION" "ANY" "AS" "BYTE" "CASCADE" "CAST" "CHANGE" "CHAR" "CHARACTER" "COLLATE" "COLUMN" "COLUMNS" "COMMENT" "COMMIT" "CONNECT" "CYCLE" "DESC" "DESCRIBE" "DISABLE" "DIV" "DO" "DUPLICATE" "ENABLE" "END" "EXCEPT" "EXCLUDE" "EXTRACT" "FALSE" "FIRST" "FN" "FOLLOWING" "FOR" "FORMAT" "FROM" "GROUP" "HAVING" "INDEX" "INSERT" "INTERSECT" "INTERVAL" "INTO" "ISNULL" "KEY" "LAST" "MATERIALIZED" "MINUS" "NEXTVAL" "NO" "NOLOCK" "NULLS" "OF" "OPEN" "ORDER" "OVER" "PARTITION" "PATH" "PERCENT" "PRECISION" "PRIMARY" "PRIOR" "RANGE" "READ" "REPLACE" "ROW" "ROWS" "SCHEMA" "SEPARATOR" "SEQUENCE" "SESSION" "SIBLINGS" "SIZE" "START" "TABLE" "TEMP" "TEMPORARY" "TO" "TOP" "TRUE" "TRUNCATE" "TYPE" "UNION" "UNSIGNED" "VALIDATE" "VALUE" "VALUES" "VIEW" "WHERE" "WINDOW" "XML" "ZONE" "[" "^" "|" com.huawei.roma.data.service.worker.proxy.InboundHandler.lambda$decode$0():113 java.util.concurrent.Executors$RunnableAdapter.call():511 java.util.concurrent.FutureTask.run():266 java.util.concurrent.ThreadPoolExecutor.runWorker():1142 java.util.concurrent.ThreadPoolExecutor$Worker.run():617 java.lang.Thread.run():745 Caused By (com.huawei.roma.data.service.common.exception.DataServiceRunTimeException) Encountered unexpected token: "(" "(" at line 1, column 166. Was expecting one of: "&" "," "::" ";" "<<" ">>" "ACTION" "ANY" "AS" "BYTE" "CASCADE" "CAST" "CHANGE" "CHAR" "CHARACTER" "COLLATE" "COLUMN" "COLUMNS" "COMMENT" "COMMIT" "CONNECT" "CYCLE" "DESC" "DESCRIBE" "DISABLE" "DIV" "DO" "DUPLICATE" "ENABLE" "END" "EXCEPT" "EXCLUDE" "EXTRACT" "FALSE" "FIRST" "FN" "FOLLOWING" "FOR" "FORMAT" "FROM" "GROUP" "HAVING" "INDEX" "INSERT" "INTERSECT" "INTERVAL" "INTO" "ISNULL" "KEY" "LAST" "MATERIALIZED" "MINUS" "NEXTVAL" "NO" "NOLOCK" "NULLS" "OF" "OPEN" "ORDER" "OVER" "PARTITION" "PATH" "PERCENT" "PRECISION" "PRIMARY" "PRIOR" "RANGE" "READ" "REPLACE" "ROW" "ROWS" "SCHEMA" "SEPARATOR" "SEQUENCE" "SESSION" "SIBLINGS" "SIZE" "START" "TABLE" "TEMP" "TEMPORARY" "TO" "TOP" "TRUE" "TRUNCATE" "TYPE" "UNION" "UNSIGNED" "VALIDATE" "VALUE" "VALUES" "VIEW" "WHERE" "WINDOW" "XML" "ZONE" "[" "^" "|" com.huawei.roma.data.service.worker.jdbc.RepoService.handleSql():563 com.huawei.roma.data.service.worker.proxy.InboundHandler.checkSql():224 com.huawei.roma.data.service.worker.proxy.InboundHandler.feedWork():190 com.huawei.roma.data.service.worker.proxy.InboundHandler.lambda$decode$0():109 java.util.concurrent.Executors$RunnableAdapter.call():511 java.util.concurrent.FutureTask.run():266 java.util.concurrent.ThreadPoolExecutor.runWorker():1142 java.util.concurrent.ThreadPoolExecutor$Worker.run():617 java.lang.Thread.run():745 报错
07-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值