mirror of
https://github.com/cool-team-official/cool-admin-java-docs.git
synced 2026-10-07 10:43:12 +08:00
优化
This commit is contained in:
@@ -23,6 +23,7 @@ export default defineConfig({
|
||||
|
||||
outline: {
|
||||
label: "页面导航",
|
||||
level: [2, 3],
|
||||
},
|
||||
|
||||
lastUpdated: {
|
||||
@@ -118,6 +119,7 @@ export default defineConfig({
|
||||
{ text: "swagger 文档", link: "/src/guide/swagger.md" },
|
||||
],
|
||||
},
|
||||
{ text: "部署项目", link: "/src/guide/deploy.md" },
|
||||
],
|
||||
},
|
||||
{
|
||||
|
||||
Vendored
+3
-3
@@ -6,16 +6,16 @@
|
||||
<title>404 | Cool Admin</title>
|
||||
<meta name="description" content="Not Found">
|
||||
<meta name="generator" content="VitePress v1.3.0">
|
||||
<link rel="preload stylesheet" href="/assets/style.sNAlF7rx.css" as="style">
|
||||
<link rel="preload stylesheet" href="/assets/style.C_XMi3Tx.css" as="style">
|
||||
|
||||
<script type="module" src="/assets/app.C4vF_6Mf.js"></script>
|
||||
<script type="module" src="/assets/app.1jA0_gtU.js"></script>
|
||||
<link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
|
||||
<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
|
||||
<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<script>window.__VP_HASH_MAP__=JSON.parse("{\"index.md\":\"IDM-wWfu\",\"readme.md\":\"21sdoxr8\",\"src_about_index.md\":\"u0DlwXFy\",\"src_guide_ai.md\":\"PrgLyacX\",\"src_guide_cache.md\":\"TbXSwkcj\",\"src_guide_controller.md\":\"DCo4_59t\",\"src_guide_db.md\":\"Duwyo5Xx\",\"src_guide_dev.md\":\"Dkd1jFPN\",\"src_guide_dir.md\":\"RpZMF5oN\",\"src_guide_exception.md\":\"B8TYnOY4\",\"src_guide_flow.md\":\"Bg5zEnLF\",\"src_guide_initdata.md\":\"CWyYHbHt\",\"src_guide_plugin.md\":\"Har19Yp0\",\"src_guide_quick.md\":\"B3Pgf-em\",\"src_guide_security.md\":\"D2ao104D\",\"src_guide_service.md\":\"DFVHuVBZ\",\"src_guide_swagger.md\":\"Cb0cwFc8\",\"src_guide_upload.md\":\"CxcWqhw1\",\"src_introduce_index.md\":\"DA1PheMx\",\"src_introduce_show.md\":\"D0p_OwAi\",\"src_introduce_src.md\":\"B9s21jCc\",\"src_question_common.md\":\"DOoSuwHd\",\"src_todo_plan.md\":\"OECDxoZt\",\"src_todo_update.md\":\"y1o13J5g\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Cool Admin\",\"description\":\"一个很酷的后台管理系统开发框架\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"logo\":\"/logo.png\",\"search\":{\"provider\":\"local\"},\"footer\":{\"message\":\"COOL为开发者而生\",\"copyright\":\"<a href=\\\"https://beian.miit.gov.cn\\\">Copyright © COOL | 闽ICP备2024042701号</a>\"},\"docFooter\":{\"prev\":\"上一页\",\"next\":\"下一页\"},\"outline\":{\"label\":\"页面导航\"},\"lastUpdated\":{\"text\":\"最后更新于\",\"formatOptions\":{\"dateStyle\":\"short\",\"timeStyle\":\"medium\"}},\"langMenuLabel\":\"多语言\",\"returnToTopLabel\":\"回到顶部\",\"sidebarMenuLabel\":\"菜单\",\"darkModeSwitchLabel\":\"主题\",\"lightModeSwitchTitle\":\"切换到浅色模式\",\"darkModeSwitchTitle\":\"切换到深色模式\",\"editLink\":{\"text\":\"在GitHub上编辑\",\"pattern\":\"https://github.com/cool-team-official/cool-admin-java-docs/blob/main/:path\"},\"nav\":[{\"text\":\"介绍\",\"link\":\"/src/introduce/index.md\",\"noIcon\":false},{\"text\":\"教程\",\"link\":\"/src/guide/quick.md\"},{\"text\":\"🔥插件市场\",\"link\":\"https://cool-js.com/plugin/list.html\"},{\"text\":\"交流合作\",\"link\":\"/src/about/index.md\"},{\"text\":\"v7.1.0\",\"items\":[{\"text\":\"更新日志\",\"link\":\"/src/todo/update.md\"},{\"text\":\"版本计划\",\"link\":\"/src/todo/plan.md\"}]},{\"text\":\"更多\",\"items\":[{\"text\":\"Cool Admin(Nodejs版)\",\"link\":\"https://cool-js.com\"},{\"text\":\"Uni(基于uni-app跨端移动端开发)\",\"link\":\"https://cool-js.com/uni/introduce.html\"}]}],\"sidebar\":[{\"text\":\"介绍\",\"items\":[{\"text\":\"简介\",\"link\":\"/src/introduce/index.md\"},{\"text\":\"演示\",\"link\":\"/src/introduce/show.md\"},{\"text\":\"源码\",\"link\":\"/src/introduce/src.md\"}]},{\"text\":\"教程\",\"items\":[{\"text\":\"快速开始\",\"link\":\"/src/guide/quick.md\"},{\"text\":\"目录结构\",\"link\":\"/src/guide/dir.md\"},{\"text\":\"Ai编码\",\"link\":\"/src/guide/ai.md\"},{\"text\":\"Ai流程编排\",\"link\":\"/src/guide/flow.md\"},{\"text\":\"扩展插件\",\"link\":\"/src/guide/plugin.md\"},{\"text\":\"开发方式\",\"link\":\"/src/guide/dev.md\"},{\"text\":\"核心\",\"items\":[{\"text\":\"控制器(Controller)\",\"link\":\"/src/guide/controller.md\"},{\"text\":\"服务(Service)\",\"link\":\"/src/guide/service.md\"},{\"text\":\"数据库(Db)\",\"link\":\"/src/guide/db.md\"},{\"text\":\"缓存(Cache)\",\"link\":\"/src/guide/cache.md\"},{\"text\":\"文件上传\",\"link\":\"/src/guide/upload.md\"},{\"text\":\"统一异常\",\"link\":\"/src/guide/exception.md\"},{\"text\":\"权限校验\",\"link\":\"/src/guide/security.md\"},{\"text\":\"数据初始化\",\"link\":\"/src/guide/initData.md\"},{\"text\":\"swagger 文档\",\"link\":\"/src/guide/swagger.md\"}]}]},{\"text\":\"计划&更新\",\"items\":[{\"text\":\"更新\",\"link\":\"/src/todo/update.md\"},{\"text\":\"计划\",\"link\":\"/src/todo/plan.md\"}]},{\"text\":\"常见问题\",\"link\":\"/src/question/common.md\"},{\"text\":\"交流合作\",\"link\":\"/src/about/index.md\"}],\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/cool-team-official/cool-admin-java\"}]},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
|
||||
<script>window.__VP_HASH_MAP__=JSON.parse("{\"index.md\":\"IDM-wWfu\",\"readme.md\":\"21sdoxr8\",\"src_about_index.md\":\"u0DlwXFy\",\"src_guide_ai.md\":\"Bn1ZEhFs\",\"src_guide_cache.md\":\"TbXSwkcj\",\"src_guide_controller.md\":\"DCo4_59t\",\"src_guide_db.md\":\"Duwyo5Xx\",\"src_guide_deploy.md\":\"DiaIQEY0\",\"src_guide_dev.md\":\"Dkd1jFPN\",\"src_guide_dir.md\":\"RpZMF5oN\",\"src_guide_exception.md\":\"B8TYnOY4\",\"src_guide_flow.md\":\"CkZifxjx\",\"src_guide_initdata.md\":\"CWyYHbHt\",\"src_guide_plugin.md\":\"Har19Yp0\",\"src_guide_quick.md\":\"B3Pgf-em\",\"src_guide_security.md\":\"D2ao104D\",\"src_guide_service.md\":\"DFVHuVBZ\",\"src_guide_swagger.md\":\"Cb0cwFc8\",\"src_guide_upload.md\":\"CxcWqhw1\",\"src_introduce_index.md\":\"DA1PheMx\",\"src_introduce_show.md\":\"D0p_OwAi\",\"src_introduce_src.md\":\"B9s21jCc\",\"src_question_common.md\":\"DOoSuwHd\",\"src_todo_plan.md\":\"OECDxoZt\",\"src_todo_update.md\":\"y1o13J5g\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Cool Admin\",\"description\":\"一个很酷的后台管理系统开发框架\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"logo\":\"/logo.png\",\"search\":{\"provider\":\"local\"},\"footer\":{\"message\":\"COOL为开发者而生\",\"copyright\":\"<a href=\\\"https://beian.miit.gov.cn\\\">Copyright © COOL | 闽ICP备2024042701号</a>\"},\"docFooter\":{\"prev\":\"上一页\",\"next\":\"下一页\"},\"outline\":{\"label\":\"页面导航\",\"level\":[2,3]},\"lastUpdated\":{\"text\":\"最后更新于\",\"formatOptions\":{\"dateStyle\":\"short\",\"timeStyle\":\"medium\"}},\"langMenuLabel\":\"多语言\",\"returnToTopLabel\":\"回到顶部\",\"sidebarMenuLabel\":\"菜单\",\"darkModeSwitchLabel\":\"主题\",\"lightModeSwitchTitle\":\"切换到浅色模式\",\"darkModeSwitchTitle\":\"切换到深色模式\",\"editLink\":{\"text\":\"在GitHub上编辑\",\"pattern\":\"https://github.com/cool-team-official/cool-admin-java-docs/blob/main/:path\"},\"nav\":[{\"text\":\"介绍\",\"link\":\"/src/introduce/index.md\",\"noIcon\":false},{\"text\":\"教程\",\"link\":\"/src/guide/quick.md\"},{\"text\":\"🔥插件市场\",\"link\":\"https://cool-js.com/plugin/list.html\"},{\"text\":\"交流合作\",\"link\":\"/src/about/index.md\"},{\"text\":\"v7.1.0\",\"items\":[{\"text\":\"更新日志\",\"link\":\"/src/todo/update.md\"},{\"text\":\"版本计划\",\"link\":\"/src/todo/plan.md\"}]},{\"text\":\"更多\",\"items\":[{\"text\":\"Cool Admin(Nodejs版)\",\"link\":\"https://cool-js.com\"},{\"text\":\"Uni(基于uni-app跨端移动端开发)\",\"link\":\"https://cool-js.com/uni/introduce.html\"}]}],\"sidebar\":[{\"text\":\"介绍\",\"items\":[{\"text\":\"简介\",\"link\":\"/src/introduce/index.md\"},{\"text\":\"演示\",\"link\":\"/src/introduce/show.md\"},{\"text\":\"源码\",\"link\":\"/src/introduce/src.md\"}]},{\"text\":\"教程\",\"items\":[{\"text\":\"快速开始\",\"link\":\"/src/guide/quick.md\"},{\"text\":\"目录结构\",\"link\":\"/src/guide/dir.md\"},{\"text\":\"Ai编码\",\"link\":\"/src/guide/ai.md\"},{\"text\":\"Ai流程编排\",\"link\":\"/src/guide/flow.md\"},{\"text\":\"扩展插件\",\"link\":\"/src/guide/plugin.md\"},{\"text\":\"开发方式\",\"link\":\"/src/guide/dev.md\"},{\"text\":\"核心\",\"items\":[{\"text\":\"控制器(Controller)\",\"link\":\"/src/guide/controller.md\"},{\"text\":\"服务(Service)\",\"link\":\"/src/guide/service.md\"},{\"text\":\"数据库(Db)\",\"link\":\"/src/guide/db.md\"},{\"text\":\"缓存(Cache)\",\"link\":\"/src/guide/cache.md\"},{\"text\":\"文件上传\",\"link\":\"/src/guide/upload.md\"},{\"text\":\"统一异常\",\"link\":\"/src/guide/exception.md\"},{\"text\":\"权限校验\",\"link\":\"/src/guide/security.md\"},{\"text\":\"数据初始化\",\"link\":\"/src/guide/initData.md\"},{\"text\":\"swagger 文档\",\"link\":\"/src/guide/swagger.md\"}]},{\"text\":\"部署项目\",\"link\":\"/src/guide/deploy.md\"}]},{\"text\":\"计划&更新\",\"items\":[{\"text\":\"更新\",\"link\":\"/src/todo/update.md\"},{\"text\":\"计划\",\"link\":\"/src/todo/plan.md\"}]},{\"text\":\"常见问题\",\"link\":\"/src/question/common.md\"},{\"text\":\"交流合作\",\"link\":\"/src/about/index.md\"}],\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/cool-team-official/cool-admin-java\"}]},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Vendored
+5
-5
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
||||
import{U as o,af as p,ag as u,ah as l,ai as c,aj as f,ak as d,al as m,am as h,an as g,ao as A,d as P,u as v,y,x as w,ap as C,aq as R,ar as b,as as E}from"./chunks/framework.C_oE5szm.js";import{R as S}from"./chunks/theme.BGRQRpgk.js";function i(e){if(e.extends){const a=i(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=i(S),T=P({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=v();return y(()=>{w(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&C(),R(),b(),s.setup&&s.setup(),()=>E(s.Layout)}});async function _(){globalThis.__VITEPRESS__=!0;const e=x(),a=j();a.provide(u,e);const t=l(e.route);return a.provide(c,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function j(){return h(T)}function x(){let e=o,a;return g(t=>{let n=A(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=import(n)),o&&(e=!1),r},s.NotFound)}o&&_().then(({app:e,router:a,data:t})=>{a.go().then(()=>{p(a.route,t.site),e.mount("#app")})});export{_ as createApp};
|
||||
import{U as o,af as p,ag as u,ah as l,ai as c,aj as f,ak as d,al as m,am as h,an as g,ao as A,d as P,u as v,y,x as w,ap as C,aq as R,ar as b,as as E}from"./chunks/framework.C_oE5szm.js";import{R as S}from"./chunks/theme.Bw5u2-O-.js";function i(e){if(e.extends){const a=i(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=i(S),T=P({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=v();return y(()=>{w(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&C(),R(),b(),s.setup&&s.setup(),()=>E(s.Layout)}});async function _(){globalThis.__VITEPRESS__=!0;const e=x(),a=j();a.provide(u,e);const t=l(e.route);return a.provide(c,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function j(){return h(T)}function x(){let e=o,a;return g(t=>{let n=A(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=import(n)),o&&(e=!1),r},s.NotFound)}o&&_().then(({app:e,router:a,data:t})=>{a.go().then(()=>{p(a.route,t.site),e.mount("#app")})});export{_ as createApp};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+3
-3
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
import{_ as a,c as e,o as t,a5 as r,a9 as i}from"./chunks/framework.C_oE5szm.js";const u=JSON.parse('{"title":"Ai 编码","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/ai.md","filePath":"src/guide/ai.md","lastUpdated":1721036629000}'),o={name:"src/guide/ai.md"},s=r('<h1 id="ai-编码" tabindex="-1">Ai 编码 <a class="header-anchor" href="#ai-编码" aria-label="Permalink to "Ai 编码""></a></h1><p>通过微调大模型学习框架特有写法,实现简单功能从 Api 接口到前端页面的一键生成</p><p><img src="'+i+'" alt="" data-zoomable=""></p><p><a href="https://www.bilibili.com/video/BV1Hm421g7Br/?" target="_blank" rel="noreferrer">B 站视频教程</a></p><p><a href="https://show.cool-admin.com/helper/ai-code" target="_blank" rel="noreferrer">在线演示</a></p>',5),_=[s];function c(n,d,p,l,h,m){return t(),e("div",null,_)}const g=a(o,[["render",c]]);export{u as __pageData,g as default};
|
||||
@@ -0,0 +1 @@
|
||||
import{_ as a,c as e,o as t,a5 as r,a9 as i}from"./chunks/framework.C_oE5szm.js";const u=JSON.parse('{"title":"Ai 编码","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/ai.md","filePath":"src/guide/ai.md","lastUpdated":1721036629000}'),o={name:"src/guide/ai.md"},s=r("",5),_=[s];function c(n,d,p,l,h,m){return t(),e("div",null,_)}const g=a(o,[["render",c]]);export{u as __pageData,g as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as a,c as t,o as i,j as e,a as s,a9 as r}from"./chunks/framework.C_oE5szm.js";const x=JSON.parse('{"title":"Ai 编码","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/ai.md","filePath":"src/guide/ai.md","lastUpdated":1721036629000}'),o={name:"src/guide/ai.md"},c=e("h1",{id:"ai-编码",tabindex:"-1"},[s("Ai 编码 "),e("a",{class:"header-anchor",href:"#ai-编码","aria-label":'Permalink to "Ai 编码"'},"")],-1),n=e("p",null,"通过微调大模型学习框架特有写法,实现简单功能从 Api 接口到前端页面的一键生成",-1),d=e("p",null,[e("img",{src:r,alt:"","data-zoomable":""})],-1),l=e("p",null,[e("a",{href:"https://www.bilibili.com/video/BV1Hm421g7Br/?",target:"_blank",rel:"noreferrer"},"B 站视频教程")],-1),_=[c,n,d,l];function p(h,m,f,u,g,b){return i(),t("div",null,_)}const k=a(o,[["render",p]]);export{x as __pageData,k as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as a,c as t,o as i,j as e,a as s,a9 as r}from"./chunks/framework.C_oE5szm.js";const x=JSON.parse('{"title":"Ai 编码","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/ai.md","filePath":"src/guide/ai.md","lastUpdated":1721036629000}'),o={name:"src/guide/ai.md"},c=e("h1",{id:"ai-编码",tabindex:"-1"},[s("Ai 编码 "),e("a",{class:"header-anchor",href:"#ai-编码","aria-label":'Permalink to "Ai 编码"'},"")],-1),n=e("p",null,"通过微调大模型学习框架特有写法,实现简单功能从 Api 接口到前端页面的一键生成",-1),d=e("p",null,[e("img",{src:r,alt:"","data-zoomable":""})],-1),l=e("p",null,[e("a",{href:"https://www.bilibili.com/video/BV1Hm421g7Br/?",target:"_blank",rel:"noreferrer"},"B 站视频教程")],-1),_=[c,n,d,l];function p(h,m,f,u,g,b){return i(),t("div",null,_)}const k=a(o,[["render",p]]);export{x as __pageData,k as default};
|
||||
@@ -0,0 +1,93 @@
|
||||
import{_ as s,c as i,o as a,a5 as n}from"./chunks/framework.C_oE5szm.js";const o=JSON.parse('{"title":"项目部署","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/deploy.md","filePath":"src/guide/deploy.md","lastUpdated":null}'),l={name:"src/guide/deploy.md"},h=n(`<h1 id="项目部署" tabindex="-1">项目部署 <a class="header-anchor" href="#项目部署" aria-label="Permalink to "项目部署""></a></h1><p><a href="https://cool-js.com/service/cloud" target="_blank" rel="noreferrer">🔥 低价云服务器推荐</a></p><div class="tip custom-block"><p class="custom-block-title">注意</p><p>以下教程以 Nodejs 版本为例,Java 版本的也可以参考</p></div><h2 id="普通方式" tabindex="-1">普通方式 <a class="header-anchor" href="#普通方式" aria-label="Permalink to "普通方式""></a></h2><p>本部署教程以 node 版本+宝塔为例,其他部署方式也可以参考这个流程。</p><p><a href="https://www.bilibili.com/video/BV1m1421S7tm/" target="_blank" rel="noreferrer">cool-admin 部署视频教程</a></p><h4 id="_1、部署流程-以宝塔为例" tabindex="-1">1、部署流程(以宝塔为例): <a class="header-anchor" href="#_1、部署流程-以宝塔为例" aria-label="Permalink to "1、部署流程(以宝塔为例):""></a></h4><ol><li>拉取前后端代码;</li><li>本地配置完数据库运行,等待数据库初始化完成;</li><li>打包前后端代码,打包之前注意配置生产环境的数据库配置<code>config/config.prod.ts</code>,<a href="http://www.midwayjs.org/docs/env_config" target="_blank" rel="noreferrer">查看 midway 官方多环境配置文档</a>;</li><li>服务器环境准备,安装宝塔、mysql、nodejs、nginx、pnpm 等;</li><li>上传前后端代码到服务器;</li><li>安装依赖,编译打包后端服务,启动服务;</li><li>配置 nginx 反向代理;</li><li>访问域名,如果一切正常,恭喜你,部署成功!</li></ol><div class="warning custom-block"><p class="custom-block-title">注意</p><ul><li>线上的数据库是需要本地传上去的,安全考虑生产环境不会自动初始化数据库;</li><li>前端访问后端的接口地址默认是前端根地址+/api,所以需要配置 nginx 反向代理/api 到后端服务;</li></ul></div><h4 id="_2、推荐使用-pnpm-安装依赖" tabindex="-1">2、推荐使用 pnpm 安装依赖 <a class="header-anchor" href="#_2、推荐使用-pnpm-安装依赖" aria-label="Permalink to "2、推荐使用 pnpm 安装依赖""></a></h4><p><a href="https://pnpm.io/" target="_blank" rel="noreferrer">pnpm 官网</a></p><p>安装</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -g</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> pnpm</span></span></code></pre></div><p>配置淘宝镜像</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> config</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> set</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> registry</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> https://registry.npmmirror.com</span></span></code></pre></div><h4 id="_3、pm2-运行后端服务" tabindex="-1">3、PM2 运行后端服务 <a class="header-anchor" href="#_3、pm2-运行后端服务" aria-label="Permalink to "3、PM2 运行后端服务""></a></h4><div class="language-shell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">//</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 命令行安装</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> pm2</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> pm2</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -g</span></span></code></pre></div><p>常用命令</p><div class="language-shell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">//</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 启动一个服务</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pm2</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> start</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">//</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 列出当前的服务</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pm2</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> list</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">//</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 停止某个服务</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pm2</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> stop</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">//</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 重启某个服务</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pm2</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> restart</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">//</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 删除某个服务</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pm2</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> delete</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">//</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 查看服务的输出日志</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pm2</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> logs</span></span></code></pre></div><p>cluster 方式启动</p><div class="language-shell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">//</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -i</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 表示</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> number-instances</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 实例数量</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">//</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> max</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 表示</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> PM2将自动检测可用CPU的数量</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 可以自己指定数量</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pm2</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> start</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ./bootstrap.js</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -i</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> max</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> cool-admin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">改成自己的应用名称</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">//</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 重启</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pm2</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> cool-admin</span></span></code></pre></div><p>日志</p><div class="language-shell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pm2</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> logs</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> cool-admin</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">//</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 默认的日志位置</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">/root/.pm2/logs</span></span></code></pre></div><h4 id="_4、nginx-配置示例" tabindex="-1">4、nginx 配置示例 <a class="header-anchor" href="#_4、nginx-配置示例" aria-label="Permalink to "4、nginx 配置示例""></a></h4><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">upstream cool {</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> server </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">127.0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0.1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">8001</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">server</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
|
||||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ...</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> # 前端打包完放这边</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> root </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">home</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">test</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">front;</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> # 防止刷新404</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> location </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> try_files $uri $uri</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">/</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> /</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">index.html;</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> # 代理服务端地址 访问</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">api 表示访问服务端接口而不是静态资源</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> location </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">api</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">/</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> proxy_pass </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">http</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//cool/;</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> proxy_set_header Host $host;</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> proxy_set_header </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">X</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">Real</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">IP</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> $remote_addr;</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> proxy_set_header </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">X</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">Forwarded</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">For $proxy_add_x_forwarded_for;</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> proxy_set_header </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">REMOTE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">HOST</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> $remote_addr;</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> proxy_cache_bypass no_cache;</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> #缓存相关配置</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> #proxy_cache cache_one;</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> #proxy_cache_key $host$request_uri$is_args$args;</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> #proxy_cache_valid </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">200</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 304</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 301</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 302</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> 1h;</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> #持久化连接相关配置</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> proxy_connect_timeout 3000s;</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> proxy_read_timeout 86400s;</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> proxy_send_timeout 3000s;</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> #proxy_http_version </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1.1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> #proxy_set_header Upgrade $http_upgrade;</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> #proxy_set_header Connection </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"upgrade"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> add_header </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">X</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">Cache $upstream_cache_status;</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> #expires 12h;</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> # socket需额外配置</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> location </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">socket {</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> proxy_pass </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">http</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//cool/socket;</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> proxy_connect_timeout 3600s; #配置点1</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> proxy_read_timeout 3600s; #配置点2,如果没效,可以考虑这个时间配置长一点</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> proxy_send_timeout 3600s; #配置点3</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> proxy_set_header Host $host;</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> proxy_set_header </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">X</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">Real</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">IP</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> $remote_addr;</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> proxy_set_header </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">X</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">Forwarded</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">For $proxy_add_x_forwarded_for;</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> proxy_set_header </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">REMOTE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">HOST</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> $remote_addr;</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> #proxy_bind $remote_addr transparent;</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> proxy_http_version </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1.1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> proxy_set_header Upgrade $http_upgrade;</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> proxy_set_header Connection </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"upgrade"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> rewrite </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">socket</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(.</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">$1 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">break</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> proxy_redirect off;</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><h2 id="docker-方式" tabindex="-1">Docker 方式 <a class="header-anchor" href="#docker-方式" aria-label="Permalink to "Docker 方式""></a></h2><p>docker 部署的配置方式可以参考普通的部署方式,以下是 docker 部署的简单流程;</p><p><a href="https://www.bilibili.com/video/BV14z421f7S9/" target="_blank" rel="noreferrer">cool-admin 部署视频教程(Docker 方式)</a></p><h4 id="_1、部署流程-以宝塔为例-1" tabindex="-1">1、部署流程(以宝塔为例): <a class="header-anchor" href="#_1、部署流程-以宝塔为例-1" aria-label="Permalink to "1、部署流程(以宝塔为例):""></a></h4><ol><li>拉取前后端代码;</li><li>本地配置完数据库运行,等待数据库初始化完成;</li><li>打包后端和前端镜像;</li><li>创建 docker network;</li><li>docker 运行后端和前端;</li><li>访问如果登录页正常出现验证码,恭喜你,部署成功!</li></ol><h4 id="_2、打包镜像" tabindex="-1">2、打包镜像 <a class="header-anchor" href="#_2、打包镜像" aria-label="Permalink to "2、打包镜像""></a></h4><div class="warning custom-block"><p class="custom-block-title">注意</p><p>打包镜像之前,需要确保前端和后端在本地运行过一次,让前端能够自动生成<code>eps.json</code>文件,该文件是前端自动扫描后端接口生成的,有了该文件,前端不需要特意写调用接口的 service。</p><p>如果你是自动化部署,你需要把生成的<code>eps.json</code>也提交到代码仓库,否则你将无法正常访问你的 api 接口。</p></div><div class="language-shell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">//</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 创建docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> network</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> network</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> create</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> cool</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">//</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 打包后端镜像</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -t</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> cool-admin-midway:1.0</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">//</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 打包前端镜像</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -t</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> cool-admin-vue:1.0</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .</span></span></code></pre></div><h4 id="_3、运行" tabindex="-1">3、运行 <a class="header-anchor" href="#_3、运行" aria-label="Permalink to "3、运行""></a></h4><div class="language-shell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">//</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 运行后端</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --network</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> cool</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 8001:8001</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> midway</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> cool-admin-midway:1.0</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">//</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 运行后端</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --network</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> cool</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 80:80</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> vue</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> cool-admin-vue:1.0</span></span></code></pre></div><h4 id="注意事项" tabindex="-1">注意事项 <a class="header-anchor" href="#注意事项" aria-label="Permalink to "注意事项""></a></h4><p>docker 部署,建议将缓存换成 redis,文件上传换成云存储,如:oss,防止操作不当导致的数据丢失。</p>`,37),p=[h];function t(k,e,r,d,E,F){return a(),i("div",null,p)}const c=s(l,[["render",t]]);export{o as __pageData,c as default};
|
||||
@@ -0,0 +1 @@
|
||||
import{_ as s,c as i,o as a,a5 as n}from"./chunks/framework.C_oE5szm.js";const o=JSON.parse('{"title":"项目部署","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/deploy.md","filePath":"src/guide/deploy.md","lastUpdated":null}'),l={name:"src/guide/deploy.md"},h=n("",37),p=[h];function t(k,e,r,d,E,F){return a(),i("div",null,p)}const c=s(l,[["render",t]]);export{o as __pageData,c as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as e,c as a,o as t,a5 as o,ab as i}from"./chunks/framework.C_oE5szm.js";const u=JSON.parse('{"title":"Ai 流程编排","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/flow.md","filePath":"src/guide/flow.md","lastUpdated":1721036629000}'),r={name:"src/guide/flow.md"},s=o('<h1 id="ai-流程编排" tabindex="-1">Ai 流程编排 <a class="header-anchor" href="#ai-流程编排" aria-label="Permalink to "Ai 流程编排""></a></h1><p>coming soon!!!</p><p><a href="https://cool-js.com/plugin/detail.html?id=105" target="_blank" rel="noreferrer">Nodejs 版本</a></p><p><a href="https://www.bilibili.com/video/BV1Dw4m1Y7m6/" target="_blank" rel="noreferrer">视频演示</a></p><p>开发 Ai 应用必备!!!</p><p>随着 Ai 的火热,很多应用希望接入 Ai 的能力,但是每次都是用代码手搓,容易把我们累死,而是也非常不灵活。</p><p>于是我们面向开发者和软件开发公司,做了一个 Ai 流程编排功能,结合知识库,通过拖动配置,很容易就能完成一个 Ai 的核心流程。</p><p>因此如果你需要开发 Ai 相关应用,这个可能会给你带来巨大的帮助。</p><p><img src="'+i+'" alt="流程编排" data-zoomable=""></p><div class="warning custom-block"><p class="custom-block-title">注意</p><p>Ai 流程编排+知识库届时会上架到插件市场</p></div>',10),p=[s];function c(l,_,n,d,m,f){return t(),a("div",null,p)}const A=e(r,[["render",c]]);export{u as __pageData,A as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as e,c as a,o as t,a5 as o,ab as i}from"./chunks/framework.C_oE5szm.js";const u=JSON.parse('{"title":"Ai 流程编排","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/flow.md","filePath":"src/guide/flow.md","lastUpdated":1721036629000}'),r={name:"src/guide/flow.md"},s=o("",10),p=[s];function c(l,_,n,d,m,f){return t(),a("div",null,p)}const A=e(r,[["render",c]]);export{u as __pageData,A as default};
|
||||
@@ -0,0 +1 @@
|
||||
import{_ as a,c as e,o as t,a5 as o,ab as i}from"./chunks/framework.C_oE5szm.js";const u=JSON.parse('{"title":"Ai 流程编排","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/flow.md","filePath":"src/guide/flow.md","lastUpdated":1721036629000}'),r={name:"src/guide/flow.md"},s=o('<h1 id="ai-流程编排" tabindex="-1">Ai 流程编排 <a class="header-anchor" href="#ai-流程编排" aria-label="Permalink to "Ai 流程编排""></a></h1><p>coming soon!!!</p><p><a href="https://www.bilibili.com/video/BV1Dw4m1Y7m6/" target="_blank" rel="noreferrer">视频演示</a></p><p>开发 Ai 应用必备!!!</p><p>随着 Ai 的火热,很多应用希望接入 Ai 的能力,但是每次都是用代码手搓,容易把我们累死,而是也非常不灵活。</p><p>于是我们面向开发者和软件开发公司,做了一个 Ai 流程编排功能,结合知识库,通过拖动配置,很容易就能完成一个 Ai 的核心流程。</p><p>因此如果你需要开发 Ai 相关应用,这个可能会给你带来巨大的帮助。</p><p><img src="'+i+'" alt="流程编排" data-zoomable=""></p><div class="warning custom-block"><p class="custom-block-title">注意</p><p>Ai 流程编排+知识库 Java 版本预计 8 月底 届时会上架到插件市场,可以先体验<a href="https://cool-js.com/plugin/detail.html?id=105" target="_blank" rel="noreferrer">NodeJs 版本</a></p></div>',9),c=[s];function l(p,_,n,d,m,f){return t(),e("div",null,c)}const A=a(r,[["render",l]]);export{u as __pageData,A as default};
|
||||
@@ -0,0 +1 @@
|
||||
import{_ as a,c as e,o as t,a5 as o,ab as i}from"./chunks/framework.C_oE5szm.js";const u=JSON.parse('{"title":"Ai 流程编排","description":"","frontmatter":{},"headers":[],"relativePath":"src/guide/flow.md","filePath":"src/guide/flow.md","lastUpdated":1721036629000}'),r={name:"src/guide/flow.md"},s=o("",9),c=[s];function l(p,_,n,d,m,f){return t(),e("div",null,c)}const A=a(r,[["render",l]]);export{u as __pageData,A as default};
|
||||
+1
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
Vendored
+1
-1
@@ -1 +1 @@
|
||||
{"index.md":"IDM-wWfu","readme.md":"21sdoxr8","src_about_index.md":"u0DlwXFy","src_guide_ai.md":"PrgLyacX","src_guide_cache.md":"TbXSwkcj","src_guide_controller.md":"DCo4_59t","src_guide_db.md":"Duwyo5Xx","src_guide_dev.md":"Dkd1jFPN","src_guide_dir.md":"RpZMF5oN","src_guide_exception.md":"B8TYnOY4","src_guide_flow.md":"Bg5zEnLF","src_guide_initdata.md":"CWyYHbHt","src_guide_plugin.md":"Har19Yp0","src_guide_quick.md":"B3Pgf-em","src_guide_security.md":"D2ao104D","src_guide_service.md":"DFVHuVBZ","src_guide_swagger.md":"Cb0cwFc8","src_guide_upload.md":"CxcWqhw1","src_introduce_index.md":"DA1PheMx","src_introduce_show.md":"D0p_OwAi","src_introduce_src.md":"B9s21jCc","src_question_common.md":"DOoSuwHd","src_todo_plan.md":"OECDxoZt","src_todo_update.md":"y1o13J5g"}
|
||||
{"index.md":"IDM-wWfu","readme.md":"21sdoxr8","src_about_index.md":"u0DlwXFy","src_guide_ai.md":"Bn1ZEhFs","src_guide_cache.md":"TbXSwkcj","src_guide_controller.md":"DCo4_59t","src_guide_db.md":"Duwyo5Xx","src_guide_deploy.md":"DiaIQEY0","src_guide_dev.md":"Dkd1jFPN","src_guide_dir.md":"RpZMF5oN","src_guide_exception.md":"B8TYnOY4","src_guide_flow.md":"CkZifxjx","src_guide_initdata.md":"CWyYHbHt","src_guide_plugin.md":"Har19Yp0","src_guide_quick.md":"B3Pgf-em","src_guide_security.md":"D2ao104D","src_guide_service.md":"DFVHuVBZ","src_guide_swagger.md":"Cb0cwFc8","src_guide_upload.md":"CxcWqhw1","src_introduce_index.md":"DA1PheMx","src_introduce_show.md":"D0p_OwAi","src_introduce_src.md":"B9s21jCc","src_question_common.md":"DOoSuwHd","src_todo_plan.md":"OECDxoZt","src_todo_update.md":"y1o13J5g"}
|
||||
|
||||
Vendored
+5
-5
File diff suppressed because one or more lines are too long
Vendored
+5
-5
File diff suppressed because one or more lines are too long
Vendored
+6
-6
File diff suppressed because one or more lines are too long
Vendored
+5
-5
File diff suppressed because one or more lines are too long
+5
-5
File diff suppressed because one or more lines are too long
Vendored
+5
-5
File diff suppressed because one or more lines are too long
+116
File diff suppressed because one or more lines are too long
Vendored
+5
-5
File diff suppressed because one or more lines are too long
Vendored
+5
-5
File diff suppressed because one or more lines are too long
+5
-5
File diff suppressed because one or more lines are too long
Vendored
+6
-6
File diff suppressed because one or more lines are too long
+5
-5
File diff suppressed because one or more lines are too long
+5
-5
File diff suppressed because one or more lines are too long
Vendored
+5
-5
File diff suppressed because one or more lines are too long
+5
-5
File diff suppressed because one or more lines are too long
+5
-5
File diff suppressed because one or more lines are too long
+6
-6
File diff suppressed because one or more lines are too long
+5
-5
File diff suppressed because one or more lines are too long
+5
-5
File diff suppressed because one or more lines are too long
+5
-5
File diff suppressed because one or more lines are too long
+5
-5
File diff suppressed because one or more lines are too long
+5
-5
File diff suppressed because one or more lines are too long
Vendored
+5
-5
File diff suppressed because one or more lines are too long
Vendored
+5
-5
File diff suppressed because one or more lines are too long
@@ -1,7 +1,6 @@
|
||||
import mediumZoom from "medium-zoom";
|
||||
import { useRoute } from "vitepress";
|
||||
import { nextTick, onMounted, watch } from "vue";
|
||||
import "./custom.css";
|
||||
import Layout from "./layout.vue";
|
||||
|
||||
export default {
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
<script setup>
|
||||
import DefaultTheme from "vitepress/theme";
|
||||
import { onMounted, reactive } from "vue";
|
||||
import "./custom.css";
|
||||
|
||||
const { Layout } = DefaultTheme;
|
||||
|
||||
@@ -33,9 +34,12 @@ const ad = reactive({
|
||||
get() {
|
||||
fetch("https://service.cool-js.com/api/app/info/ad/list", {
|
||||
method: "POST",
|
||||
body: {
|
||||
channel: 1,
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({
|
||||
channel: 1,
|
||||
}),
|
||||
})
|
||||
.then((res) => res.json())
|
||||
.then((res) => {
|
||||
|
||||
@@ -5,3 +5,5 @@
|
||||
{data-zoomable}
|
||||
|
||||
[B 站视频教程](https://www.bilibili.com/video/BV1Hm421g7Br/?)
|
||||
|
||||
[在线演示](https://show.cool-admin.com/helper/ai-code)
|
||||
|
||||
@@ -0,0 +1,208 @@
|
||||
# 项目部署
|
||||
|
||||
[🔥 低价云服务器推荐](https://cool-js.com/service/cloud)
|
||||
|
||||
::: tip 注意
|
||||
以下教程以 Nodejs 版本为例,Java 版本的也可以参考
|
||||
:::
|
||||
|
||||
## 普通方式
|
||||
|
||||
本部署教程以 node 版本+宝塔为例,其他部署方式也可以参考这个流程。
|
||||
|
||||
[cool-admin 部署视频教程](https://www.bilibili.com/video/BV1m1421S7tm/)
|
||||
|
||||
#### 1、部署流程(以宝塔为例):
|
||||
|
||||
1. 拉取前后端代码;
|
||||
2. 本地配置完数据库运行,等待数据库初始化完成;
|
||||
3. 打包前后端代码,打包之前注意配置生产环境的数据库配置`config/config.prod.ts`,[查看 midway 官方多环境配置文档](http://www.midwayjs.org/docs/env_config);
|
||||
4. 服务器环境准备,安装宝塔、mysql、nodejs、nginx、pnpm 等;
|
||||
5. 上传前后端代码到服务器;
|
||||
6. 安装依赖,编译打包后端服务,启动服务;
|
||||
7. 配置 nginx 反向代理;
|
||||
8. 访问域名,如果一切正常,恭喜你,部署成功!
|
||||
|
||||
::: warning 注意
|
||||
|
||||
- 线上的数据库是需要本地传上去的,安全考虑生产环境不会自动初始化数据库;
|
||||
- 前端访问后端的接口地址默认是前端根地址+/api,所以需要配置 nginx 反向代理/api 到后端服务;
|
||||
|
||||
:::
|
||||
|
||||
#### 2、推荐使用 pnpm 安装依赖
|
||||
|
||||
[pnpm 官网](https://pnpm.io/)
|
||||
|
||||
安装
|
||||
|
||||
```bash
|
||||
npm install -g pnpm
|
||||
```
|
||||
|
||||
配置淘宝镜像
|
||||
|
||||
```bash
|
||||
pnpm config set registry https://registry.npmmirror.com
|
||||
```
|
||||
|
||||
#### 3、PM2 运行后端服务
|
||||
|
||||
```shell
|
||||
// 命令行安装 pm2
|
||||
npm install pm2 -g
|
||||
```
|
||||
|
||||
常用命令
|
||||
|
||||
```shell
|
||||
// 启动一个服务
|
||||
pm2 start
|
||||
// 列出当前的服务
|
||||
pm2 list
|
||||
// 停止某个服务
|
||||
pm2 stop
|
||||
// 重启某个服务
|
||||
pm2 restart
|
||||
// 删除某个服务
|
||||
pm2 delete
|
||||
// 查看服务的输出日志
|
||||
pm2 logs
|
||||
```
|
||||
|
||||
cluster 方式启动
|
||||
|
||||
```shell
|
||||
// -i 表示 number-instances 实例数量
|
||||
// max 表示 PM2将自动检测可用CPU的数量 可以自己指定数量
|
||||
pm2 start ./bootstrap.js -i max --name cool-admin(改成自己的应用名称)
|
||||
|
||||
// 重启
|
||||
pm2 restart cool-admin
|
||||
```
|
||||
|
||||
日志
|
||||
|
||||
```shell
|
||||
pm2 logs cool-admin
|
||||
|
||||
// 默认的日志位置
|
||||
/root/.pm2/logs
|
||||
```
|
||||
|
||||
#### 4、nginx 配置示例
|
||||
|
||||
```ts
|
||||
upstream cool {
|
||||
server 127.0.0.1:8001;
|
||||
}
|
||||
server
|
||||
{
|
||||
...
|
||||
# 前端打包完放这边
|
||||
root /home/test/front;
|
||||
|
||||
# 防止刷新404
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
# 代理服务端地址 访问/api 表示访问服务端接口而不是静态资源
|
||||
location /api/
|
||||
{
|
||||
proxy_pass http://cool/;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header REMOTE-HOST $remote_addr;
|
||||
|
||||
proxy_cache_bypass no_cache;
|
||||
|
||||
#缓存相关配置
|
||||
#proxy_cache cache_one;
|
||||
#proxy_cache_key $host$request_uri$is_args$args;
|
||||
#proxy_cache_valid 200 304 301 302 1h;
|
||||
|
||||
#持久化连接相关配置
|
||||
proxy_connect_timeout 3000s;
|
||||
proxy_read_timeout 86400s;
|
||||
proxy_send_timeout 3000s;
|
||||
#proxy_http_version 1.1;
|
||||
#proxy_set_header Upgrade $http_upgrade;
|
||||
#proxy_set_header Connection "upgrade";
|
||||
|
||||
add_header X-Cache $upstream_cache_status;
|
||||
|
||||
#expires 12h;
|
||||
}
|
||||
|
||||
# socket需额外配置
|
||||
location /socket {
|
||||
proxy_pass http://cool/socket;
|
||||
proxy_connect_timeout 3600s; #配置点1
|
||||
proxy_read_timeout 3600s; #配置点2,如果没效,可以考虑这个时间配置长一点
|
||||
proxy_send_timeout 3600s; #配置点3
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header REMOTE-HOST $remote_addr;
|
||||
#proxy_bind $remote_addr transparent;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
rewrite /socket/(.*) /$1 break;
|
||||
proxy_redirect off;
|
||||
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Docker 方式
|
||||
|
||||
docker 部署的配置方式可以参考普通的部署方式,以下是 docker 部署的简单流程;
|
||||
|
||||
[cool-admin 部署视频教程(Docker 方式)](https://www.bilibili.com/video/BV14z421f7S9/)
|
||||
|
||||
#### 1、部署流程(以宝塔为例):
|
||||
|
||||
1. 拉取前后端代码;
|
||||
2. 本地配置完数据库运行,等待数据库初始化完成;
|
||||
3. 打包后端和前端镜像;
|
||||
4. 创建 docker network;
|
||||
5. docker 运行后端和前端;
|
||||
6. 访问如果登录页正常出现验证码,恭喜你,部署成功!
|
||||
|
||||
#### 2、打包镜像
|
||||
|
||||
::: warning 注意
|
||||
打包镜像之前,需要确保前端和后端在本地运行过一次,让前端能够自动生成`eps.json`文件,该文件是前端自动扫描后端接口生成的,有了该文件,前端不需要特意写调用接口的 service。
|
||||
|
||||
如果你是自动化部署,你需要把生成的`eps.json`也提交到代码仓库,否则你将无法正常访问你的 api 接口。
|
||||
:::
|
||||
|
||||
```shell
|
||||
// 创建docker network
|
||||
docker network create cool
|
||||
|
||||
// 打包后端镜像
|
||||
docker build -t cool-admin-midway:1.0 .
|
||||
|
||||
// 打包前端镜像
|
||||
docker build -t cool-admin-vue:1.0 .
|
||||
|
||||
```
|
||||
|
||||
#### 3、运行
|
||||
|
||||
```shell
|
||||
// 运行后端
|
||||
docker run --network cool -p 8001:8001 --name midway cool-admin-midway:1.0
|
||||
|
||||
// 运行后端
|
||||
docker run --network cool -p 80:80 --name vue cool-admin-vue:1.0
|
||||
|
||||
```
|
||||
|
||||
#### 注意事项
|
||||
|
||||
docker 部署,建议将缓存换成 redis,文件上传换成云存储,如:oss,防止操作不当导致的数据丢失。
|
||||
+1
-3
@@ -2,8 +2,6 @@
|
||||
|
||||
coming soon!!!
|
||||
|
||||
[Nodejs 版本](https://cool-js.com/plugin/detail.html?id=105)
|
||||
|
||||
[视频演示](https://www.bilibili.com/video/BV1Dw4m1Y7m6/)
|
||||
|
||||
开发 Ai 应用必备!!!
|
||||
@@ -18,6 +16,6 @@ coming soon!!!
|
||||
|
||||
::: warning 注意
|
||||
|
||||
Ai 流程编排+知识库届时会上架到插件市场
|
||||
Ai 流程编排+知识库 Java 版本预计 8 月底 届时会上架到插件市场,可以先体验[NodeJs 版本](https://cool-js.com/plugin/detail.html?id=105)
|
||||
|
||||
:::
|
||||
|
||||
Reference in New Issue
Block a user