feat: 品牌升级(知冶→战知) + 应用工具广场重构 + 新增工具集成
品牌升级: - 全站品牌从"知冶"更名为"战知" - 更换 favicon、侧边栏 logo、登录页 logo - 更新登录页标语和首页欢迎语 应用广场重构: - 从后端数据库驱动改为前端静态配置,按分类 tab 展示 - 新增工具卡片 UI,支持 logo 图片和 emoji 图标 新增工具部署: - Stirling PDF (端口18080) - PDF 处理工具箱 - Excalidraw (端口18081) - 手绘风格白板,集成 AI 绘图 - TrWebOCR (端口18083) - 中文离线 OCR - LibreTranslate (端口18084) - 中英翻译引擎 - PPTist (端口18085) - 在线 PPT 编辑器 - PPTist AI 后端 (端口18086) - 对接 deepseek-v3 生成大纲/PPT/写作 - Excalidraw AI 代理 (端口18082) - 对接 deepseek-v3 生成 Mermaid 图 其他: - 智能场景仅保留"选题推荐" - vite 代理配置增加 /pdf/ 和 /draw/ 路由 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@@ -1,6 +1,6 @@
|
||||
# 知冶大模型
|
||||
# 战知
|
||||
|
||||
知冶大模型
|
||||
战知智能问答平台
|
||||
|
||||
# chat_web_front_new
|
||||
|
||||
|
||||
@@ -3,10 +3,10 @@
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="icon" href="/favicon.png">
|
||||
<link rel="apple-touch-icon" href="/favicon.png">
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||
<link rel="apple-touch-icon" href="/favicon.svg">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>知冶·大模型</title>
|
||||
<title>战知</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
13
chat_web_front/public/favicon.svg
Normal file
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="_图层_2" data-name="图层 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 31.79 26.46">
|
||||
<g id="_图层_1-2" data-name="图层 1">
|
||||
<g>
|
||||
<path d="M4.91,6.25c.18,0,.74-.6,.87-.71,.17,0,.65-.53,.79-.65,.32-.26,.63-.52,.95-.78,.56-.46,1.12-.92,1.69-1.38,.15,0,.72,1.25,.84,1.45,.45,.78,.9,1.56,1.35,2.35l-1.69,1.36c-1.6-.55-3.19-1.1-4.79-1.65Z"/>
|
||||
<path d="M13.06,5.43c-.5-1.29,.38-3.57,1.27-4.51C15.49-.3,17.51,0,19.03,.14c0,0-2.48,2.93-3.55,5.08-.82-.01-1.63,.02-2.42,.21Z"/>
|
||||
<path d="M17.66,4.96L25.6,.8s2.68,1.49,3.63,2.72c-1.4,.41-9.1,2.6-9.37,2.77-.88-.55-2.2-1.33-2.2-1.33Z"/>
|
||||
<polygon points="20.85 7.78 31.75 7.86 31.79 12.24 20.74 9.98 20.85 7.78"/>
|
||||
<path d="M19.56,13.33c-.17,0-.29,.12-.57,.33-.62,.47-1.24,.94-1.86,1.41,1.64,1.94,3.21,3.94,4.81,5.91,.62,.77,1.23,1.55,1.87,2.3,.97-.59,1.7-1.47,2.6-2.15,.32-.25,1.43-.76,1.45-1.22,0-.13-.86-.71-.99-.82-.42-.34-.84-.69-1.26-1.03-1.49-1.22-2.97-2.43-4.47-3.63-.4-.32-.81-.71-1.25-.98-.14-.08-.24-.12-.32-.13Z"/>
|
||||
<path d="M14.11,26.46l-.16-17.73c0-.06-2.36,.1-2.45,.11-1.79,.15-3.65,.33-5.45,.55-1.43,.18-3.03,.26-4.27,1.12C.46,11.43-.13,13.17,.02,14.73l.17,.55s3.27-1.55,3.58-1.7c.63-.3,1.26-.58,1.9-.84,.54-.22,1.32-.65,1.9-.64-.17,.37-.57,.73-.84,1.05l-1.51,1.81-3.24,3.89c-.48,.57-1.02,.92-.79,1.69,.43,1.47,1.54,2.63,2.77,3.5,1.21-1.91,4.39-7.62,6.15-10.35l-.89,12.76h4.89Z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
@@ -23,17 +23,25 @@ watch(
|
||||
.content {
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
// background: linear-gradient(180deg, #edf2ff 0%, #f7f9ff 100%),
|
||||
// url("./assets/images/chat/chatLogo.png") no-repeat;
|
||||
background-color: #edf2ffcc;
|
||||
background-image: url("./assets/images/chat/chatLogo.png");
|
||||
background-size: 45%;
|
||||
background-position: right bottom;
|
||||
background-blend-mode: unset;
|
||||
background-repeat: no-repeat;
|
||||
// background-size: 45%;
|
||||
// background-position: right bottom;
|
||||
position: relative;
|
||||
display: flex;
|
||||
|
||||
&::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background-image: url("./assets/images/chat/chatLogo.svg");
|
||||
background-size: 45%;
|
||||
background-position: right bottom;
|
||||
background-repeat: no-repeat;
|
||||
opacity: 0.04;
|
||||
pointer-events: none;
|
||||
z-index: 0;
|
||||
}
|
||||
.chatLogo {
|
||||
width: 764px;
|
||||
height: 700px;
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="1000">
|
||||
<rect width="1000" height="1000" rx="200" ry="200" fill="#fff" />
|
||||
<svg viewBox="0 0 107 101" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2">
|
||||
<path style="fill:none" d="M24 17h121v121H24z" transform="matrix(.8843 0 0 .83471 -21.223 -14.19)" />
|
||||
<path d="M119.81 105.98a.549.549 0 0 0-.53-.12c-4.19-6.19-9.52-12.06-14.68-17.73l-.85-.93c0-.11-.05-.21-.12-.3a.548.548 0 0 0-.34-.2l-.17-.18-.12-.09c-.15-.32-.53-.56-.95-.35-1.58.81-3 1.97-4.4 3.04-1.87 1.43-3.7 2.92-5.42 4.52-.7.65-1.39 1.33-1.97 2.09-.28.37-.07.72.27.87-1.22 1.2-2.45 2.45-3.68 3.74-.11.12-.17.28-.16.44.01.16.09.31.22.41l2.16 1.65s.01.03.03.04c3.09 3.05 8.51 7.28 14.25 11.76.85.67 1.71 1.34 2.57 2.01.39.47.76.94 1.12 1.4.19.25.55.3.8.11.13.1.26.21.39.31a.57.57 0 0 0 .8-.1c.07-.09.1-.2.11-.31.04 0 .07.03.1.03.15 0 .31-.06.42-.18l10.18-11.12a.56.56 0 0 0-.04-.8l.01-.01Zm-29.23-3.85c.07.09.14.17.21.25 1.16.98 2.4 2.04 3.66 3.12l-5.12-3.91s-.32-.22-.52-.36c-.11-.08-.21-.16-.31-.24l-.38-.32s.07-.07.1-.11l.35-.35c1.72-1.74 4.67-4.64 6.19-6.06-1.61 1.62-4.87 6.37-4.17 7.98h-.01Zm17.53 13.81-4.22-3.22c-1.65-1.71-3.43-3.4-5.24-5.03 2.28 1.76 4.23 3.25 4.52 3.51 2.21 1.97 2.11 1.61 3.63 2.91l1.83 1.33c-.18.16-.36.33-.53.49l.01.01Zm1.06.81-.08-.06c.16-.13.33-.25.49-.38l-.4.44h-.01ZM42.24 51.45c.14.72.27 1.43.4 2.11.69 3.7 1.33 7.03 2.55 9.56l.48 1.92c.19.73.46 1.64.71 1.83 2.85 2.52 7.22 6.28 11.89 9.82.21.16.5.15.7-.01.01.02.03.03.04.04.11.1.24.15.38.15.16 0 .31-.06.42-.19 5.98-6.65 10.43-12.12 13.6-16.7.2-.25.3-.54.29-.84.2-.24.41-.48.6-.68a.558.558 0 0 0-.1-.86.578.578 0 0 0-.17-.36c-1.39-1.34-2.42-2.31-3.46-3.28-1.84-1.72-3.74-3.5-7.77-7.51-.02-.02-.05-.04-.07-.06a.555.555 0 0 0-.22-.14c-1.11-.39-3.39-.78-6.26-1.28-4.22-.72-10-1.72-15.2-3.27h-.04v-.01s-.02 0-.03.02h-.01l.04-.02s-.31.01-.37.04c-.08.04-.14.09-.19.15-.05.06-.09.12-.47.2-.38.08.08 0 .11 0h-.11v.03c.07.34.05.58.16.97-.02.1.21 1.02.24 1.11l1.83 7.26h.03Zm30.95 6.54s-.03.04-.04.05l-.64-.71c.22.21.44.42.68.66Zm-7.09 9.39s-.07.08-.1.12l-.02-.02c.04-.03.08-.07.13-.1h-.01Zm-7.07 8.47Zm3.02-28.57c.35.35 1.74 1.65 2.06 1.97-1.45-.66-5.06-2.34-6.74-2.88 1.65.29 3.93.66 4.68.91Zm-19.18-2.77c.84 1.44 1.5 6.49 2.16 11.4-.37-1.58-.69-3.12-.99-4.6-.52-2.56-1-4.85-1.67-6.88.14.01.31.03.49.05 0 .01 0 .02.02.03h-.01Zm-.29-1.21c-.23-.02-.44-.04-.62-.05-.02-.04-.03-.08-.04-.12l.66.18v-.01Zm-2.22.45v-.02.02ZM118.9 42.57c.04-.23-1.1-1.24-.74-1.26.85-.04.86-1.35 0-1.31-1.13.06-2.27.32-3.37.53-1.98.37-3.95.78-5.92 1.21-4.39.94-8.77 1.93-13.1 3.11-1.36.37-2.86.7-4.11 1.36-.42.22-.4.67-.17.95-.09.05-.18.08-.28.09-.37.07-.74.13-1.11.19a.566.566 0 0 0-.39.86c-2.32 3.1-4.96 6.44-7.82 9.95-2.81 3.21-5.73 6.63-8.72 10.14-9.41 11.06-20.08 23.6-31.9 34.64-.23.21-.24.57-.03.8.05.06.12.1.19.13-.16.15-.32.3-.48.44-.1.09-.14.2-.16.32-.08.08-.16.17-.23.25-.21.23-.2.59.03.8.23.21.59.2.8-.03.04-.04.08-.09.12-.13a.84.84 0 0 1 1.22 0c.69.74 1.34 1.44 1.95 2.09l-1.38-1.15a.57.57 0 0 0-.8.07c-.2.24-.17.6.07.8l14.82 12.43c.11.09.24.13.37.13.15 0 .29-.06.4-.17l.36-.36a.56.56 0 0 0 .63-.12c20.09-20.18 36.27-35.43 54.8-49.06.17-.12.25-.32.23-.51a.57.57 0 0 0 .48-.39c3.42-10.46 4.08-19.72 4.28-24.27 0-.03.01-.05.02-.07.02-.05.03-.1.04-.14.03-.11.05-.19.05-.19.26-.78.17-1.53-.15-2.15v.02ZM82.98 58.94c.9-1.03 1.79-2.04 2.67-3.02-5.76 7.58-15.3 19.26-28.81 33.14 9.2-10.18 18.47-20.73 26.14-30.12Zm-32.55 52.81-.03-.03c.11.02.19.04.2.04a.47.47 0 0 0-.17 0v-.01Zm6.9 6.42-.05-.04.03-.03c.02 0 .03.02.04.02 0 .02-.02.03-.03.05h.01Zm8.36-7.21 1.38-1.44c.01.01.02.03.03.05-.47.46-.94.93-1.42 1.39h.01Zm2.24-2.21c.26-.3.56-.65.87-1.02.01-.01.02-.03.04-.04 3.29-3.39 6.68-6.82 10.18-10.25.02-.02.05-.04.07-.06.86-.66 1.82-1.39 2.72-2.08-4.52 4.32-9.11 8.78-13.88 13.46v-.01Zm21.65-55.88c-1.86 2.42-3.9 5.56-5.63 8.07-5.46 7.91-23.04 27.28-23.43 27.65-2.71 2.62-10.88 10.46-16.09 15.37-.14.13-.25.24-.34.35a.794.794 0 0 1 .03-1.13c24.82-23.4 39.88-42.89 46-51.38-.13.33-.24.69-.55 1.09l.01-.02Zm16.51 7.1-.01.02c0-.02-.02-.07.01-.02Zm-.91-5.13Zm-5.89 9.45c-2.26-1.31-3.32-3.27-2.71-5.25l.19-.66c.08-.19.17-.38.28-.57.59-.98 1.49-1.85 2.52-2.36.05-.02.1-.03.15-.04a.795.795 0 0 1-.04-.43c.05-.31.25-.58.66-.58.67 0 2.75.62 3.54 1.3.24.19.47.4.68.63.3.35.74.92.96 1.33.13.06.23.62.38.91.14.46.2.93.18 1.4 0 .02 0 .02.01.03-.03.07 0 .37-.04.4-.1.72-.36 1.43-.75 2.05-.04.05-.07.11-.11.16 0 .01-.02.02-.03.04-.3.43-.65.83-1.08 1.13-1.26.89-2.73 1.16-4.2.79a6.33 6.33 0 0 1-.57-.25l-.02-.03Zm16.27-1.63c-.49 2.05-1.09 4.19-1.8 6.38-.03.08-.03.16-.03.23-.1.01-.19.05-.27.11-4.44 3.26-8.73 6.62-12.98 10.11 3.67-3.32 7.39-6.62 11.23-9.95a6.409 6.409 0 0 0 2.11-3.74l.56-3.37.03-.1c.25-.71 1.34-.4 1.17.33h-.02Z" style="fill:#6965db;fill-rule:nonzero" transform="matrix(1 0 0 1 -26.41 -29.49)" />
|
||||
</svg>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.8 KiB |
@@ -0,0 +1,6 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48" height="48">
|
||||
<rect x="2" y="2" width="44" height="44" rx="8" fill="#1976d2"/>
|
||||
<text x="24" y="20" text-anchor="middle" font-size="14" font-weight="bold" fill="#ffffff" font-family="Arial, sans-serif">EN</text>
|
||||
<line x1="12" y1="25" x2="36" y2="25" stroke="#ffffff" stroke-width="1.5" opacity="0.5"/>
|
||||
<text x="24" y="39" text-anchor="middle" font-size="14" font-weight="bold" fill="#ffffff" font-family="Arial, sans-serif">中</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 519 B |
BIN
chat_web_front/src/assets/images/applications/pptist.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
1
chat_web_front/src/assets/images/applications/pptist.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 48 48"><g fill="none" stroke-linejoin="round" stroke-width="4"><path fill="#d14424" stroke="#333333" d="M8 6C8 4.89543 8.89543 4 10 4H30L40 14V42C40 43.1046 39.1046 44 38 44H10C8.89543 44 8 43.1046 8 42V6Z"/><path stroke="#ffffff" stroke-linecap="round" d="M16 20H32"/><path stroke="#ffffff" stroke-linecap="round" d="M16 28H32"/></g></svg>
|
||||
|
After Width: | Height: | Size: 418 B |
@@ -0,0 +1,34 @@
|
||||
<svg width="82" height="92" viewBox="0 0 82 92" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g filter="url(#filter0_dddd_3933_98709)">
|
||||
<path d="M56.3678 0.557543L9.07973 10.0315C4.2844 10.989 0.875 14.8441 0.875 19.3039V73.9053C0.875 77.7856 4.06265 81.0359 8.27589 81.4895L33.0841 84.4375L54.9327 64.6642L77.1014 44.0219L76.7133 12.778C76.6579 8.97326 72.7773 6.15122 68.7027 6.95752L63.2143 8.04098L63.2421 5.67248C63.2975 2.34651 59.9158 -0.147965 56.3678 0.557543Z" fill="#FF4B4B"/>
|
||||
<path d="M63.269 8.04043V57.5772L77.1561 43.9962L76.7681 11.7192C76.7403 8.44358 73.3864 6.02469 69.8661 6.7302L63.269 8.04043Z" fill="#545454"/>
|
||||
<path d="M33.0873 84.4375L70.2189 75.6383L77.1569 43.9963L33.0873 84.4375Z" fill="#D0DBDC"/>
|
||||
<path d="M44.1432 35.3049C44.1432 35.3049 39.9022 30.2907 36.77 28.9301C34.7743 28.0734 31.8084 27.7459 29.48 28.8041C26.0429 30.3663 25.6826 34.7506 28.8425 36.4891C29.5909 36.9175 30.5888 37.2702 31.8915 37.5474C38.8767 39.0088 50.4076 42.0324 48.994 54.2024C48.994 54.2024 48.1901 65.6166 34.9683 66.9268C32.6399 67.1536 30.2839 67.0024 28.0109 66.5236C24.8787 65.8937 19.335 64.6087 16.6185 63.0717L16.1196 50.045H17.4501C17.4501 50.045 20.0834 55.8402 27.5674 58.6371C28.9534 59.141 30.4779 59.3426 31.947 59.141C33.8041 58.889 35.9939 57.982 36.8809 55.2355C36.8809 55.2355 38.3777 51.2292 30.6165 49.0371C24.4075 47.2733 18.5589 45.4592 16.1473 39.5127C15.0109 36.6907 14.8168 33.5663 15.593 30.5679C16.6185 26.6624 19.5567 21.1695 27.8723 18.801C27.8723 18.801 38.7935 16.105 46.2776 19.7585L45.9449 35.3049H44.1432Z" fill="white"/>
|
||||
</g>
|
||||
<defs>
|
||||
<filter id="filter0_dddd_3933_98709" x="-8.34465e-07" y="-4.17233e-07" width="81.0944" height="91.875" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dy="0.4375"/>
|
||||
<feGaussianBlur stdDeviation="0.4375"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_3933_98709"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dx="0.4375" dy="1.3125"/>
|
||||
<feGaussianBlur stdDeviation="0.656251"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.09 0"/>
|
||||
<feBlend mode="normal" in2="effect1_dropShadow_3933_98709" result="effect2_dropShadow_3933_98709"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dx="0.875001" dy="3.0625"/>
|
||||
<feGaussianBlur stdDeviation="0.875001"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.05 0"/>
|
||||
<feBlend mode="normal" in2="effect2_dropShadow_3933_98709" result="effect3_dropShadow_3933_98709"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dx="1.75" dy="5.25"/>
|
||||
<feGaussianBlur stdDeviation="1.09375"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.01 0"/>
|
||||
<feBlend mode="normal" in2="effect3_dropShadow_3933_98709" result="effect4_dropShadow_3933_98709"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect4_dropShadow_3933_98709" result="shape"/>
|
||||
</filter>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.3 KiB |
BIN
chat_web_front/src/assets/images/applications/trwebocr.png
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
52
chat_web_front/src/assets/images/chat/chatLogo.svg
Normal file
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="_图层_2" data-name="图层 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 162.4 26.46">
|
||||
<g id="_图层_1-2" data-name="图层 1">
|
||||
<g>
|
||||
<g>
|
||||
<path d="M119.14,11.98h-17.36v-1.49h18.11v.73c0,.42-.34,.75-.75,.75Z"/>
|
||||
<path d="M109.69,12.44s3.91,7.74,7.82,10.54c.39,.28,.92,.27,1.31-.01,1.96-1.45,2.1-1.86,2.1-1.86,0,0-3.8-1.82-9.5-9.58-1.73,.41-1.73,.91-1.73,.91Z"/>
|
||||
<path d="M109.23,5.22h3.14s.24,10.69-8.85,17.49c-.4,.3-.93,.37-1.39,.17-.52-.23-.99-.57-.99-.57,0,0,7.02-4.62,8.09-17.09Z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path d="M4.91,6.25c.18,0,.74-.6,.87-.71,.17,0,.65-.53,.79-.65,.32-.26,.63-.52,.95-.78,.56-.46,1.12-.92,1.69-1.38,.15,0,.72,1.25,.84,1.45,.45,.78,.9,1.56,1.35,2.35l-1.69,1.36c-1.6-.55-3.19-1.1-4.79-1.65Z"/>
|
||||
<path d="M13.06,5.43c-.5-1.29,.38-3.57,1.27-4.51C15.49-.3,17.51,0,19.03,.14c0,0-2.48,2.93-3.55,5.08-.82-.01-1.63,.02-2.42,.21Z"/>
|
||||
<path d="M17.66,4.96L25.6,.8s2.68,1.49,3.63,2.72c-1.4,.41-9.1,2.6-9.37,2.77-.88-.55-2.2-1.33-2.2-1.33Z"/>
|
||||
<polygon points="20.85 7.78 31.75 7.86 31.79 12.24 20.74 9.98 20.85 7.78"/>
|
||||
<path d="M19.56,13.33c-.17,0-.29,.12-.57,.33-.62,.47-1.24,.94-1.86,1.41,1.64,1.94,3.21,3.94,4.81,5.91,.62,.77,1.23,1.55,1.87,2.3,.97-.59,1.7-1.47,2.6-2.15,.32-.25,1.43-.76,1.45-1.22,0-.13-.86-.71-.99-.82-.42-.34-.84-.69-1.26-1.03-1.49-1.22-2.97-2.43-4.47-3.63-.4-.32-.81-.71-1.25-.98-.14-.08-.24-.12-.32-.13Z"/>
|
||||
<path d="M14.11,26.46l-.16-17.73c0-.06-2.36,.1-2.45,.11-1.79,.15-3.65,.33-5.45,.55-1.43,.18-3.03,.26-4.27,1.12C.46,11.43-.13,13.17,.02,14.73l.17,.55s3.27-1.55,3.58-1.7c.63-.3,1.26-.58,1.9-.84,.54-.22,1.32-.65,1.9-.64-.17,.37-.57,.73-.84,1.05l-1.51,1.81-3.24,3.89c-.48,.57-1.02,.92-.79,1.69,.43,1.47,1.54,2.63,2.77,3.5,1.21-1.91,4.39-7.62,6.15-10.35l-.89,12.76h4.89Z"/>
|
||||
</g>
|
||||
<path d="M46.69,9.69v-1.09h-3.34v-3.7h-2.81V13.08h-2.44v7.1h8.57v-5.93c0-.61-.5-1.11-1.11-1.11h-2.21v-3.45h3.34Zm-3.32,4.42c.26,0,.46,.21,.46,.47v4.22c0,.26-.2,.46-.46,.46h-1.89c-.26,0-.47-.2-.47-.46v-4.22c0-.26,.21-.47,.47-.47h1.89Z"/>
|
||||
<path d="M47.63,4.92h2.83l3.11,16.59h3.2v1.19h-3.69c-.88,0-1.7-.42-2.22-1.13l-.05-.07c-.15-.21-.25-.44-.3-.69l-2.88-15.89Z"/>
|
||||
<path d="M46.25,11.17s3.66,.11,8.06-1.4c.4-.01,.8-.01,1.2,0,.2,0,.4,0,.59,0,.1,0,.2,0,.3,0,.09,0,.18-.01,.27,0,.07,.01,.13,.05,.16,.12,.01,.04,0,.06-.03,.08-.55,.41-1.13,.76-1.78,1-.02,0-.04,.01-.06,.02-.23,.08-.46,.15-.69,.21-.32,.09-.64,.16-.96,.23-.42,.09-.85,.16-1.27,.23-.54,.08-1.07,.15-1.61,.21-.66,.07-1.32,.12-1.99,.17-.34,.02-.68,.04-1.03,.06-.1,0-1.1,.06-1.1,.04-.11-.83-.06-.96-.06-.96Z"/>
|
||||
<polygon points="51.95 6.57 53.16 5.28 55.75 6.93 54.1 8.96 51.95 6.57"/>
|
||||
<path d="M53.99,12.13l2.92,1.18s-3.85,7.29-10.4,9.3c-1.16-1.13-1.27-1.51-1.27-1.51,0,0,4.76-2.01,8.75-8.97Z"/>
|
||||
<path d="M61.29,4.5l1.16,.36,1.99,.63s-3.52,5.89-3.99,6.11-1.84-.61-1.84-.61l2.68-6.5Z"/>
|
||||
<path d="M62.9,8.85c-.07,.01-.05,2.52-.06,2.78-.11,3.63-.83,7.26-3.6,9.85-.04,.04-.31,.33-.39,.25l1.13,1.07s3.29-1.64,5.12-6.3c.85-2.17,1.49-5.04,1.18-7.98,0,0-3.39,.33-3.39,.33Z"/>
|
||||
<path d="M67.33,21.71l2.48-1.6s-3.25-3.77-4.65-3.61-.77,1.32-.77,1.32l2.94,3.88Z"/>
|
||||
<rect x="59.13" y="13.28" width="9.91" height="1.29"/>
|
||||
<rect x="62.22" y="7.67" width="6.47" height="1.21"/>
|
||||
<path d="M76.24,6.59h-6.73v14.76h8.45V8.31c0-.95-.77-1.72-1.72-1.72Zm-1.14,13.02c0,.23-.18,.42-.41,.42h-1.9c-.23,0-.41-.19-.41-.42V8.11c0-.23,.18-.41,.41-.41h1.9c.23,0,.41,.18,.41,.41v11.5Z"/>
|
||||
<rect x="88.14" y="12.65" width="2.81" height="2.64"/>
|
||||
<path d="M122.59,8.83h6.72v.4c0,.53-.43,.97-.97,.97h-5.75v-1.36h0Z"/>
|
||||
<path d="M124.65,4.9h2.52V22.22c0,.33-.27,.6-.6,.6h-1.31c-.33,0-.6-.27-.6-.6V4.9h0Z"/>
|
||||
<rect x="129.08" y="6.29" width="12.55" height="1.03"/>
|
||||
<rect x="144.94" y="5.74" width="9.72" height="1.03"/>
|
||||
<rect x="144.16" y="10.2" width="11.03" height="1.03"/>
|
||||
<rect x="146.47" y="17.28" width="13.48" height="1.03"/>
|
||||
<path d="M144.02,20.69h18.37v.45c0,.43-.35,.79-.79,.79h-17.58v-1.24h0Z"/>
|
||||
<rect x="129.08" y="17.34" width="12.55" height="1.03"/>
|
||||
<path d="M131.16,4.89l.58,4.47c0,.06,.07,.09,.12,.07l2.4-.88c.06-.02,.09-.09,.07-.15l-1.29-3.51h-1.87Z"/>
|
||||
<path d="M136.51,4.9l-.07,1.44-.54,2.41,1.13,.7s2.31-1.43,2.3-4.56h-2.82Z"/>
|
||||
<path d="M133.33,15.84s.72,3.52-4.57,6.06c.11,.83,.33,.83,1.1,.72s3.36-.83,5.28-3.14,1.27-3.74,1.27-3.74l-3.08,.11Z"/>
|
||||
<path d="M135.92,17.06s1.27,3.19,5.39,3.69c.44,.11-.94,2.15-.94,2.15,0,0-3.69-1.05-5.61-4.46,.72-.61,1.16-1.38,1.16-1.38Z"/>
|
||||
<path d="M124.71,10.09s-1.5,3.33-2.66,5.37c.22,2.53,.66,2.92,.66,2.92l2.59-3.52-.28-4.84-.32,.08Z"/>
|
||||
<path d="M126.62,13.37l1.82,1.93,1.6-1.27s-2.97-3.08-3.36-2.81-.06,2.15-.06,2.15Z"/>
|
||||
<path d="M139.53,9.76h-9.6v6.19h10.87v-4.92c0-.7-.57-1.27-1.27-1.27Zm-1.26,4.67c0,.31-.26,.56-.57,.56h-5.13c-.32-.01-.32-.25-.32-.56v-.75c0-.31,.01-.58,.33-.58h5.35c.31,0,.34,.27,.34,.58v.75Zm0-2.55c0,.31-.26,.57-.57,.57h-5.17c-.32,0-.28-.26-.28-.57v-.71c-.01-.32,0-.56,.31-.56l5.38-.02c.31,0,.32,.26,.32,.58v.71Z"/>
|
||||
<path d="M146.55,6.43s.58,5.92-2.5,9.06c.63,.69,1.07,.99,1.07,.99,0,0,5.06-3.91,4.4-10.05-.77-.55-2.97,0-2.97,0Z"/>
|
||||
<polygon points="150.87 6.41 150.87 15.51 153.67 15.51 153.67 6.35 150.87 6.41"/>
|
||||
<path d="M162.4,4.92V13.59c0,1.28-1.04,2.31-2.31,2.31h-2.56v-1.03h2.07V4.99l2.8-.07Z"/>
|
||||
<path d="M155.68,6.42v6.25c0,.25,.2,.45,.45,.45h1.91c.25,0,.45-.2,.45-.45V6.39c0-.25-.21-.45-.46-.45l-1.91,.03c-.25,0-.44,.2-.44,.45Z"/>
|
||||
<rect x="151.77" y="15.47" width="3.01" height="5.33"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.5 KiB |
52
chat_web_front/src/assets/images/login/projectLogo-white.svg
Normal file
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="_图层_2" data-name="图层 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 162.4 26.46">
|
||||
<g id="_图层_1-2" fill="white" data-name="图层 1">
|
||||
<g>
|
||||
<g>
|
||||
<path d="M119.14,11.98h-17.36v-1.49h18.11v.73c0,.42-.34,.75-.75,.75Z"/>
|
||||
<path d="M109.69,12.44s3.91,7.74,7.82,10.54c.39,.28,.92,.27,1.31-.01,1.96-1.45,2.1-1.86,2.1-1.86,0,0-3.8-1.82-9.5-9.58-1.73,.41-1.73,.91-1.73,.91Z"/>
|
||||
<path d="M109.23,5.22h3.14s.24,10.69-8.85,17.49c-.4,.3-.93,.37-1.39,.17-.52-.23-.99-.57-.99-.57,0,0,7.02-4.62,8.09-17.09Z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path d="M4.91,6.25c.18,0,.74-.6,.87-.71,.17,0,.65-.53,.79-.65,.32-.26,.63-.52,.95-.78,.56-.46,1.12-.92,1.69-1.38,.15,0,.72,1.25,.84,1.45,.45,.78,.9,1.56,1.35,2.35l-1.69,1.36c-1.6-.55-3.19-1.1-4.79-1.65Z"/>
|
||||
<path d="M13.06,5.43c-.5-1.29,.38-3.57,1.27-4.51C15.49-.3,17.51,0,19.03,.14c0,0-2.48,2.93-3.55,5.08-.82-.01-1.63,.02-2.42,.21Z"/>
|
||||
<path d="M17.66,4.96L25.6,.8s2.68,1.49,3.63,2.72c-1.4,.41-9.1,2.6-9.37,2.77-.88-.55-2.2-1.33-2.2-1.33Z"/>
|
||||
<polygon points="20.85 7.78 31.75 7.86 31.79 12.24 20.74 9.98 20.85 7.78"/>
|
||||
<path d="M19.56,13.33c-.17,0-.29,.12-.57,.33-.62,.47-1.24,.94-1.86,1.41,1.64,1.94,3.21,3.94,4.81,5.91,.62,.77,1.23,1.55,1.87,2.3,.97-.59,1.7-1.47,2.6-2.15,.32-.25,1.43-.76,1.45-1.22,0-.13-.86-.71-.99-.82-.42-.34-.84-.69-1.26-1.03-1.49-1.22-2.97-2.43-4.47-3.63-.4-.32-.81-.71-1.25-.98-.14-.08-.24-.12-.32-.13Z"/>
|
||||
<path d="M14.11,26.46l-.16-17.73c0-.06-2.36,.1-2.45,.11-1.79,.15-3.65,.33-5.45,.55-1.43,.18-3.03,.26-4.27,1.12C.46,11.43-.13,13.17,.02,14.73l.17,.55s3.27-1.55,3.58-1.7c.63-.3,1.26-.58,1.9-.84,.54-.22,1.32-.65,1.9-.64-.17,.37-.57,.73-.84,1.05l-1.51,1.81-3.24,3.89c-.48,.57-1.02,.92-.79,1.69,.43,1.47,1.54,2.63,2.77,3.5,1.21-1.91,4.39-7.62,6.15-10.35l-.89,12.76h4.89Z"/>
|
||||
</g>
|
||||
<path d="M46.69,9.69v-1.09h-3.34v-3.7h-2.81V13.08h-2.44v7.1h8.57v-5.93c0-.61-.5-1.11-1.11-1.11h-2.21v-3.45h3.34Zm-3.32,4.42c.26,0,.46,.21,.46,.47v4.22c0,.26-.2,.46-.46,.46h-1.89c-.26,0-.47-.2-.47-.46v-4.22c0-.26,.21-.47,.47-.47h1.89Z"/>
|
||||
<path d="M47.63,4.92h2.83l3.11,16.59h3.2v1.19h-3.69c-.88,0-1.7-.42-2.22-1.13l-.05-.07c-.15-.21-.25-.44-.3-.69l-2.88-15.89Z"/>
|
||||
<path d="M46.25,11.17s3.66,.11,8.06-1.4c.4-.01,.8-.01,1.2,0,.2,0,.4,0,.59,0,.1,0,.2,0,.3,0,.09,0,.18-.01,.27,0,.07,.01,.13,.05,.16,.12,.01,.04,0,.06-.03,.08-.55,.41-1.13,.76-1.78,1-.02,0-.04,.01-.06,.02-.23,.08-.46,.15-.69,.21-.32,.09-.64,.16-.96,.23-.42,.09-.85,.16-1.27,.23-.54,.08-1.07,.15-1.61,.21-.66,.07-1.32,.12-1.99,.17-.34,.02-.68,.04-1.03,.06-.1,0-1.1,.06-1.1,.04-.11-.83-.06-.96-.06-.96Z"/>
|
||||
<polygon points="51.95 6.57 53.16 5.28 55.75 6.93 54.1 8.96 51.95 6.57"/>
|
||||
<path d="M53.99,12.13l2.92,1.18s-3.85,7.29-10.4,9.3c-1.16-1.13-1.27-1.51-1.27-1.51,0,0,4.76-2.01,8.75-8.97Z"/>
|
||||
<path d="M61.29,4.5l1.16,.36,1.99,.63s-3.52,5.89-3.99,6.11-1.84-.61-1.84-.61l2.68-6.5Z"/>
|
||||
<path d="M62.9,8.85c-.07,.01-.05,2.52-.06,2.78-.11,3.63-.83,7.26-3.6,9.85-.04,.04-.31,.33-.39,.25l1.13,1.07s3.29-1.64,5.12-6.3c.85-2.17,1.49-5.04,1.18-7.98,0,0-3.39,.33-3.39,.33Z"/>
|
||||
<path d="M67.33,21.71l2.48-1.6s-3.25-3.77-4.65-3.61-.77,1.32-.77,1.32l2.94,3.88Z"/>
|
||||
<rect x="59.13" y="13.28" width="9.91" height="1.29"/>
|
||||
<rect x="62.22" y="7.67" width="6.47" height="1.21"/>
|
||||
<path d="M76.24,6.59h-6.73v14.76h8.45V8.31c0-.95-.77-1.72-1.72-1.72Zm-1.14,13.02c0,.23-.18,.42-.41,.42h-1.9c-.23,0-.41-.19-.41-.42V8.11c0-.23,.18-.41,.41-.41h1.9c.23,0,.41,.18,.41,.41v11.5Z"/>
|
||||
<rect x="88.14" y="12.65" width="2.81" height="2.64"/>
|
||||
<path d="M122.59,8.83h6.72v.4c0,.53-.43,.97-.97,.97h-5.75v-1.36h0Z"/>
|
||||
<path d="M124.65,4.9h2.52V22.22c0,.33-.27,.6-.6,.6h-1.31c-.33,0-.6-.27-.6-.6V4.9h0Z"/>
|
||||
<rect x="129.08" y="6.29" width="12.55" height="1.03"/>
|
||||
<rect x="144.94" y="5.74" width="9.72" height="1.03"/>
|
||||
<rect x="144.16" y="10.2" width="11.03" height="1.03"/>
|
||||
<rect x="146.47" y="17.28" width="13.48" height="1.03"/>
|
||||
<path d="M144.02,20.69h18.37v.45c0,.43-.35,.79-.79,.79h-17.58v-1.24h0Z"/>
|
||||
<rect x="129.08" y="17.34" width="12.55" height="1.03"/>
|
||||
<path d="M131.16,4.89l.58,4.47c0,.06,.07,.09,.12,.07l2.4-.88c.06-.02,.09-.09,.07-.15l-1.29-3.51h-1.87Z"/>
|
||||
<path d="M136.51,4.9l-.07,1.44-.54,2.41,1.13,.7s2.31-1.43,2.3-4.56h-2.82Z"/>
|
||||
<path d="M133.33,15.84s.72,3.52-4.57,6.06c.11,.83,.33,.83,1.1,.72s3.36-.83,5.28-3.14,1.27-3.74,1.27-3.74l-3.08,.11Z"/>
|
||||
<path d="M135.92,17.06s1.27,3.19,5.39,3.69c.44,.11-.94,2.15-.94,2.15,0,0-3.69-1.05-5.61-4.46,.72-.61,1.16-1.38,1.16-1.38Z"/>
|
||||
<path d="M124.71,10.09s-1.5,3.33-2.66,5.37c.22,2.53,.66,2.92,.66,2.92l2.59-3.52-.28-4.84-.32,.08Z"/>
|
||||
<path d="M126.62,13.37l1.82,1.93,1.6-1.27s-2.97-3.08-3.36-2.81-.06,2.15-.06,2.15Z"/>
|
||||
<path d="M139.53,9.76h-9.6v6.19h10.87v-4.92c0-.7-.57-1.27-1.27-1.27Zm-1.26,4.67c0,.31-.26,.56-.57,.56h-5.13c-.32-.01-.32-.25-.32-.56v-.75c0-.31,.01-.58,.33-.58h5.35c.31,0,.34,.27,.34,.58v.75Zm0-2.55c0,.31-.26,.57-.57,.57h-5.17c-.32,0-.28-.26-.28-.57v-.71c-.01-.32,0-.56,.31-.56l5.38-.02c.31,0,.32,.26,.32,.58v.71Z"/>
|
||||
<path d="M146.55,6.43s.58,5.92-2.5,9.06c.63,.69,1.07,.99,1.07,.99,0,0,5.06-3.91,4.4-10.05-.77-.55-2.97,0-2.97,0Z"/>
|
||||
<polygon points="150.87 6.41 150.87 15.51 153.67 15.51 153.67 6.35 150.87 6.41"/>
|
||||
<path d="M162.4,4.92V13.59c0,1.28-1.04,2.31-2.31,2.31h-2.56v-1.03h2.07V4.99l2.8-.07Z"/>
|
||||
<path d="M155.68,6.42v6.25c0,.25,.2,.45,.45,.45h1.91c.25,0,.45-.2,.45-.45V6.39c0-.25-.21-.45-.46-.45l-1.91,.03c-.25,0-.44,.2-.44,.45Z"/>
|
||||
<rect x="151.77" y="15.47" width="3.01" height="5.33"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.5 KiB |
52
chat_web_front/src/assets/images/login/projectLogo.svg
Normal file
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="_图层_2" data-name="图层 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 162.4 26.46">
|
||||
<g id="_图层_1-2" data-name="图层 1">
|
||||
<g>
|
||||
<g>
|
||||
<path d="M119.14,11.98h-17.36v-1.49h18.11v.73c0,.42-.34,.75-.75,.75Z"/>
|
||||
<path d="M109.69,12.44s3.91,7.74,7.82,10.54c.39,.28,.92,.27,1.31-.01,1.96-1.45,2.1-1.86,2.1-1.86,0,0-3.8-1.82-9.5-9.58-1.73,.41-1.73,.91-1.73,.91Z"/>
|
||||
<path d="M109.23,5.22h3.14s.24,10.69-8.85,17.49c-.4,.3-.93,.37-1.39,.17-.52-.23-.99-.57-.99-.57,0,0,7.02-4.62,8.09-17.09Z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path d="M4.91,6.25c.18,0,.74-.6,.87-.71,.17,0,.65-.53,.79-.65,.32-.26,.63-.52,.95-.78,.56-.46,1.12-.92,1.69-1.38,.15,0,.72,1.25,.84,1.45,.45,.78,.9,1.56,1.35,2.35l-1.69,1.36c-1.6-.55-3.19-1.1-4.79-1.65Z"/>
|
||||
<path d="M13.06,5.43c-.5-1.29,.38-3.57,1.27-4.51C15.49-.3,17.51,0,19.03,.14c0,0-2.48,2.93-3.55,5.08-.82-.01-1.63,.02-2.42,.21Z"/>
|
||||
<path d="M17.66,4.96L25.6,.8s2.68,1.49,3.63,2.72c-1.4,.41-9.1,2.6-9.37,2.77-.88-.55-2.2-1.33-2.2-1.33Z"/>
|
||||
<polygon points="20.85 7.78 31.75 7.86 31.79 12.24 20.74 9.98 20.85 7.78"/>
|
||||
<path d="M19.56,13.33c-.17,0-.29,.12-.57,.33-.62,.47-1.24,.94-1.86,1.41,1.64,1.94,3.21,3.94,4.81,5.91,.62,.77,1.23,1.55,1.87,2.3,.97-.59,1.7-1.47,2.6-2.15,.32-.25,1.43-.76,1.45-1.22,0-.13-.86-.71-.99-.82-.42-.34-.84-.69-1.26-1.03-1.49-1.22-2.97-2.43-4.47-3.63-.4-.32-.81-.71-1.25-.98-.14-.08-.24-.12-.32-.13Z"/>
|
||||
<path d="M14.11,26.46l-.16-17.73c0-.06-2.36,.1-2.45,.11-1.79,.15-3.65,.33-5.45,.55-1.43,.18-3.03,.26-4.27,1.12C.46,11.43-.13,13.17,.02,14.73l.17,.55s3.27-1.55,3.58-1.7c.63-.3,1.26-.58,1.9-.84,.54-.22,1.32-.65,1.9-.64-.17,.37-.57,.73-.84,1.05l-1.51,1.81-3.24,3.89c-.48,.57-1.02,.92-.79,1.69,.43,1.47,1.54,2.63,2.77,3.5,1.21-1.91,4.39-7.62,6.15-10.35l-.89,12.76h4.89Z"/>
|
||||
</g>
|
||||
<path d="M46.69,9.69v-1.09h-3.34v-3.7h-2.81V13.08h-2.44v7.1h8.57v-5.93c0-.61-.5-1.11-1.11-1.11h-2.21v-3.45h3.34Zm-3.32,4.42c.26,0,.46,.21,.46,.47v4.22c0,.26-.2,.46-.46,.46h-1.89c-.26,0-.47-.2-.47-.46v-4.22c0-.26,.21-.47,.47-.47h1.89Z"/>
|
||||
<path d="M47.63,4.92h2.83l3.11,16.59h3.2v1.19h-3.69c-.88,0-1.7-.42-2.22-1.13l-.05-.07c-.15-.21-.25-.44-.3-.69l-2.88-15.89Z"/>
|
||||
<path d="M46.25,11.17s3.66,.11,8.06-1.4c.4-.01,.8-.01,1.2,0,.2,0,.4,0,.59,0,.1,0,.2,0,.3,0,.09,0,.18-.01,.27,0,.07,.01,.13,.05,.16,.12,.01,.04,0,.06-.03,.08-.55,.41-1.13,.76-1.78,1-.02,0-.04,.01-.06,.02-.23,.08-.46,.15-.69,.21-.32,.09-.64,.16-.96,.23-.42,.09-.85,.16-1.27,.23-.54,.08-1.07,.15-1.61,.21-.66,.07-1.32,.12-1.99,.17-.34,.02-.68,.04-1.03,.06-.1,0-1.1,.06-1.1,.04-.11-.83-.06-.96-.06-.96Z"/>
|
||||
<polygon points="51.95 6.57 53.16 5.28 55.75 6.93 54.1 8.96 51.95 6.57"/>
|
||||
<path d="M53.99,12.13l2.92,1.18s-3.85,7.29-10.4,9.3c-1.16-1.13-1.27-1.51-1.27-1.51,0,0,4.76-2.01,8.75-8.97Z"/>
|
||||
<path d="M61.29,4.5l1.16,.36,1.99,.63s-3.52,5.89-3.99,6.11-1.84-.61-1.84-.61l2.68-6.5Z"/>
|
||||
<path d="M62.9,8.85c-.07,.01-.05,2.52-.06,2.78-.11,3.63-.83,7.26-3.6,9.85-.04,.04-.31,.33-.39,.25l1.13,1.07s3.29-1.64,5.12-6.3c.85-2.17,1.49-5.04,1.18-7.98,0,0-3.39,.33-3.39,.33Z"/>
|
||||
<path d="M67.33,21.71l2.48-1.6s-3.25-3.77-4.65-3.61-.77,1.32-.77,1.32l2.94,3.88Z"/>
|
||||
<rect x="59.13" y="13.28" width="9.91" height="1.29"/>
|
||||
<rect x="62.22" y="7.67" width="6.47" height="1.21"/>
|
||||
<path d="M76.24,6.59h-6.73v14.76h8.45V8.31c0-.95-.77-1.72-1.72-1.72Zm-1.14,13.02c0,.23-.18,.42-.41,.42h-1.9c-.23,0-.41-.19-.41-.42V8.11c0-.23,.18-.41,.41-.41h1.9c.23,0,.41,.18,.41,.41v11.5Z"/>
|
||||
<rect x="88.14" y="12.65" width="2.81" height="2.64"/>
|
||||
<path d="M122.59,8.83h6.72v.4c0,.53-.43,.97-.97,.97h-5.75v-1.36h0Z"/>
|
||||
<path d="M124.65,4.9h2.52V22.22c0,.33-.27,.6-.6,.6h-1.31c-.33,0-.6-.27-.6-.6V4.9h0Z"/>
|
||||
<rect x="129.08" y="6.29" width="12.55" height="1.03"/>
|
||||
<rect x="144.94" y="5.74" width="9.72" height="1.03"/>
|
||||
<rect x="144.16" y="10.2" width="11.03" height="1.03"/>
|
||||
<rect x="146.47" y="17.28" width="13.48" height="1.03"/>
|
||||
<path d="M144.02,20.69h18.37v.45c0,.43-.35,.79-.79,.79h-17.58v-1.24h0Z"/>
|
||||
<rect x="129.08" y="17.34" width="12.55" height="1.03"/>
|
||||
<path d="M131.16,4.89l.58,4.47c0,.06,.07,.09,.12,.07l2.4-.88c.06-.02,.09-.09,.07-.15l-1.29-3.51h-1.87Z"/>
|
||||
<path d="M136.51,4.9l-.07,1.44-.54,2.41,1.13,.7s2.31-1.43,2.3-4.56h-2.82Z"/>
|
||||
<path d="M133.33,15.84s.72,3.52-4.57,6.06c.11,.83,.33,.83,1.1,.72s3.36-.83,5.28-3.14,1.27-3.74,1.27-3.74l-3.08,.11Z"/>
|
||||
<path d="M135.92,17.06s1.27,3.19,5.39,3.69c.44,.11-.94,2.15-.94,2.15,0,0-3.69-1.05-5.61-4.46,.72-.61,1.16-1.38,1.16-1.38Z"/>
|
||||
<path d="M124.71,10.09s-1.5,3.33-2.66,5.37c.22,2.53,.66,2.92,.66,2.92l2.59-3.52-.28-4.84-.32,.08Z"/>
|
||||
<path d="M126.62,13.37l1.82,1.93,1.6-1.27s-2.97-3.08-3.36-2.81-.06,2.15-.06,2.15Z"/>
|
||||
<path d="M139.53,9.76h-9.6v6.19h10.87v-4.92c0-.7-.57-1.27-1.27-1.27Zm-1.26,4.67c0,.31-.26,.56-.57,.56h-5.13c-.32-.01-.32-.25-.32-.56v-.75c0-.31,.01-.58,.33-.58h5.35c.31,0,.34,.27,.34,.58v.75Zm0-2.55c0,.31-.26,.57-.57,.57h-5.17c-.32,0-.28-.26-.28-.57v-.71c-.01-.32,0-.56,.31-.56l5.38-.02c.31,0,.32,.26,.32,.58v.71Z"/>
|
||||
<path d="M146.55,6.43s.58,5.92-2.5,9.06c.63,.69,1.07,.99,1.07,.99,0,0,5.06-3.91,4.4-10.05-.77-.55-2.97,0-2.97,0Z"/>
|
||||
<polygon points="150.87 6.41 150.87 15.51 153.67 15.51 153.67 6.35 150.87 6.41"/>
|
||||
<path d="M162.4,4.92V13.59c0,1.28-1.04,2.31-2.31,2.31h-2.56v-1.03h2.07V4.99l2.8-.07Z"/>
|
||||
<path d="M155.68,6.42v6.25c0,.25,.2,.45,.45,.45h1.91c.25,0,.45-.2,.45-.45V6.39c0-.25-.21-.45-.46-.45l-1.91,.03c-.25,0-.44,.2-.44,.45Z"/>
|
||||
<rect x="151.77" y="15.47" width="3.01" height="5.33"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.5 KiB |
28
chat_web_front/src/assets/images/operates/title.svg
Normal file
@@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="_图层_2" data-name="图层 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 31.79 46.77">
|
||||
<g id="_图层_1-2" data-name="图层 1">
|
||||
<g>
|
||||
<g>
|
||||
<path d="M9.21,2.74c.13,.23,.72,1.25,.84,1.45,.45,.78,.9,1.56,1.35,2.35l-1.69,1.36c-1.6-.55-3.19-1.1-4.79-1.65"/>
|
||||
<path d="M13.06,5.43c-.5-1.29,.38-3.57,1.27-4.51C15.49-.3,17.51,0,19.03,.14c0,0-2.48,2.93-3.55,5.08-.82-.01-1.63,.02-2.42,.21Z"/>
|
||||
<path d="M17.66,4.96L25.6,.8s2.68,1.49,3.63,2.72c-1.4,.41-9.1,2.6-9.37,2.77-.88-.55-2.2-1.33-2.2-1.33Z"/>
|
||||
<polygon points="20.85 7.78 31.75 7.86 31.79 12.24 20.74 9.98 20.85 7.78"/>
|
||||
<path d="M19.56,13.33c-.17,0-.29,.12-.57,.33-.62,.47-1.24,.94-1.86,1.41,1.64,1.94,3.21,3.94,4.81,5.91,.62,.77,1.23,1.55,1.87,2.3,.97-.59,1.7-1.47,2.6-2.15,.32-.25,1.43-.76,1.45-1.22,0-.13-.86-.71-.99-.82-.42-.34-.84-.69-1.26-1.03-1.49-1.22-2.97-2.43-4.47-3.63-.4-.32-.81-.71-1.25-.98-.14-.08-.24-.12-.32-.13Z"/>
|
||||
<path d="M14.11,26.46s-.16-17.73-.16-17.73c0-.06-2.36,.1-2.45,.11-1.79,.15-3.65,.33-5.45,.55-1.43,.18-3.03,.26-4.27,1.12C.46,11.43-.13,13.17,.02,14.73l.17,.55s3.27-1.55,3.58-1.7c.63-.3,1.26-.58,1.9-.84,.54-.22,1.32-.65,1.9-.64-.17,.37-.57,.73-.84,1.05l-1.51,1.81-3.24,3.89c-.48,.57-1.02,.92-.79,1.69,.43,1.47,1.54,2.63,2.77,3.5,1.21-1.91,4.39-7.62,6.15-10.35l-.89,12.76h4.89Z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path d="M7.06,36.55v-.85h-2.6v-2.88H2.27v6.37H.37v5.53H7.04v-4.62c0-.48-.39-.86-.86-.86h-1.72v-2.69h2.6Zm-2.59,3.44c.2,0,.36,.16,.36,.37v3.29c0,.2-.16,.36-.36,.36h-1.47c-.2,0-.37-.16-.37-.36v-3.29c0-.2,.16-.37,.37-.37h1.47Z"/>
|
||||
<path d="M7.79,32.83h2.21l2.42,12.92h2.49v.93h-2.88c-.68,0-1.33-.33-1.73-.88l-.04-.05c-.12-.16-.2-.35-.23-.54l-2.24-12.38Z"/>
|
||||
<path d="M6.72,37.7s2.85,.09,6.28-1.09c.31,0,.62,0,.94,0,.15,0,.31,0,.46,0,.08,0,.15,0,.23,0,.07,0,.14,0,.21,0,.06,.01,.1,.04,.13,.09,.01,.03,0,.04-.03,.06-.43,.32-.88,.59-1.39,.78-.02,0-.03,.01-.05,.02-.18,.06-.36,.11-.54,.16-.25,.07-.5,.13-.75,.18-.33,.07-.66,.13-.99,.18-.42,.06-.84,.12-1.26,.16-.52,.05-1.03,.1-1.55,.13-.27,.02-.53,.03-.8,.05-.07,0-.85,.05-.86,.03-.09-.64-.04-.75-.04-.75Z"/>
|
||||
<polygon points="11.16 34.12 12.1 33.11 14.12 34.39 12.83 35.98 11.16 34.12"/>
|
||||
<path d="M12.75,38.45l2.27,.92s-3,5.68-8.11,7.25c-.9-.88-.99-1.18-.99-1.18,0,0,3.71-1.57,6.82-6.99Z"/>
|
||||
<path d="M18.44,32.5l.91,.28,1.55,.49s-2.74,4.59-3.11,4.76-1.44-.47-1.44-.47l2.09-5.06Z"/>
|
||||
<path d="M19.69,35.9c-.06,0-.04,1.97-.05,2.16-.09,2.83-.64,5.66-2.8,7.68-.03,.03-.24,.25-.3,.2l.88,.84s2.56-1.28,3.99-4.91c.66-1.69,1.16-3.92,.92-6.22,0,0-2.64,.26-2.64,.26Z"/>
|
||||
<path d="M23.15,45.91l1.93-1.24s-2.53-2.94-3.62-2.81-.6,1.03-.6,1.03l2.29,3.02Z"/>
|
||||
<rect x="16.76" y="39.35" width="7.72" height="1.01"/>
|
||||
<rect x="19.16" y="34.97" width="5.04" height=".94"/>
|
||||
<path d="M30.08,34.13h-5.24v11.5h6.58v-10.16c0-.74-.6-1.34-1.34-1.34Zm-.89,10.14c0,.18-.14,.33-.32,.33h-1.48c-.18,0-.32-.15-.32-.33v-8.96c0-.18,.14-.32,.32-.32h1.48c.18,0,.32,.14,.32,.32v8.96Z"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.0 KiB |
@@ -3,7 +3,7 @@
|
||||
<div class="operates">
|
||||
<img
|
||||
@click="goChat"
|
||||
src="../assets/images/operates/title.png"
|
||||
src="../assets/images/operates/title.svg"
|
||||
class="titleImg pointer"
|
||||
alt=""
|
||||
/>
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
export const PROJECT_PROPERTIES = {
|
||||
projectName: '知冶模型'
|
||||
projectName: '战知'
|
||||
}
|
||||
@@ -28,8 +28,8 @@ export default {
|
||||
success: '操作成功',
|
||||
failed: '操作失败',
|
||||
unauthorizedTips: '未经授权,请先进行验证。',
|
||||
logo: '知冶大模型',
|
||||
siteInfo: '© 2023 知冶模型 _ 浪潮软件科技有限公司',
|
||||
logo: '战知',
|
||||
siteInfo: '© 2026 战知 _ 浪潮软件科技有限公司',
|
||||
userXieyi: '用户协议',
|
||||
privacyZhengce: '隐私政策',
|
||||
cueWord1: '您好,我是你的报告撰写智能小助手,快来告诉我你的需要吧~',
|
||||
@@ -46,9 +46,9 @@ export default {
|
||||
noChatFlow: '无对话历史'
|
||||
},
|
||||
login: {
|
||||
title: '知海无涯搜万象',
|
||||
title2:'冶技卓越析微尘',
|
||||
subTitle: '支持多轮对话,集成冶金专业搜索,具备自建知识库、内容创作、信息归纳总结等能力',
|
||||
title: '聚尖端之力,创多维平台',
|
||||
title2:'',
|
||||
subTitle: '聚合科技动能,扩展创新疆界,引领行业跃迁升级',
|
||||
quickStart: '快速开始',
|
||||
telPlaceholder: '请输入手机号',
|
||||
passwordPlaceholder: '请输入密码',
|
||||
|
||||
@@ -1,422 +1,227 @@
|
||||
<template>
|
||||
<div class="tools-container">
|
||||
<div class="top-level" ref="topLevel">
|
||||
<template v-for="(item, index) in topSpecies">
|
||||
<div class="species-name" :class="activeTopSpecieIndex === index ? 'active' : ''"
|
||||
@click="changeTopSpecies(index)">{{ item.name }}
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
<div class="tools-page">
|
||||
<!-- 工具列表视图 -->
|
||||
<div class="tools-container">
|
||||
<div class="tools-header">
|
||||
<span class="tools-title">实用工具</span>
|
||||
</div>
|
||||
|
||||
<div class="second-level" ref="secondLevel">
|
||||
<template v-for="(item, index) in secondSpecies">
|
||||
<div class="species-name" :class="activeSecondSpecieIndex === index ? 'active' : ''"
|
||||
@click="changeSecondSpecies(index)">{{ item.name }}
|
||||
<div class="tab-bar">
|
||||
<div v-for="(category, index) in toolCategories" :key="category.name"
|
||||
class="tab-item" :class="{ active: activeTab === index }" @click="activeTab = index">
|
||||
{{ category.name }}
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tools-info" :style="toolsHeight != '' ? 'max-height:'+toolsHeight:''">
|
||||
<template v-for="tool in tools">
|
||||
<div class="level-name" v-if="tool.topLevel">{{ tool.topLevel}}</div>
|
||||
<div class="tools">
|
||||
<template v-for="item in tool.data">
|
||||
<div class="tool-item" @click="goToLink(item)">
|
||||
<img :src="getToolsImg(item.imgUrl)" alt="">
|
||||
<div class="tool-info">
|
||||
<div class="top">
|
||||
<div class="name">{{ item.name }}</div>
|
||||
<div class="type" v-if="item.tag && activeTopSpecieIndex === 0">{{ item.tag }}</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="desc" :title="item.description"> {{ item.description }}</div>
|
||||
<img src="@/assets/images/applications/right.png" alt="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="tools-list">
|
||||
<div v-for="tool in toolCategories[activeTab].tools" :key="tool.id" class="tool-item"
|
||||
:class="{ disabled: !tool.enabled }" @click="openTool(tool)">
|
||||
<div class="tool-icon">
|
||||
<img v-if="tool.logoImg" :src="tool.logoImg" class="tool-logo-img" alt="">
|
||||
<span v-else>{{ tool.icon }}</span>
|
||||
</div>
|
||||
<div class="tool-info">
|
||||
<div class="tool-top">
|
||||
<div class="tool-name">{{ tool.name }}</div>
|
||||
<div class="tool-badge" v-if="!tool.enabled">即将上线</div>
|
||||
</div>
|
||||
</template>
|
||||
<div class="tool-desc">{{ tool.description }}</div>
|
||||
</div>
|
||||
<img v-if="tool.enabled" src="@/assets/images/applications/right.png" class="tool-arrow" alt="">
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<page-footer></page-footer>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import {onMounted, onUnmounted, reactive, ref} from "vue";
|
||||
import {withLoading} from "@/utils/loading";
|
||||
import {getConfig, getTagConfig, viewUrl} from "@/api";
|
||||
import PageFooter from "@/components/pageFooter.vue";
|
||||
import {ElMessage} from "element-plus";
|
||||
import { ref, reactive } from "vue";
|
||||
import stirlingLogo from "@/assets/images/applications/stirling-pdf.svg";
|
||||
import excalidrawLogo from "@/assets/images/applications/excalidraw.svg";
|
||||
import trwebocrLogo from "@/assets/images/applications/trwebocr.png";
|
||||
import pptistLogo from "@/assets/images/applications/pptist.png";
|
||||
import libretranslateLogo from "@/assets/images/applications/libretranslate.svg";
|
||||
|
||||
// 后端接口的上下文
|
||||
const baseURL = import.meta.env.VITE_GLOB_API_CTX;
|
||||
interface Tool {
|
||||
id: string;
|
||||
name: string;
|
||||
icon: string;
|
||||
description: string;
|
||||
url?: string;
|
||||
port?: number;
|
||||
path?: string;
|
||||
logoImg?: string;
|
||||
enabled: boolean;
|
||||
type: 'newtab' | 'route';
|
||||
}
|
||||
|
||||
// 请求参数类型
|
||||
type RequestParams = {
|
||||
type?: string;
|
||||
sort?: string;
|
||||
tag?: string;
|
||||
className?: string;
|
||||
interface Category {
|
||||
name: string;
|
||||
tools: Tool[];
|
||||
}
|
||||
|
||||
const activeTab = ref(0);
|
||||
|
||||
const toolCategories = reactive<Category[]>([
|
||||
{
|
||||
name: '📄 文档处理',
|
||||
tools: [
|
||||
{ id: 'stirling-pdf', name: 'Stirling PDF', icon: '', logoImg: stirlingLogo, description: 'PDF 合并、拆分、压缩、转换、加水印、OCR 识别等 30+ 功能', port: 18080, enabled: true, type: 'newtab' },
|
||||
{ id: 'trwebocr', name: '图片转文字 OCR', icon: '', logoImg: trwebocrLogo, description: '中文离线 OCR,识别图片中的文字和表格', port: 18083, enabled: true, type: 'newtab' },
|
||||
]
|
||||
},
|
||||
{
|
||||
name: '🎨 创作绘图',
|
||||
tools: [
|
||||
{ id: 'excalidraw', name: 'Excalidraw', icon: '', logoImg: excalidrawLogo, description: '手绘风格白板,绘制流程图、架构图、示意图', port: 18081, enabled: true, type: 'newtab' },
|
||||
{ id: 'mindmap', name: '思维导图', icon: '🧠', description: '创建和编辑思维导图,支持导出图片和 PDF', url: '', enabled: false, type: 'newtab' },
|
||||
{ id: 'image-editor', name: '图片编辑', icon: '🖼️', description: '裁剪、滤镜、标注、调色,在线图片编辑器', url: '', enabled: false, type: 'newtab' },
|
||||
]
|
||||
},
|
||||
{
|
||||
name: '📊 数据与写作',
|
||||
tools: [
|
||||
{ id: 'pptist', name: 'AI PPT 编辑器', icon: '', logoImg: pptistLogo, description: 'AI 生成 PPT 大纲和演示文稿,在线编辑演示', port: 18085, enabled: true, type: 'newtab' },
|
||||
{ id: 'libretranslate', name: '智能翻译', icon: '', logoImg: libretranslateLogo, description: '中英互译,支持文本和文件翻译,数据不出内网', port: 18084, enabled: true, type: 'newtab' },
|
||||
{ id: 'spreadsheet', name: '在线表格', icon: '📊', description: '在线 Excel,支持公式计算、图表生成', url: '', enabled: false, type: 'newtab' },
|
||||
{ id: 'markdown', name: 'Markdown 编辑器', icon: '📝', description: '所见即所得编辑,支持数学公式、流程图、导出', url: '', enabled: false, type: 'newtab' },
|
||||
]
|
||||
},
|
||||
]);
|
||||
|
||||
const openTool = (tool: Tool) => {
|
||||
if (!tool.enabled) return;
|
||||
const url = tool.url || (tool.port ? `${window.location.protocol}//${window.location.hostname}:${tool.port}${tool.path || ''}` : '');
|
||||
if (url) {
|
||||
window.open(url, '_blank');
|
||||
}
|
||||
};
|
||||
|
||||
// 一级导航
|
||||
const topSpecies = reactive<any[]>([]);
|
||||
const activeTopSpecieIndex = ref<number>(0);
|
||||
|
||||
// 二级导航
|
||||
const secondSpecies = reactive<any[]>([]);
|
||||
const activeSecondSpecieIndex = ref<number>(-1);
|
||||
|
||||
// 工具
|
||||
type ToolInfo = {
|
||||
imgUrl: string,
|
||||
name: string,
|
||||
description: string,
|
||||
tag: string
|
||||
}
|
||||
type Tool = {
|
||||
topLevel?: string;
|
||||
data: ToolInfo[];
|
||||
}
|
||||
const tools = reactive<Tool[]>([]);
|
||||
|
||||
// 工具模块高度自适应相关
|
||||
const topLevel = ref<any>(null);
|
||||
const secondLevel = ref<any>(null);
|
||||
const toolsHeight = ref('');
|
||||
|
||||
/**
|
||||
* 获取工具广场信息
|
||||
* 适用于获取一级导航,二级导航,以及实用工具下除项目管理、知识管理、研究实施、运营推广外的内容
|
||||
* @param params
|
||||
*/
|
||||
const getConfigList = async (params: RequestParams) => {
|
||||
try {
|
||||
let res = await withLoading(getConfig)(params);
|
||||
return res.code === 200 && res.data ? res.data : [];
|
||||
} catch (error: any) {
|
||||
ElMessage.error(error && error.message ? error.message : '未知错误');
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取工具广场信息
|
||||
* 适用于获取实用工具下除项目管理、知识管理、研究实施、运营推广的内容
|
||||
* @param params
|
||||
*/
|
||||
const getTagConfigList = async (params: RequestParams) => {
|
||||
try {
|
||||
let res = await withLoading(getTagConfig)(params);
|
||||
return res.code === 200 && res.data ? res.data : [];
|
||||
} catch (error: any) {
|
||||
ElMessage.error(error && error.message ? error.message : '未知错误');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取一级导航
|
||||
*/
|
||||
const getTopSpecies = async () => {
|
||||
topSpecies.length = 0;
|
||||
let params: RequestParams = {
|
||||
type: "广场",
|
||||
sort: '广场',
|
||||
tag: ''
|
||||
}
|
||||
topSpecies.push(...await getConfigList(params));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取二级导航
|
||||
*/
|
||||
const getSecondSpecies = async () => {
|
||||
secondSpecies.length = 0;
|
||||
if (activeTopSpecieIndex.value === 0) {
|
||||
let params: RequestParams = {
|
||||
type: "广场",
|
||||
sort: topSpecies[activeTopSpecieIndex.value].value,
|
||||
tag: 'tag'
|
||||
}
|
||||
secondSpecies.push(...await getConfigList(params));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取工具
|
||||
*/
|
||||
const getTools = async () => {
|
||||
tools.length = 0;
|
||||
|
||||
if (activeTopSpecieIndex.value === 0 && activeSecondSpecieIndex.value === 0) {
|
||||
await getTagToolList();
|
||||
return;
|
||||
}
|
||||
|
||||
await getToolList();
|
||||
}
|
||||
const getTagToolList = async () => {
|
||||
let params: RequestParams = {
|
||||
className: secondSpecies[activeSecondSpecieIndex.value].value,
|
||||
}
|
||||
tools.push(...await getTagConfigList(params));
|
||||
}
|
||||
const getToolList = async () => {
|
||||
let tag = '';
|
||||
if (activeSecondSpecieIndex.value === 0) {
|
||||
tag = "NoTag";
|
||||
} else if (activeSecondSpecieIndex.value != -1) {
|
||||
tag = secondSpecies[activeSecondSpecieIndex.value].value;
|
||||
}
|
||||
let params: RequestParams = {
|
||||
type: "广场",
|
||||
sort: topSpecies[activeTopSpecieIndex.value].value,
|
||||
tag: tag
|
||||
}
|
||||
let data = await getConfigList(params);
|
||||
tools.push({ data: data})
|
||||
}
|
||||
|
||||
/**
|
||||
* 切换一级导航
|
||||
*/
|
||||
const changeTopSpecies = async (index: number) => {
|
||||
activeTopSpecieIndex.value = index;
|
||||
if (activeTopSpecieIndex.value === 0) {
|
||||
activeSecondSpecieIndex.value = 0;
|
||||
} else {
|
||||
activeSecondSpecieIndex.value = -1;
|
||||
}
|
||||
await getSecondSpecies();
|
||||
await getTools();
|
||||
getToolsHeight();
|
||||
}
|
||||
|
||||
/**
|
||||
* 切换二级导航
|
||||
* @param index
|
||||
*/
|
||||
const changeSecondSpecies = (index: number) => {
|
||||
if (activeTopSpecieIndex.value !== 0) {
|
||||
return;
|
||||
}
|
||||
activeSecondSpecieIndex.value = index;
|
||||
getTools();
|
||||
}
|
||||
|
||||
/**
|
||||
* 拼接工具图片地址
|
||||
*/
|
||||
const getToolsImg = (imgUrl: string) => {
|
||||
return new URL(baseURL + '/file/' + imgUrl, import.meta.url).href
|
||||
}
|
||||
|
||||
/**
|
||||
* 工具模块高度自适应
|
||||
*/
|
||||
const getToolsHeight = () => {
|
||||
if (activeTopSpecieIndex.value !== 0) {
|
||||
if (topLevel.value && topLevel.value.offsetHeight !== 0) {
|
||||
let otherHeight: number = topLevel.value.offsetHeight + 146;
|
||||
toolsHeight.value = "calc(100vh - " + otherHeight + "px)";
|
||||
}
|
||||
} else {
|
||||
if (topLevel.value && topLevel.value.offsetHeight !== 0 && secondLevel.value && secondLevel.value.offsetHeight !== 0) {
|
||||
let otherHeight: number = topLevel.value.offsetHeight + secondLevel.value.offsetHeight + 176;
|
||||
toolsHeight.value = "calc(100vh - " + otherHeight + "px)";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 链接跳转
|
||||
* @param item
|
||||
*/
|
||||
const goToLink = async (item: any) => {
|
||||
try {
|
||||
let res = await withLoading(viewUrl)(Number(item.id));
|
||||
|
||||
if (res.code === 200) {
|
||||
window.open(item.jumpUrl, '_blank');
|
||||
} else {
|
||||
ElMessage.error(res.msg);
|
||||
}
|
||||
} catch (error) {
|
||||
ElMessage.error(error && error.message ? error.message : '未知错误');
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(async () => {
|
||||
await getTopSpecies();
|
||||
await changeTopSpecies(0);
|
||||
getToolsHeight();
|
||||
window.addEventListener("resize", getToolsHeight);
|
||||
})
|
||||
|
||||
onUnmounted(() => {
|
||||
window.removeEventListener("resize", getToolsHeight);
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.tools-container {
|
||||
.tools-page {
|
||||
width: 100%;
|
||||
padding: 60px 160px 20px 236px;
|
||||
position: relative;
|
||||
height: 100%;
|
||||
.top-level {
|
||||
display: flex;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.tools-container {
|
||||
padding: 30px 50px;
|
||||
height: 100%;
|
||||
overflow-y: auto;
|
||||
|
||||
.tools-header {
|
||||
margin-bottom: 20px;
|
||||
|
||||
.species-name {
|
||||
font-weight: bold;
|
||||
font-size: 20px;
|
||||
color: #858A94;
|
||||
margin-right: 60px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.active {
|
||||
color: #004EA0;
|
||||
}
|
||||
.tools-title { font-size: 20px; font-weight: bold; color: #000; }
|
||||
}
|
||||
|
||||
.second-level {
|
||||
.tab-bar {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
margin-bottom: 8px;
|
||||
.species-name {
|
||||
width: 89px;
|
||||
height: 36px;
|
||||
text-align: center;
|
||||
line-height: 36px;
|
||||
margin-bottom: 20px;
|
||||
gap: 12px;
|
||||
|
||||
.tab-item {
|
||||
padding: 6px 20px;
|
||||
background: rgba(133, 138, 150, 0.1);
|
||||
border-radius: 18px;
|
||||
border: 1px solid #E6EDFF;
|
||||
margin-right: 16px;
|
||||
font-size: 16px;
|
||||
margin-bottom: 12px;
|
||||
font-size: 14px;
|
||||
color: #606771;
|
||||
cursor: pointer;
|
||||
}
|
||||
transition: all 0.2s;
|
||||
|
||||
.active {
|
||||
background: #004EA0;
|
||||
color: #FAFBFF;
|
||||
&:hover { border-color: #004EA0; color: #004EA0; }
|
||||
&.active { background: #004EA0; color: #fff; border-color: #004EA0; }
|
||||
}
|
||||
}
|
||||
|
||||
.tools {
|
||||
.tools-list {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
overflow-y: auto;
|
||||
.tool-item {
|
||||
display: flex;
|
||||
width: 325px;
|
||||
height: 105px;
|
||||
background: #E6EDFF;
|
||||
border-radius: 8px;
|
||||
border: 1px solid #E6EDFF;
|
||||
margin-right: 17px;
|
||||
margin-bottom: 20px;
|
||||
padding: 16px;
|
||||
cursor: pointer;
|
||||
|
||||
img {
|
||||
width: 73px;
|
||||
height: 73px;
|
||||
}
|
||||
|
||||
.tool-info {
|
||||
height: 73px;
|
||||
margin-left: 12px;
|
||||
|
||||
.top {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 14px;
|
||||
|
||||
.name {
|
||||
width: 128px;
|
||||
font-weight: bold;
|
||||
font-size: 16px;
|
||||
color: #000000;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.type {
|
||||
width: 64px;
|
||||
height: 23px;
|
||||
line-height: 23px;
|
||||
text-align: center;
|
||||
font-size: 12px;
|
||||
color: #1C73CE;
|
||||
background: rgba(28, 115, 206, 0.11);
|
||||
border-radius: 11px
|
||||
}
|
||||
}
|
||||
|
||||
.bottom {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
.desc {
|
||||
width: 185px;
|
||||
height: 37px;
|
||||
font-size: 12px;
|
||||
color: #858A94;
|
||||
display: flex;
|
||||
display: -webkit-box;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-line-clamp: 2;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
img {
|
||||
width: 7px;
|
||||
height: 14px;
|
||||
margin-left: 16px
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.tools-top-level {
|
||||
font-weight: bold;
|
||||
font-size: 16px;
|
||||
color: #000000;
|
||||
}
|
||||
}
|
||||
.tools-info {
|
||||
overflow-y: auto;
|
||||
.level-name {
|
||||
font-weight: bold;
|
||||
font-size: 16px;
|
||||
color: #000000;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
.footer {
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
color: #B9B9B9;
|
||||
line-height: 30px;
|
||||
text-align: right;
|
||||
font-style: normal;
|
||||
text-transform: none;
|
||||
position: absolute;
|
||||
bottom: 2vh;
|
||||
right: 160px;
|
||||
a {
|
||||
color: inherit; /* 继承父元素的文字颜色 */
|
||||
text-decoration: none; /* 去除下划线 */
|
||||
cursor: pointer;
|
||||
}
|
||||
gap: 16px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
.tool-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
width: 340px;
|
||||
padding: 16px;
|
||||
background: #E6EDFF;
|
||||
border-radius: 8px;
|
||||
border: 1px solid #E6EDFF;
|
||||
cursor: pointer;
|
||||
transition: all 0.2s;
|
||||
|
||||
&:hover:not(.disabled) {
|
||||
border-color: #004EA0;
|
||||
.tool-name { color: #004EA0; }
|
||||
}
|
||||
|
||||
&.disabled {
|
||||
opacity: 0.55;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
.tool-icon {
|
||||
font-size: 28px;
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background: #fff;
|
||||
border-radius: 10px;
|
||||
flex-shrink: 0;
|
||||
|
||||
.tool-logo-img { width: 36px; height: 36px; object-fit: contain; }
|
||||
}
|
||||
|
||||
.tool-info {
|
||||
flex: 1;
|
||||
margin-left: 12px;
|
||||
min-width: 0;
|
||||
|
||||
.tool-top {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
.tool-name {
|
||||
font-size: 15px;
|
||||
font-weight: bold;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
.tool-badge {
|
||||
font-size: 10px;
|
||||
color: #999;
|
||||
background: rgba(255,255,255,0.7);
|
||||
padding: 2px 8px;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.tool-desc {
|
||||
font-size: 12px;
|
||||
color: #858A94;
|
||||
line-height: 1.5;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 2;
|
||||
-webkit-box-orient: vertical;
|
||||
overflow: hidden;
|
||||
}
|
||||
}
|
||||
|
||||
.tool-arrow {
|
||||
width: 7px;
|
||||
height: 14px;
|
||||
margin-left: 12px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
@@ -20,13 +20,10 @@
|
||||
<div class="chatAll" ref="chatDiv">
|
||||
<div class="content" v-if="!chatStatus">
|
||||
<div class="title">
|
||||
<span class="titleHead">知</span>
|
||||
<span>海无涯</span>
|
||||
<span class="titleHead" style="margin-left: 40px">冶</span>
|
||||
<span>技卓越</span>
|
||||
<span>聚尖端之力,创多维平台</span>
|
||||
</div>
|
||||
<div class="titleInfo">
|
||||
提升信息处理效率,促进科研创新,优化工艺流程,冶金行业AI助手!
|
||||
聚合科技动能,扩展创新疆界,引领行业跃迁升级
|
||||
</div>
|
||||
<div class="operate">
|
||||
<div class="scenario">
|
||||
|
||||
@@ -7,22 +7,16 @@
|
||||
<div class="loginContent">
|
||||
<div class="loginTitle">
|
||||
<div>
|
||||
知海无涯搜万象
|
||||
<br />
|
||||
冶技卓越析微尘
|
||||
聚尖端之力,创多维平台
|
||||
<br />
|
||||
<span class="loginInfo">
|
||||
支持多轮对话,集成冶金专业搜索,具备自建知识库、内容创作、信息归纳总结等能力
|
||||
</span>
|
||||
<br>
|
||||
<span class="loginInfo">
|
||||
已接入DeepSeek-R1满血版
|
||||
聚合科技动能,扩展创新疆界,引领行业跃迁升级
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="loginOperate">
|
||||
<img
|
||||
src="../../assets/images/login/projectLogo2.png"
|
||||
:src="projectLogo2"
|
||||
class="logoImg"
|
||||
alt=""
|
||||
/>
|
||||
@@ -69,8 +63,8 @@
|
||||
</template>
|
||||
<script setup lang='ts'>
|
||||
import { computed, ref, onMounted, reactive } from "vue";
|
||||
import projectLogo from "@/assets/images/login/projectLogo.png";
|
||||
import projectLogo2 from "@/assets/images/login/projectLogo2.png";
|
||||
import projectLogo from "@/assets/images/login/projectLogo-white.svg";
|
||||
import projectLogo2 from "@/assets/images/login/projectLogo.svg";
|
||||
import type { FormInstance, FormRules } from "element-plus";
|
||||
import { fetchVerify } from "@/api";
|
||||
import { useAuthStore } from "@/store";
|
||||
|
||||
@@ -35,7 +35,16 @@ export default defineConfig((env) => {
|
||||
[viteEnv.VITE_GLOB_API_CTX]: {
|
||||
target: viteEnv.VITE_GLOB_API_DEV_IP,
|
||||
changeOrigin: true,
|
||||
}
|
||||
},
|
||||
// 工具服务通过 Nginx(:18000) 反代,sub_filter 处理子资源路径
|
||||
'/pdf/': {
|
||||
target: 'http://localhost:18000',
|
||||
changeOrigin: true,
|
||||
},
|
||||
'/draw/': {
|
||||
target: 'http://localhost:18000',
|
||||
changeOrigin: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
build: {
|
||||
|
||||
@@ -2518,62 +2518,17 @@ PROMPT_TEMPLATES = {
|
||||
|
||||
PROMPT_ABSTRACT = {
|
||||
"llm_chat": {
|
||||
"policy_standard_chat": {"title": "政策问答",
|
||||
"desc": "提供各行业最新的政策、法规等信息。",
|
||||
"prompt": "您可以向我咨询行业的政策,我将为您提供信息,并给出解读建议。",
|
||||
"type": "行业专业问答"},
|
||||
|
||||
"Topic Recommend Assistant": {"title": "选题推荐",
|
||||
"desc": "聚焦十四五规划、国内前沿会议,提供项目选题推荐服务。",
|
||||
"prompt": "请给我提供一个方向或一个主题,我将为您推荐相关的选题。(默认推荐一个)",
|
||||
"type": "项目选题"},
|
||||
|
||||
"Policy History Assistant": {"title": "政策脉络",
|
||||
"desc": "梳理政策脉络,支撑立项和研究工作。",
|
||||
"prompt": "输入政策的具体名称或提供一个主题,我将为您提供其背后的历史背景和发展脉络。",
|
||||
"type": "政策分析挖掘"},
|
||||
|
||||
# "process_flow": {"title": "工艺流程问答",
|
||||
# "desc": "针对特定工艺的详细流程进行回答。",
|
||||
# "prompt": "您可以向我提问有关产品的产能、产量、进出口、技术经济指标等工艺流程的问题,我将给您提供相关的答案。",
|
||||
# "type": "行业专业问答"},
|
||||
|
||||
"concept_explain": {"title": "术语解释",
|
||||
"desc": "提供各领域专业术语的即时解释。",
|
||||
"prompt": "您可以直接输入任何领域的专业术语,我都将为您进行专业全面的解释",
|
||||
"type": "行业专业问答"},
|
||||
|
||||
"statistic_search": {"title": "智能问数",
|
||||
"desc": "将自然语言智能转换成数据库检索SQL,查询相关数据,并回答问题。",
|
||||
"prompt": "您可以直接问我问题,我将基于全球统计数据库的结构化数据来给您回答。",
|
||||
"type": "行业专业问答"},
|
||||
}
|
||||
,
|
||||
"knowledge_base_chat": {
|
||||
"policy_standard_chat": {"title": "政策问答",
|
||||
"desc": "提供各行业最新的政策、法规等信息。",
|
||||
"prompt": "您可以向我咨询行业的政策,我将为您提供信息,并给出解读建议。",
|
||||
"type": "行业专业问答"},
|
||||
|
||||
"Topic Recommend Assistant": {"title": "选题推荐",
|
||||
"desc": "聚焦十四五规划、国内前沿会议,提供项目选题推荐服务。",
|
||||
"prompt": "请给我提供一个方向或一个主题,我将为您推荐相关的选题。(默认推荐一个)",
|
||||
"type": "项目选题"},
|
||||
|
||||
"Policy History Assistant": {"title": "政策脉络",
|
||||
"desc": "梳理政策脉络,支撑立项和研究工作。",
|
||||
"prompt": "输入政策的具体名称或提供一个主题,我将为您提供其背后的历史背景和发展脉络。",
|
||||
"type": "政策分析挖掘"},
|
||||
|
||||
# "process_flow": {"title": "工艺流程问答",
|
||||
# "desc": "针对特定工艺的详细流程进行回答。",
|
||||
# "prompt": "您可以向我提问有关产品的产能、产量、进出口、技术经济指标等工艺流程的问题,我将给您提供相关的答案。",
|
||||
# "type": "行业专业问答"},
|
||||
|
||||
"concept_explain": {"title": "术语解释",
|
||||
"desc": "提供各领域专业术语的即时解释。",
|
||||
"prompt": "您可以直接输入任何领域的专业术语,我都将为您进行专业全面的解释",
|
||||
"type": "行业专业问答"},
|
||||
},
|
||||
|
||||
}
|
||||
|
||||
98
scripts/excalidraw-ai-proxy.py
Normal file
@@ -0,0 +1,98 @@
|
||||
"""
|
||||
Excalidraw AI 代理服务
|
||||
接收 Excalidraw 的 text-to-diagram 请求,转发给 deepseek-v3 生成 Mermaid 语法
|
||||
"""
|
||||
from fastapi import FastAPI, Request
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
import requests
|
||||
import json
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=["*"],
|
||||
allow_methods=["*"],
|
||||
allow_headers=["*"],
|
||||
)
|
||||
|
||||
LLM_API = "http://10.102.24.75:3000/v1/chat/completions"
|
||||
LLM_KEY = "sk-BlQIGRrotbVDWE5mXCPBFjVWIvJ83hldzz67xInNwzVo7pPb"
|
||||
|
||||
SYSTEM_PROMPT = """You are an expert at creating Mermaid diagrams.
|
||||
When the user describes a diagram, workflow, flowchart, or similar,
|
||||
generate ONLY valid Mermaid syntax. Do not include any explanation,
|
||||
just the Mermaid code. Do not wrap it in markdown code blocks.
|
||||
Always start with a diagram type declaration like: graph TD, flowchart LR, sequenceDiagram, classDiagram, etc."""
|
||||
|
||||
|
||||
@app.post("/v1/ai/text-to-diagram/generate")
|
||||
async def text_to_diagram(request: Request):
|
||||
body = await request.json()
|
||||
print(f"[AI] Received request: {json.dumps(body, ensure_ascii=False)[:500]}")
|
||||
prompt = body.get("prompt", body.get("text", body.get("message", "")))
|
||||
|
||||
try:
|
||||
resp = requests.post(LLM_API, json={
|
||||
"model": "deepseek-v3",
|
||||
"messages": [
|
||||
{"role": "system", "content": SYSTEM_PROMPT},
|
||||
{"role": "user", "content": prompt}
|
||||
],
|
||||
"temperature": 0.3,
|
||||
"max_tokens": 2048
|
||||
}, headers={"Authorization": f"Bearer {LLM_KEY}"}, timeout=60)
|
||||
|
||||
result = resp.json()
|
||||
print(f"[AI] LLM response status: {resp.status_code}")
|
||||
mermaid_code = result["choices"][0]["message"]["content"].strip()
|
||||
|
||||
# 清理可能的 markdown 包裹
|
||||
if mermaid_code.startswith("```"):
|
||||
mermaid_code = mermaid_code.split("\n", 1)[1] if "\n" in mermaid_code else mermaid_code[3:]
|
||||
if mermaid_code.endswith("```"):
|
||||
mermaid_code = mermaid_code[:-3].strip()
|
||||
|
||||
print(f"[AI] Mermaid output: {mermaid_code[:200]}")
|
||||
return {"generatedResponse": mermaid_code}
|
||||
except Exception as e:
|
||||
print(f"[AI] Error: {e}")
|
||||
return {"generatedResponse": f"graph TD\n A[Error: {str(e)[:50]}]"}
|
||||
|
||||
|
||||
@app.post("/v1/ai/diagram-to-code/generate")
|
||||
async def diagram_to_code(request: Request):
|
||||
body = await request.json()
|
||||
texts = body.get("texts", [])
|
||||
theme = body.get("theme", "light")
|
||||
print(f"[AI] diagram-to-code request, texts: {texts[:5]}, theme: {theme}")
|
||||
|
||||
prompt = f"Based on these UI element labels: {', '.join(texts) if texts else 'empty wireframe'}. Theme: {theme}. Generate a complete, beautiful HTML page with inline CSS that represents this wireframe layout. Only output the HTML code, nothing else."
|
||||
|
||||
try:
|
||||
resp = requests.post(LLM_API, json={
|
||||
"model": "deepseek-v3",
|
||||
"messages": [
|
||||
{"role": "system", "content": "You are an expert web developer. Generate complete HTML with inline CSS based on wireframe descriptions. Output ONLY the HTML code, no explanation, no markdown code blocks."},
|
||||
{"role": "user", "content": prompt}
|
||||
],
|
||||
"temperature": 0.3,
|
||||
"max_tokens": 4096
|
||||
}, headers={"Authorization": f"Bearer {LLM_KEY}"}, timeout=60)
|
||||
|
||||
result = resp.json()
|
||||
html_code = result["choices"][0]["message"]["content"].strip()
|
||||
if html_code.startswith("```"):
|
||||
html_code = html_code.split("\n", 1)[1] if "\n" in html_code else html_code[3:]
|
||||
if html_code.endswith("```"):
|
||||
html_code = html_code[:-3].strip()
|
||||
print(f"[AI] HTML output length: {len(html_code)}")
|
||||
return html_code
|
||||
except Exception as e:
|
||||
print(f"[AI] diagram-to-code error: {e}")
|
||||
return f"<html><body><h1>Generation Error</h1><p>{str(e)[:100]}</p></body></html>"
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import uvicorn
|
||||
uvicorn.run(app, host="0.0.0.0", port=18082)
|
||||
239
scripts/pptist-ai-backend.py
Normal file
@@ -0,0 +1,239 @@
|
||||
"""
|
||||
PPTist AI 后端服务
|
||||
接收 PPTist 的 AIPPT 请求,调用 deepseek-v3 生成大纲和PPT内容
|
||||
端口: 18086
|
||||
"""
|
||||
from fastapi import FastAPI, Request
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
from fastapi.responses import StreamingResponse
|
||||
import httpx
|
||||
import json
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=["*"],
|
||||
allow_methods=["*"],
|
||||
allow_headers=["*"],
|
||||
)
|
||||
|
||||
LLM_API = "http://10.102.24.75:3000/v1/chat/completions"
|
||||
LLM_KEY = "sk-BlQIGRrotbVDWE5mXCPBFjVWIvJ83hldzz67xInNwzVo7pPb"
|
||||
LLM_MODEL = "deepseek-v3"
|
||||
|
||||
OUTLINE_SYSTEM_PROMPT = """你是一个专业的PPT大纲生成助手。用户会给你一个主题,你需要生成一份内容丰富、结构清晰的PPT大纲。
|
||||
|
||||
要求:
|
||||
1. 使用Markdown格式,用 # 表示演示文稿标题,## 表示章节标题,### 表示该章节下的内容页标题
|
||||
2. 必须包含6个主要章节(##)
|
||||
3. 每个章节下必须有2-3个内容页(###)
|
||||
4. 每个内容页标题要具体、有信息量,不要太笼统
|
||||
5. 内容要专业、逻辑清晰、层层递进
|
||||
6. 直接输出Markdown内容,不要有多余的解释
|
||||
|
||||
示例格式:
|
||||
# 人工智能技术发展
|
||||
## 人工智能概述
|
||||
### 定义与发展历史
|
||||
### 核心技术与分支
|
||||
## 机器学习基础
|
||||
### 监督学习与无监督学习
|
||||
### 深度学习与神经网络
|
||||
### 常用算法对比
|
||||
..."""
|
||||
|
||||
AIPPT_SYSTEM_PROMPT = """你是一个专业的PPT内容生成助手。用户会给你一份PPT大纲,你需要根据大纲生成完整、丰富、详实的PPT内容。
|
||||
|
||||
你必须严格按照以下JSON数组格式输出,不要输出任何其他内容。
|
||||
|
||||
结构规则:
|
||||
1. 第一页:cover类型,包含演示标题和副标题描述
|
||||
2. 第二页:contents类型,列出所有章节名称
|
||||
3. 每个章节:先一个transition过渡页,然后每个###子内容对应一个content页
|
||||
4. 每个content页必须包含4个items,每个item有title和text
|
||||
5. text内容必须详实具体,每条20-40字,包含实质性的数据、观点或分析,不要空泛
|
||||
6. 最后一页:end类型
|
||||
|
||||
输出格式(JSON数组,每个元素是一页slide):
|
||||
[
|
||||
{"type": "cover", "data": {"title": "演示标题", "text": "一句话描述演示主题和价值"}},
|
||||
{"type": "contents", "data": {"items": ["章节1名称", "章节2名称", "章节3名称", "章节4名称", "章节5名称", "章节6名称"]}},
|
||||
{"type": "transition", "data": {"title": "章节标题", "text": "本章将介绍什么内容,一句话概述"}},
|
||||
{"type": "content", "data": {"title": "内容页标题", "items": [
|
||||
{"title": "要点1标题", "text": "要点1的详细说明,包含具体信息、数据或分析"},
|
||||
{"title": "要点2标题", "text": "要点2的详细说明"},
|
||||
{"title": "要点3标题", "text": "要点3的详细说明"},
|
||||
{"title": "要点4标题", "text": "要点4的详细说明"}
|
||||
]}},
|
||||
{"type": "end"}
|
||||
]
|
||||
|
||||
重要:
|
||||
- 生成的总页数应在20-25页之间
|
||||
- 只输出JSON数组,不要markdown代码块,不要任何解释
|
||||
- 确保JSON格式完全正确,可被直接解析"""
|
||||
|
||||
|
||||
async def stream_llm(messages, temperature=0.7, max_tokens=4096):
|
||||
"""流式调用LLM并逐块返回文本"""
|
||||
async with httpx.AsyncClient(timeout=120) as client:
|
||||
async with client.stream(
|
||||
"POST",
|
||||
LLM_API,
|
||||
json={
|
||||
"model": LLM_MODEL,
|
||||
"messages": messages,
|
||||
"temperature": temperature,
|
||||
"max_tokens": max_tokens,
|
||||
"stream": True,
|
||||
},
|
||||
headers={"Authorization": f"Bearer {LLM_KEY}"},
|
||||
) as resp:
|
||||
async for line in resp.aiter_lines():
|
||||
if line.startswith("data: "):
|
||||
data = line[6:]
|
||||
if data.strip() == "[DONE]":
|
||||
break
|
||||
try:
|
||||
chunk = json.loads(data)
|
||||
delta = chunk["choices"][0].get("delta", {})
|
||||
content = delta.get("content", "")
|
||||
if content:
|
||||
yield content
|
||||
except (json.JSONDecodeError, KeyError, IndexError):
|
||||
continue
|
||||
|
||||
|
||||
@app.post("/tools/aippt_outline")
|
||||
async def aippt_outline(request: Request):
|
||||
data = await request.json()
|
||||
content = data.get("content", "")
|
||||
language = data.get("language", "中文")
|
||||
print(f"[AIPPT] Outline request: {content}, language: {language}")
|
||||
|
||||
user_prompt = f"请用{language}为以下主题生成PPT大纲:\n\n{content}"
|
||||
|
||||
async def generate():
|
||||
async for text in stream_llm(
|
||||
[
|
||||
{"role": "system", "content": OUTLINE_SYSTEM_PROMPT},
|
||||
{"role": "user", "content": user_prompt},
|
||||
],
|
||||
temperature=0.7,
|
||||
max_tokens=2048,
|
||||
):
|
||||
yield text
|
||||
|
||||
return StreamingResponse(generate(), media_type="text/event-stream")
|
||||
|
||||
|
||||
@app.post("/tools/aippt")
|
||||
async def aippt(request: Request):
|
||||
data = await request.json()
|
||||
content = data.get("content", "")
|
||||
language = data.get("language", "中文")
|
||||
style = data.get("style", "通用")
|
||||
print(f"[AIPPT] Generate request, style: {style}, language: {language}")
|
||||
|
||||
user_prompt = f"请根据以下大纲生成PPT内容,风格为「{style}」,语言为{language}:\n\n{content}"
|
||||
|
||||
async def generate():
|
||||
"""流式收集LLM输出,按JSON对象级别缓冲,每检测到一个完整对象就立即发送"""
|
||||
buf = ""
|
||||
brace_depth = 0
|
||||
in_string = False
|
||||
escape_next = False
|
||||
found_array = False # 是否已经跳过了数组开头的 [
|
||||
|
||||
try:
|
||||
async for chunk in stream_llm(
|
||||
[
|
||||
{"role": "system", "content": AIPPT_SYSTEM_PROMPT},
|
||||
{"role": "user", "content": user_prompt},
|
||||
],
|
||||
temperature=0.7,
|
||||
max_tokens=8192,
|
||||
):
|
||||
for ch in chunk:
|
||||
# 跳过数组开头的 [ 和结尾的 ] 以及逗号分隔符
|
||||
if not found_array:
|
||||
if ch == '[':
|
||||
found_array = True
|
||||
continue
|
||||
|
||||
if brace_depth == 0 and ch in (' ', '\n', '\r', '\t', ',', ']'):
|
||||
continue
|
||||
|
||||
buf += ch
|
||||
|
||||
if escape_next:
|
||||
escape_next = False
|
||||
continue
|
||||
if ch == '\\' and in_string:
|
||||
escape_next = True
|
||||
continue
|
||||
if ch == '"' and not escape_next:
|
||||
in_string = not in_string
|
||||
continue
|
||||
if in_string:
|
||||
continue
|
||||
|
||||
if ch == '{':
|
||||
brace_depth += 1
|
||||
elif ch == '}':
|
||||
brace_depth -= 1
|
||||
if brace_depth == 0:
|
||||
# 得到一个完整的JSON对象
|
||||
try:
|
||||
obj = json.loads(buf)
|
||||
yield json.dumps(obj, ensure_ascii=False) + "\n"
|
||||
print(f"[AIPPT] Sent slide: {obj.get('type', '?')}")
|
||||
except json.JSONDecodeError as e:
|
||||
print(f"[AIPPT] JSON parse error: {e}, buf: {buf[:100]}")
|
||||
buf = ""
|
||||
|
||||
except Exception as e:
|
||||
print(f"[AIPPT] Error: {e}")
|
||||
yield json.dumps({"type": "cover", "data": {"title": "生成失败", "text": str(e)[:100]}}) + "\n"
|
||||
yield json.dumps({"type": "end"}) + "\n"
|
||||
|
||||
return StreamingResponse(generate(), media_type="text/event-stream")
|
||||
|
||||
|
||||
WRITING_COMMANDS = {
|
||||
"rewrite": "请改写以下文本,保持原意但使用不同的表达方式:",
|
||||
"expand": "请扩写以下文本,补充更多细节和内容:",
|
||||
"abbreviate": "请缩写以下文本,保留核心要点,使其更简洁:",
|
||||
"polish": "请润色以下文本,使其更流畅、专业:",
|
||||
"translate": "请将以下文本翻译为英文:",
|
||||
}
|
||||
|
||||
|
||||
@app.post("/tools/ai_writing")
|
||||
async def ai_writing(request: Request):
|
||||
data = await request.json()
|
||||
content = data.get("content", "")
|
||||
command = data.get("command", "rewrite")
|
||||
print(f"[AIPPT] Writing request, command: {command}")
|
||||
|
||||
instruction = WRITING_COMMANDS.get(command, WRITING_COMMANDS["rewrite"])
|
||||
user_prompt = f"{instruction}\n\n{content}"
|
||||
|
||||
async def generate():
|
||||
async for text in stream_llm(
|
||||
[
|
||||
{"role": "system", "content": "你是一个专业的文字助手,帮助用户改写、扩写、缩写、润色或翻译文本。直接输出结果,不要有额外解释。"},
|
||||
{"role": "user", "content": user_prompt},
|
||||
],
|
||||
temperature=0.7,
|
||||
max_tokens=2048,
|
||||
):
|
||||
yield text
|
||||
|
||||
return StreamingResponse(generate(), media_type="text/event-stream")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import uvicorn
|
||||
uvicorn.run(app, host="0.0.0.0", port=18086)
|
||||
41
scripts/pptist-deploy/Dockerfile
Normal file
@@ -0,0 +1,41 @@
|
||||
# PPTist 构建 & 部署
|
||||
FROM docker.1ms.run/node:20 AS builder
|
||||
ENV http_proxy=http://219.234.197.247:53128
|
||||
ENV https_proxy=http://219.234.197.247:53128
|
||||
ENV no_proxy=localhost,127.0.0.1,10.0.0.0/8,192.168.0.0/16,172.17.0.0/16
|
||||
WORKDIR /app
|
||||
COPY PPTist/package*.json ./
|
||||
RUN npm config set registry https://registry.npmmirror.com && npm install
|
||||
COPY PPTist/ .
|
||||
|
||||
# 修改 SERVER_URL: 生产环境使用相对路径 /pptapi,由 nginx 反代到 AI 后端
|
||||
RUN sed -i "s|'https://server.pptist.cn'|'/pptapi'|g" src/services/index.ts
|
||||
|
||||
# 修改模型选项为 deepseek-v3
|
||||
RUN sed -i "s/glm-4\.7-flash/deepseek-v3/g" src/views/Editor/AIPPTDialog.vue && \
|
||||
sed -i "s/GLM-4\.7-Flash/DeepSeek-V3/g" src/views/Editor/AIPPTDialog.vue && \
|
||||
sed -i "s/doubao-seed-1\.6-flash/deepseek-v3/g" src/views/Editor/AIPPTDialog.vue && \
|
||||
sed -i "s/Doubao-Seed-1\.6-Flash/DeepSeek-V3/g" src/views/Editor/AIPPTDialog.vue && \
|
||||
sed -i "s/GLM-4\.5-Flash/DeepSeek-V3/g" src/services/index.ts
|
||||
|
||||
RUN npm run build
|
||||
|
||||
# 生产阶段
|
||||
FROM docker.1ms.run/nginx:alpine
|
||||
COPY --from=builder /app/dist /usr/share/nginx/html
|
||||
RUN echo 'server { \
|
||||
listen 80; \
|
||||
root /usr/share/nginx/html; \
|
||||
index index.html; \
|
||||
location / { \
|
||||
try_files $uri $uri/ /index.html; \
|
||||
} \
|
||||
location /pptapi/ { \
|
||||
proxy_pass http://172.17.0.1:18086/; \
|
||||
proxy_http_version 1.1; \
|
||||
proxy_set_header Connection ""; \
|
||||
proxy_buffering off; \
|
||||
proxy_cache off; \
|
||||
} \
|
||||
}' > /etc/nginx/conf.d/default.conf
|
||||
EXPOSE 80
|
||||
41
scripts/pptist-deploy/deploy-all-tools.sh
Normal file
@@ -0,0 +1,41 @@
|
||||
#!/bin/bash
|
||||
# 一键部署三个工具: TrWebOCR, LibreTranslate, PPTist + AI后端
|
||||
set -e
|
||||
|
||||
echo "========== 1. 部署 TrWebOCR (端口 18083) =========="
|
||||
docker rm -f trwebocr 2>/dev/null || true
|
||||
docker run -d --name trwebocr --restart always -p 18083:8089 mmmz/trwebocr:latest
|
||||
echo "TrWebOCR 启动完成"
|
||||
|
||||
echo "========== 2. 部署 LibreTranslate (端口 18084) =========="
|
||||
docker rm -f libretranslate 2>/dev/null || true
|
||||
docker run -d --name libretranslate --restart always \
|
||||
-p 18084:5000 \
|
||||
-e LT_LOAD_ONLY=en,zh \
|
||||
-v lt-data:/home/libretranslate/.local \
|
||||
libretranslate/libretranslate
|
||||
echo "LibreTranslate 启动完成(语言模型下载中,约5分钟后可用)"
|
||||
|
||||
echo "========== 3. 启动 PPTist AI 后端 (端口 18086) =========="
|
||||
# 先安装依赖
|
||||
pip install fastapi uvicorn httpx 2>/dev/null || pip3 install fastapi uvicorn httpx
|
||||
# 杀掉旧进程
|
||||
pkill -f "pptist-ai-backend" 2>/dev/null || true
|
||||
sleep 1
|
||||
# 用 screen 启动后台运行
|
||||
screen -dmS pptist-ai python3 /root/gangyan/scripts/pptist-ai-backend.py
|
||||
echo "PPTist AI 后端启动完成"
|
||||
|
||||
echo "========== 4. 构建并部署 PPTist (端口 18085) =========="
|
||||
cd /root/gangyan/scripts/pptist-deploy
|
||||
docker rm -f pptist 2>/dev/null || true
|
||||
docker build -t pptist:latest .
|
||||
docker run -d --name pptist --restart always -p 18085:80 pptist:latest
|
||||
echo "PPTist 启动完成"
|
||||
|
||||
echo ""
|
||||
echo "========== 部署完成 =========="
|
||||
echo "TrWebOCR: http://localhost:18083"
|
||||
echo "LibreTranslate: http://localhost:18084"
|
||||
echo "PPTist: http://localhost:18085"
|
||||
echo "PPTist AI后端: http://localhost:18086"
|
||||