diff --git a/404.html b/404.html index c3f01423..69296a8d 100644 --- a/404.html +++ b/404.html @@ -4,13 +4,13 @@ 找不到页面 | 春松客服 - +
跳到主要内容

找不到页面

我们找不到您要找的页面。

请联系原始链接来源网站的所有者,并告知他们链接已损坏。

- + \ No newline at end of file diff --git a/assets/js/356b3536.2bb02fd6.js b/assets/js/356b3536.2bb02fd6.js deleted file mode 100644 index 6db87116..00000000 --- a/assets/js/356b3536.2bb02fd6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcskefu_docs=self.webpackChunkcskefu_docs||[]).push([[2346],{3905:(t,l,n)=>{n.d(l,{Zo:()=>c,kt:()=>i});var e=n(67294);function r(t,l,n){return l in t?Object.defineProperty(t,l,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[l]=n,t}function u(t,l){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var e=Object.getOwnPropertySymbols(t);l&&(e=e.filter((function(l){return Object.getOwnPropertyDescriptor(t,l).enumerable}))),n.push.apply(n,e)}return n}function o(t){for(var l=1;l=0||(r[n]=t[n]);return r}(t,l);if(Object.getOwnPropertySymbols){var u=Object.getOwnPropertySymbols(t);for(e=0;e=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(r[n]=t[n])}return r}var k=e.createContext({}),d=function(t){var l=e.useContext(k),n=l;return t&&(n="function"==typeof t?t(l):o(o({},l),t)),n},c=function(t){var l=d(t.components);return e.createElement(k.Provider,{value:l},t.children)},p={inlineCode:"code",wrapper:function(t){var l=t.children;return e.createElement(e.Fragment,{},l)}},s=e.forwardRef((function(t,l){var n=t.components,r=t.mdxType,u=t.originalType,k=t.parentName,c=a(t,["components","mdxType","originalType","parentName"]),s=d(n),i=r,f=s["".concat(k,".").concat(i)]||s[i]||p[i]||u;return n?e.createElement(f,o(o({ref:l},c),{},{components:n})):e.createElement(f,o({ref:l},c))}));function i(t,l){var n=arguments,r=l&&l.mdxType;if("string"==typeof t||r){var u=n.length,o=new Array(u);o[0]=s;var a={};for(var k in l)hasOwnProperty.call(l,k)&&(a[k]=l[k]);a.originalType=t,a.mdxType="string"==typeof t?t:r,o[1]=a;for(var d=2;d{n.r(l),n.d(l,{assets:()=>k,contentTitle:()=>o,default:()=>p,frontMatter:()=>u,metadata:()=>a,toc:()=>d});var e=n(87462),r=(n(67294),n(3905));const u={sidebar_position:2},o="\u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802",a={unversionedId:"osc/training",id:"version-v8/osc/training",title:"\u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802",description:"\ud83d\ude09 \u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802\uff0c\u9762\u5411\u5f00\u53d1\u8005\u3001\u8f6f\u4ef6\u5de5\u7a0b\u5e08\u53ca\u8fd0\u7ef4\u4eba\u5458\u7684\u5728\u7ebf\u8bfe\u7a0b\uff08\u89c6\u9891\u53ca\u8bfe\u4ef6\uff09\u3002",source:"@site/versioned_docs/version-v8/osc/training.md",sourceDirName:"osc",slug:"/osc/training",permalink:"/cskefu-docs/docs/osc/training",draft:!1,editUrl:"https://github.com/cskefu/docs/tree/main/packages/create-docusaurus/templates/shared/versioned_docs/version-v8/osc/training.md",tags:[],version:"v8",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005",permalink:"/cskefu-docs/docs/osc/devonboard"},next:{title:"\u63d0\u4ea4\u4ee3\u7801",permalink:"/cskefu-docs/docs/osc/contribution"}},k={},d=[{value:"\u8d2d\u4e70\u5730\u5740",id:"\u8d2d\u4e70\u5730\u5740",level:2},{value:"\u8bfe\u7a0b\u5927\u7eb2",id:"\u8bfe\u7a0b\u5927\u7eb2",level:2},{value:"\u4e0b\u8f7d\u8bfe\u7a0b\u6587\u4ef6",id:"\u4e0b\u8f7d\u8bfe\u7a0b\u6587\u4ef6",level:2}],c={toc:d};function p(t){let{components:l,...u}=t;return(0,r.kt)("wrapper",(0,e.Z)({},c,u,{components:l,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"\u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802"},"\u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802"),(0,r.kt)("p",null,"\ud83d\ude09 \u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802\uff0c\u9762\u5411\u5f00\u53d1\u8005\u3001\u8f6f\u4ef6\u5de5\u7a0b\u5e08\u53ca\u8fd0\u7ef4\u4eba\u5458\u7684\u5728\u7ebf\u8bfe\u7a0b\uff08\u89c6\u9891\u53ca\u8bfe\u4ef6\uff09\u3002"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u57fa\u4e8e\u6625\u677e\u5ba2\u670d\u5b9a\u5236\u5ba2\u670d\u7cfb\u7edf\uff0c\u7d27\u7d27\u56f4\u7ed5\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u6280\u80fd"),(0,r.kt)("li",{parentName:"ul"},"\u7531\u6d45\u5165\u6df1\u7684\u4ecb\u7ecd\u6625\u677e\u5ba2\u670d\u4e0a\u7ebf\u667a\u80fd\u5ba2\u670d\u7cfb\u7edf\u3001\u8fd0\u8425\u5ba2\u670d\u5de5\u4f5c"),(0,r.kt)("li",{parentName:"ul"},"\u5168\u9762\u4ecb\u7ecd\u6625\u677e\u5ba2\u670d\u63d2\u4ef6\u3001\u673a\u5668\u4eba\u5ba2\u670d\u7684\u7b49\u539f\u7406\u548c\u4f7f\u7528")),(0,r.kt)("h2",{id:"\u8d2d\u4e70\u5730\u5740"},"\u8d2d\u4e70\u5730\u5740"),(0,r.kt)("p",null,"\u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802\u901a\u8fc7 Chatopera \u8bc1\u4e66\u5546\u5e97\u8fdb\u884c\u51fa\u552e\uff0c\u901a\u8fc7\u8d2d\u4e70\u7684\u3010\u8bc1\u4e66\u6807\u8bc6\u3011\u83b7\u5f97\u4e0b\u8f7d URL \u5730\u5740\uff0c\u6216\u626b\u4e0b\u56fe\u4e8c\u7ef4\u7801\u3002"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://store.chatopera.com/product/cskfdjt19"},"https://store.chatopera.com/product/cskfdjt19")),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(99759).Z,width:"1080",height:"767"})),(0,r.kt)("h2",{id:"\u8bfe\u7a0b\u5927\u7eb2"},"\u8bfe\u7a0b\u5927\u7eb2"),(0,r.kt)("p",null,"\u5171 7 \u7ae0\uff0c\u5408\u8ba1 21 \u5b66\u65f6\u89c6\u9891\uff0c552 \u9875 PPT \u8bfe\u4ef6\u3002"),(0,r.kt)("table",null,(0,r.kt)("tr",null,(0,r.kt)("th",null,"\u7ae0"),(0,r.kt)("th",null,"\u5c0f\u8282"),(0,r.kt)("th",null,"\u65f6\u957f\uff08\u65f6:\u5206:\u79d2\uff09")),(0,r.kt)("tr",null,(0,r.kt)("td",{rowspan:"3"},"\u4e00\u3001\u6625\u677e\u5ba2\u670d\u7684\u4ecb\u7ecd"),(0,r.kt)("td",null,"\u5982\u4f55\u4f7f\u7528Java\u5f00\u53d1\u667a\u80fd\u5ba2\u670d\u7cfb\u7edf"),(0,r.kt)("td",null,"00:31:55")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u6625\u677e\u5ba2\u670d\u5728\u4f01\u4e1a\u7684\u843d\u5730"),(0,r.kt)("td",null,"00:25:23")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u6625\u677e\u5ba2\u670d\u7684\u6280\u672f\u4ecb\u7ecd"),(0,r.kt)("td",null,"01:01:30")),(0,r.kt)("tr",null,(0,r.kt)("td",{rowspan:"7"},"\u4e8c\u3001\u5ba2\u670d\u76f8\u5173\u7684\u57fa\u672c\u77e5\u8bc6"),(0,r.kt)("td",null,"\u5ba2\u670d\u7684\u65e5\u5e38\u5de5\u4f5c"),(0,r.kt)("td",null,"00:52:44")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u5ba2\u670d\u7684\u57fa\u672c\u77e5\u8bc6"),(0,r.kt)("td",null,"00:41:40")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u8d26\u53f7\u4f53\u7cfb-\u6743\u9650\uff0c\u90e8\u95e8\u548c\u89d2\u8272"),(0,r.kt)("td",null,"00:38:42")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u5750\u5e2d\u4f1a\u8bdd\u7684\u5de5\u5177-\u62c9\u9ed1\uff0c\u670d\u52a1\u5c0f\u7ed3\u548c\u8f6c\u63a5"),(0,r.kt)("td",null,"00:32:16")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u5373\u65f6\u901a\u4fe1\u53ca\u5750\u5e2d\u81ea\u52a8\u5206\u914d"),(0,r.kt)("td",null,"00:49:59")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u4f01\u4e1a\u804a\u5929\u4e0e\u4eba\u5de5\u8d28\u68c0"),(0,r.kt)("td",null,"00:31:16")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u7edf\u8ba1\u62a5\u8868\u548c\u6ee1\u610f\u5ea6\u8bc4\u4ef7"),(0,r.kt)("td",null,"00:36:59")),(0,r.kt)("tr",null,(0,r.kt)("td",{rowspan:"6"},"\u4e09\u3001\u6625\u677e\u5ba2\u670d\u7684\u4e0a\u7ebf\u53ca\u7ef4\u62a4"),(0,r.kt)("td",null,"\u6625\u677e\u5ba2\u670d\u7684\u7f16\u8bd1\u548c\u90e8\u7f72"),(0,r.kt)("td",null,"00:37:28")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u6625\u677e\u5ba2\u670d\u7684\u8fd0\u7ef4\u7ba1\u7406"),(0,r.kt)("td",null,"00:59:26")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u6625\u677e\u5ba2\u670d\u7684\u81ea\u52a8\u5316\u7cfb\u7edf\u6d4b\u8bd5\uff081\uff09"),(0,r.kt)("td",null,"00:31:28")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u6625\u677e\u5ba2\u670d\u7684\u81ea\u52a8\u5316\u7cfb\u7edf\u6d4b\u8bd5\uff082\uff09"),(0,r.kt)("td",null,"00:48:43")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u6625\u677e\u5ba2\u670d\u7684\u538b\u529b\u6d4b\u8bd5\uff081\uff09"),(0,r.kt)("td",null,"00:31:52")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u6625\u677e\u5ba2\u670d\u7684\u538b\u529b\u6d4b\u8bd5\uff082\uff09"),(0,r.kt)("td",null,"00:39:36")),(0,r.kt)("tr",null,(0,r.kt)("td",{rowspan:"3"},"\u56db\u3001\u6625\u677e\u5ba2\u670d\u7684\u673a\u5668\u4eba\u5ba2\u670d"),(0,r.kt)("td",null,"Chatopera \u4e91\u670d\u52a1\u4ecb\u7ecd"),(0,r.kt)("td",null,"00:26:23")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u673a\u5668\u4eba\u7684\u77e5\u8bc6\u5e93\u7ba1\u7406"),(0,r.kt)("td",null,"00:38:27")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u673a\u5668\u4eba\u7684\u591a\u8f6e\u5bf9\u8bdd\u53ca\u5bcc\u6587\u672c\u6d88\u606f\u7c7b\u578b"),(0,r.kt)("td",null,"00:35:08")),(0,r.kt)("tr",null,(0,r.kt)("td",{rowspan:"8"},"\u4e94\u3001\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u57fa\u7840\u77e5\u8bc6"),(0,r.kt)("td",null,"SQL\u5feb\u901f\u5165\u95e8"),(0,r.kt)("td",null,"00:38:38")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u6625\u677e\u5ba2\u670d\u6570\u636e\u5e93\u8868\u53ca\u7ba1\u7406"),(0,r.kt)("td",null,"00:41:44")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"Java\u7f16\u7a0b\u57fa\u7840\uff081\uff09"),(0,r.kt)("td",null,"00:36:12")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"Java\u7f16\u7a0b\u57fa\u7840\uff082\uff09"),(0,r.kt)("td",null,"01:34:23")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"Maven\u9879\u76ee\u7ba1\u7406"),(0,r.kt)("td",null,"00:39:56")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u642d\u5efa\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u73af\u5883"),(0,r.kt)("td",null,"01:10:28")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"SpringBoot\u5feb\u901f\u5165\u95e8"),(0,r.kt)("td",null,"00:38:46")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u9879\u76ee\u6e90\u7801\u8bb2\u89e3"),(0,r.kt)("td",null,"01:07:21")),(0,r.kt)("tr",null,(0,r.kt)("td",{rowspan:"2"},"\u516d\u3001\u6625\u677e\u5ba2\u670d\u7684\u63d2\u4ef6"),(0,r.kt)("td",null,"\u63d2\u4ef6\u673a\u5236\u8bbe\u8ba1"),(0,r.kt)("td",null,"00:36:21")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u6625\u677e\u5ba2\u670d\u673a\u5668\u4eba\u63d2\u4ef6\u89e3\u8bfb"),(0,r.kt)("td",null,"00:37:59")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u4e03\u3001\u603b\u7ed3"),(0,r.kt)("td",null,"\u6625\u677e\u5ba2\u670d\u56e2\u961f\u4ecb\u7ecd\u53ca\u8bfe\u7a0b\u603b\u7ed3"),(0,r.kt)("td",null,"00:30:08"))),(0,r.kt)("h2",{id:"\u4e0b\u8f7d\u8bfe\u7a0b\u6587\u4ef6"},"\u4e0b\u8f7d\u8bfe\u7a0b\u6587\u4ef6"),(0,r.kt)("p",null,"\u5728 ",(0,r.kt)("a",{parentName:"p",href:"https://store.chatopera.com/product/cskfdjt19"},"Chatopera \u8bc1\u4e66\u5546\u5e97")," \u83b7\u5f97\u5230\u8bc1\u4e66 ID\uff08",(0,r.kt)("inlineCode",{parentName:"p"},"LICENSE_ID"),"\uff09 \u540e\uff0c\u6587\u4ef6\u7684\u4e0b\u8f7d\u5730\u5740\u4e3a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://store.chatopera.com/dl/$%7BLICENSE_ID%7D.gz"},"https://store.chatopera.com/dl/${LICENSE_ID}.gz")),(0,r.kt)("p",null,"\u5c06 ",(0,r.kt)("inlineCode",{parentName:"p"},"${LICENSE_ID}")," \u66ff\u6362\u4e3a\u60a8\u7684\u8bc1\u4e66\u6807\u8bc6\u3002\u5047\u8bbe\u4e0a\u4e00\u6b65\u5f97\u5230\u7684\u8bc1\u4e66\u6807\u8bc6\u4e3a\uff1a",(0,r.kt)("inlineCode",{parentName:"p"},"L123"),"\uff0c\u90a3\u4e48 URL \u4e0b\u8f7d\u5730\u5740\u5c31\u662f\uff1a"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://store.chatopera.com/dl/L123.gz"},"https://store.chatopera.com/dl/L123.gz")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\u5c06\u60a8\u7684\u8bfe\u7a0b\u6587\u4ef6\u7684 URL \u4e0b\u8f7d\u5730\u5740\u5728\u6d4f\u89c8\u5668\u4e2d\u6253\u5f00\uff0c\u5b8c\u6210\u4e0b\u8f7d\uff0c\u6587\u4ef6\u5927\u5c0f\u7ea6 3.5 GB\u3002\u60a8\u4e5f\u53ef\u4ee5\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"strong"},"wget")," \u547d\u4ee4\u884c\u5de5\u5177\u4ece\u547d\u4ee4\u884c\u7ec8\u7aef\uff08\u6bd4\u5982 Bash Shell\uff09\u4e0b\u8f7d\u548c\u89e3\u538b\u3002")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"wget https://store.chatopera.com/dl/L123.gz -O cskfdjt.tar.gz\ntar xzfv cskfdjt.tar.gz # \u8fdb\u884c\u89e3\u538b\n")))}p.isMDXComponent=!0},99759:(t,l,n)=>{n.d(l,{Z:()=>e});const e=n.p+"assets/images/cskfdjt19_product_store_qr-97b8dbce3961509ccfc7c727ab3acf80.jpg"}}]); \ No newline at end of file diff --git a/assets/js/356b3536.66551306.js b/assets/js/356b3536.66551306.js new file mode 100644 index 00000000..a088997e --- /dev/null +++ b/assets/js/356b3536.66551306.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcskefu_docs=self.webpackChunkcskefu_docs||[]).push([[2346],{3905:(t,l,n)=>{n.d(l,{Zo:()=>c,kt:()=>i});var e=n(67294);function r(t,l,n){return l in t?Object.defineProperty(t,l,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[l]=n,t}function u(t,l){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var e=Object.getOwnPropertySymbols(t);l&&(e=e.filter((function(l){return Object.getOwnPropertyDescriptor(t,l).enumerable}))),n.push.apply(n,e)}return n}function a(t){for(var l=1;l=0||(r[n]=t[n]);return r}(t,l);if(Object.getOwnPropertySymbols){var u=Object.getOwnPropertySymbols(t);for(e=0;e=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(r[n]=t[n])}return r}var k=e.createContext({}),d=function(t){var l=e.useContext(k),n=l;return t&&(n="function"==typeof t?t(l):a(a({},l),t)),n},c=function(t){var l=d(t.components);return e.createElement(k.Provider,{value:l},t.children)},p={inlineCode:"code",wrapper:function(t){var l=t.children;return e.createElement(e.Fragment,{},l)}},s=e.forwardRef((function(t,l){var n=t.components,r=t.mdxType,u=t.originalType,k=t.parentName,c=o(t,["components","mdxType","originalType","parentName"]),s=d(n),i=r,f=s["".concat(k,".").concat(i)]||s[i]||p[i]||u;return n?e.createElement(f,a(a({ref:l},c),{},{components:n})):e.createElement(f,a({ref:l},c))}));function i(t,l){var n=arguments,r=l&&l.mdxType;if("string"==typeof t||r){var u=n.length,a=new Array(u);a[0]=s;var o={};for(var k in l)hasOwnProperty.call(l,k)&&(o[k]=l[k]);o.originalType=t,o.mdxType="string"==typeof t?t:r,a[1]=o;for(var d=2;d{n.r(l),n.d(l,{assets:()=>k,contentTitle:()=>a,default:()=>p,frontMatter:()=>u,metadata:()=>o,toc:()=>d});var e=n(87462),r=(n(67294),n(3905));const u={sidebar_position:2},a="\u5b9a\u5236\u5f00\u53d1\u6559\u7a0b",o={unversionedId:"osc/training",id:"version-v8/osc/training",title:"\u5b9a\u5236\u5f00\u53d1\u6559\u7a0b",description:"\ud83d\ude09 \u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802\uff0c\u9762\u5411\u5f00\u53d1\u8005\u3001\u8f6f\u4ef6\u5de5\u7a0b\u5e08\u53ca\u8fd0\u7ef4\u4eba\u5458\u7684\u5728\u7ebf\u8bfe\u7a0b\uff08\u89c6\u9891\u53ca\u8bfe\u4ef6\uff09\u3002",source:"@site/versioned_docs/version-v8/osc/training.md",sourceDirName:"osc",slug:"/osc/training",permalink:"/cskefu-docs/docs/osc/training",draft:!1,editUrl:"https://github.com/cskefu/docs/tree/main/packages/create-docusaurus/templates/shared/versioned_docs/version-v8/osc/training.md",tags:[],version:"v8",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005",permalink:"/cskefu-docs/docs/osc/devonboard"},next:{title:"\u63d0\u4ea4\u4ee3\u7801",permalink:"/cskefu-docs/docs/osc/contribution"}},k={},d=[{value:"\u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802",id:"\u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802",level:2},{value:"\u8d2d\u4e70\u5730\u5740",id:"\u8d2d\u4e70\u5730\u5740",level:2},{value:"\u4e0b\u8f7d\u8bfe\u7a0b\u6587\u4ef6",id:"\u4e0b\u8f7d\u8bfe\u7a0b\u6587\u4ef6",level:2}],c={toc:d};function p(t){let{components:l,...u}=t;return(0,r.kt)("wrapper",(0,e.Z)({},c,u,{components:l,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"\u5b9a\u5236\u5f00\u53d1\u6559\u7a0b"},"\u5b9a\u5236\u5f00\u53d1\u6559\u7a0b"),(0,r.kt)("p",null,"\ud83d\ude09 \u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802\uff0c\u9762\u5411\u5f00\u53d1\u8005\u3001\u8f6f\u4ef6\u5de5\u7a0b\u5e08\u53ca\u8fd0\u7ef4\u4eba\u5458\u7684\u5728\u7ebf\u8bfe\u7a0b\uff08\u89c6\u9891\u53ca\u8bfe\u4ef6\uff09\u3002"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u57fa\u4e8e\u6625\u677e\u5ba2\u670d\u5b9a\u5236\u5ba2\u670d\u7cfb\u7edf\uff0c\u7d27\u7d27\u56f4\u7ed5\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u6280\u80fd"),(0,r.kt)("li",{parentName:"ul"},"\u7531\u6d45\u5165\u6df1\u7684\u4ecb\u7ecd\u6625\u677e\u5ba2\u670d\u4e0a\u7ebf\u667a\u80fd\u5ba2\u670d\u7cfb\u7edf\u3001\u8fd0\u8425\u5ba2\u670d\u5de5\u4f5c"),(0,r.kt)("li",{parentName:"ul"},"\u5168\u9762\u4ecb\u7ecd\u6625\u677e\u5ba2\u670d\u63d2\u4ef6\u3001\u673a\u5668\u4eba\u5ba2\u670d\u7684\u7b49\u539f\u7406\u548c\u4f7f\u7528")),(0,r.kt)("h2",{id:"\u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802"},"\u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802"),(0,r.kt)("p",null,"\u5171 7 \u7ae0\uff0c\u5408\u8ba1 21 \u5b66\u65f6\u89c6\u9891\uff0c552 \u9875 PPT \u8bfe\u4ef6\u3002"),(0,r.kt)("table",null,(0,r.kt)("tr",null,(0,r.kt)("th",null,"\u7ae0"),(0,r.kt)("th",null,"\u5c0f\u8282"),(0,r.kt)("th",null,"\u65f6\u957f\uff08\u65f6:\u5206:\u79d2\uff09")),(0,r.kt)("tr",null,(0,r.kt)("td",{rowspan:"3"},"\u4e00\u3001\u6625\u677e\u5ba2\u670d\u7684\u4ecb\u7ecd"),(0,r.kt)("td",null,"\u5982\u4f55\u4f7f\u7528Java\u5f00\u53d1\u667a\u80fd\u5ba2\u670d\u7cfb\u7edf"),(0,r.kt)("td",null,"00:31:55")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u6625\u677e\u5ba2\u670d\u5728\u4f01\u4e1a\u7684\u843d\u5730"),(0,r.kt)("td",null,"00:25:23")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u6625\u677e\u5ba2\u670d\u7684\u6280\u672f\u4ecb\u7ecd"),(0,r.kt)("td",null,"01:01:30")),(0,r.kt)("tr",null,(0,r.kt)("td",{rowspan:"7"},"\u4e8c\u3001\u5ba2\u670d\u76f8\u5173\u7684\u57fa\u672c\u77e5\u8bc6"),(0,r.kt)("td",null,"\u5ba2\u670d\u7684\u65e5\u5e38\u5de5\u4f5c"),(0,r.kt)("td",null,"00:52:44")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u5ba2\u670d\u7684\u57fa\u672c\u77e5\u8bc6"),(0,r.kt)("td",null,"00:41:40")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u8d26\u53f7\u4f53\u7cfb-\u6743\u9650\uff0c\u90e8\u95e8\u548c\u89d2\u8272"),(0,r.kt)("td",null,"00:38:42")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u5750\u5e2d\u4f1a\u8bdd\u7684\u5de5\u5177-\u62c9\u9ed1\uff0c\u670d\u52a1\u5c0f\u7ed3\u548c\u8f6c\u63a5"),(0,r.kt)("td",null,"00:32:16")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u5373\u65f6\u901a\u4fe1\u53ca\u5750\u5e2d\u81ea\u52a8\u5206\u914d"),(0,r.kt)("td",null,"00:49:59")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u4f01\u4e1a\u804a\u5929\u4e0e\u4eba\u5de5\u8d28\u68c0"),(0,r.kt)("td",null,"00:31:16")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u7edf\u8ba1\u62a5\u8868\u548c\u6ee1\u610f\u5ea6\u8bc4\u4ef7"),(0,r.kt)("td",null,"00:36:59")),(0,r.kt)("tr",null,(0,r.kt)("td",{rowspan:"6"},"\u4e09\u3001\u6625\u677e\u5ba2\u670d\u7684\u4e0a\u7ebf\u53ca\u7ef4\u62a4"),(0,r.kt)("td",null,"\u6625\u677e\u5ba2\u670d\u7684\u7f16\u8bd1\u548c\u90e8\u7f72"),(0,r.kt)("td",null,"00:37:28")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u6625\u677e\u5ba2\u670d\u7684\u8fd0\u7ef4\u7ba1\u7406"),(0,r.kt)("td",null,"00:59:26")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u6625\u677e\u5ba2\u670d\u7684\u81ea\u52a8\u5316\u7cfb\u7edf\u6d4b\u8bd5\uff081\uff09"),(0,r.kt)("td",null,"00:31:28")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u6625\u677e\u5ba2\u670d\u7684\u81ea\u52a8\u5316\u7cfb\u7edf\u6d4b\u8bd5\uff082\uff09"),(0,r.kt)("td",null,"00:48:43")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u6625\u677e\u5ba2\u670d\u7684\u538b\u529b\u6d4b\u8bd5\uff081\uff09"),(0,r.kt)("td",null,"00:31:52")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u6625\u677e\u5ba2\u670d\u7684\u538b\u529b\u6d4b\u8bd5\uff082\uff09"),(0,r.kt)("td",null,"00:39:36")),(0,r.kt)("tr",null,(0,r.kt)("td",{rowspan:"3"},"\u56db\u3001\u6625\u677e\u5ba2\u670d\u7684\u673a\u5668\u4eba\u5ba2\u670d"),(0,r.kt)("td",null,"Chatopera \u4e91\u670d\u52a1\u4ecb\u7ecd"),(0,r.kt)("td",null,"00:26:23")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u673a\u5668\u4eba\u7684\u77e5\u8bc6\u5e93\u7ba1\u7406"),(0,r.kt)("td",null,"00:38:27")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u673a\u5668\u4eba\u7684\u591a\u8f6e\u5bf9\u8bdd\u53ca\u5bcc\u6587\u672c\u6d88\u606f\u7c7b\u578b"),(0,r.kt)("td",null,"00:35:08")),(0,r.kt)("tr",null,(0,r.kt)("td",{rowspan:"8"},"\u4e94\u3001\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u57fa\u7840\u77e5\u8bc6"),(0,r.kt)("td",null,"SQL\u5feb\u901f\u5165\u95e8"),(0,r.kt)("td",null,"00:38:38")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u6625\u677e\u5ba2\u670d\u6570\u636e\u5e93\u8868\u53ca\u7ba1\u7406"),(0,r.kt)("td",null,"00:41:44")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"Java\u7f16\u7a0b\u57fa\u7840\uff081\uff09"),(0,r.kt)("td",null,"00:36:12")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"Java\u7f16\u7a0b\u57fa\u7840\uff082\uff09"),(0,r.kt)("td",null,"01:34:23")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"Maven\u9879\u76ee\u7ba1\u7406"),(0,r.kt)("td",null,"00:39:56")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u642d\u5efa\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u73af\u5883"),(0,r.kt)("td",null,"01:10:28")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"SpringBoot\u5feb\u901f\u5165\u95e8"),(0,r.kt)("td",null,"00:38:46")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u9879\u76ee\u6e90\u7801\u8bb2\u89e3"),(0,r.kt)("td",null,"01:07:21")),(0,r.kt)("tr",null,(0,r.kt)("td",{rowspan:"2"},"\u516d\u3001\u6625\u677e\u5ba2\u670d\u7684\u63d2\u4ef6"),(0,r.kt)("td",null,"\u63d2\u4ef6\u673a\u5236\u8bbe\u8ba1"),(0,r.kt)("td",null,"00:36:21")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u6625\u677e\u5ba2\u670d\u673a\u5668\u4eba\u63d2\u4ef6\u89e3\u8bfb"),(0,r.kt)("td",null,"00:37:59")),(0,r.kt)("tr",null,(0,r.kt)("td",null,"\u4e03\u3001\u603b\u7ed3"),(0,r.kt)("td",null,"\u6625\u677e\u5ba2\u670d\u56e2\u961f\u4ecb\u7ecd\u53ca\u8bfe\u7a0b\u603b\u7ed3"),(0,r.kt)("td",null,"00:30:08"))),(0,r.kt)("p",null,"\u66f4\u591a\u4ecb\u7ecd\uff0c\u67e5\u770b",(0,r.kt)("a",{parentName:"p",href:"#%E8%B4%AD%E4%B9%B0%E5%9C%B0%E5%9D%80"},"\u8d2d\u4e70\u5730\u5740"),"\u5185\u8be6\u60c5\u3002"),(0,r.kt)("h2",{id:"\u8d2d\u4e70\u5730\u5740"},"\u8d2d\u4e70\u5730\u5740"),(0,r.kt)("p",null,"\u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802\u901a\u8fc7 Chatopera \u8bc1\u4e66\u5546\u5e97\u8fdb\u884c\u51fa\u552e\uff0c\u901a\u8fc7\u8d2d\u4e70\u7684\u3010\u8bc1\u4e66\u6807\u8bc6\u3011\u83b7\u5f97\u4e0b\u8f7d URL \u5730\u5740\uff0c\u6216\u626b\u4e0b\u56fe\u4e8c\u7ef4\u7801\u3002"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://store.chatopera.com/product/cskfdjt19"},"https://store.chatopera.com/product/cskfdjt19")),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(99759).Z,width:"1080",height:"767"})),(0,r.kt)("h2",{id:"\u4e0b\u8f7d\u8bfe\u7a0b\u6587\u4ef6"},"\u4e0b\u8f7d\u8bfe\u7a0b\u6587\u4ef6"),(0,r.kt)("p",null,"\u5728 ",(0,r.kt)("a",{parentName:"p",href:"https://store.chatopera.com/product/cskfdjt19"},"Chatopera \u8bc1\u4e66\u5546\u5e97")," \u83b7\u5f97\u5230\u8bc1\u4e66 ID\uff08",(0,r.kt)("inlineCode",{parentName:"p"},"LICENSE_ID"),"\uff09 \u540e\uff0c\u6587\u4ef6\u7684\u4e0b\u8f7d\u5730\u5740\u4e3a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://store.chatopera.com/dl/$%7BLICENSE_ID%7D.gz"},"https://store.chatopera.com/dl/${LICENSE_ID}.gz")),(0,r.kt)("p",null,"\u5c06 ",(0,r.kt)("inlineCode",{parentName:"p"},"${LICENSE_ID}")," \u66ff\u6362\u4e3a\u60a8\u7684\u8bc1\u4e66\u6807\u8bc6\u3002\u5047\u8bbe\u4e0a\u4e00\u6b65\u5f97\u5230\u7684\u8bc1\u4e66\u6807\u8bc6\u4e3a\uff1a",(0,r.kt)("inlineCode",{parentName:"p"},"L123"),"\uff0c\u90a3\u4e48 URL \u4e0b\u8f7d\u5730\u5740\u5c31\u662f\uff1a"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://store.chatopera.com/dl/L123.gz"},"https://store.chatopera.com/dl/L123.gz")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\u5c06\u60a8\u7684\u8bfe\u7a0b\u6587\u4ef6\u7684 URL \u4e0b\u8f7d\u5730\u5740\u5728\u6d4f\u89c8\u5668\u4e2d\u6253\u5f00\uff0c\u5b8c\u6210\u4e0b\u8f7d\uff0c\u6587\u4ef6\u5927\u5c0f\u7ea6 3.5 GB\u3002\u60a8\u4e5f\u53ef\u4ee5\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"strong"},"wget")," \u547d\u4ee4\u884c\u5de5\u5177\u4ece\u547d\u4ee4\u884c\u7ec8\u7aef\uff08\u6bd4\u5982 Bash Shell\uff09\u4e0b\u8f7d\u548c\u89e3\u538b\u3002")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"wget https://store.chatopera.com/dl/L123.gz -O cskfdjt.tar.gz\ntar xzfv cskfdjt.tar.gz # \u8fdb\u884c\u89e3\u538b\n")))}p.isMDXComponent=!0},99759:(t,l,n)=>{n.d(l,{Z:()=>e});const e=n.p+"assets/images/cskfdjt19_product_store_qr-97b8dbce3961509ccfc7c727ab3acf80.jpg"}}]); \ No newline at end of file diff --git a/assets/js/715c4002.6f616fc8.js b/assets/js/715c4002.6f616fc8.js new file mode 100644 index 00000000..f05aa6a7 --- /dev/null +++ b/assets/js/715c4002.6f616fc8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcskefu_docs=self.webpackChunkcskefu_docs||[]).push([[3681],{3905:(e,t,A)=>{A.d(t,{Zo:()=>p,kt:()=>d});var n=A(67294);function l(e,t,A){return t in e?Object.defineProperty(e,t,{value:A,enumerable:!0,configurable:!0,writable:!0}):e[t]=A,e}function i(e,t){var A=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),A.push.apply(A,n)}return A}function r(e){for(var t=1;t=0||(l[A]=e[A]);return l}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,A)&&(l[A]=e[A])}return l}var a=n.createContext({}),o=function(e){var t=n.useContext(a),A=t;return e&&(A="function"==typeof e?e(t):r(r({},t),e)),A},p=function(e){var t=o(e.components);return n.createElement(a.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var A=e.components,l=e.mdxType,i=e.originalType,a=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),c=o(A),d=l,k=c["".concat(a,".").concat(d)]||c[d]||u[d]||i;return A?n.createElement(k,r(r({ref:t},p),{},{components:A})):n.createElement(k,r({ref:t},p))}));function d(e,t){var A=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var i=A.length,r=new Array(i);r[0]=c;var s={};for(var a in t)hasOwnProperty.call(t,a)&&(s[a]=t[a]);s.originalType=e,s.mdxType="string"==typeof e?e:l,r[1]=s;for(var o=2;o{A.r(t),A.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>o});var n=A(87462),l=(A(67294),A(3905));const i={sidebar_position:3},r="\u63d0\u4ea4\u4ee3\u7801",s={unversionedId:"osc/contribution",id:"version-v8/osc/contribution",title:"\u63d0\u4ea4\u4ee3\u7801",description:"\u672c\u6587\u6863\u7684\u4f5c\u7528\uff1a\u8be6\u7ec6\u7684\u8bf4\u660e\u5982\u4f55\u63d0\u4ea4\u4ee3\u7801\u5230\u6625\u677e\u5ba2\u670d\u3002",source:"@site/versioned_docs/version-v8/osc/contribution.md",sourceDirName:"osc",slug:"/osc/contribution",permalink:"/cskefu-docs/docs/osc/contribution",draft:!1,editUrl:"https://github.com/cskefu/docs/tree/main/packages/create-docusaurus/templates/shared/versioned_docs/version-v8/osc/contribution.md",tags:[],version:"v8",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"\u5b9a\u5236\u5f00\u53d1\u6559\u7a0b",permalink:"/cskefu-docs/docs/osc/training"},next:{title:"\u5f00\u53d1\u73af\u5883\u642d\u5efa",permalink:"/cskefu-docs/docs/osc/engineering"}},a={},o=[{value:"\u6210\u4e3a\u5f00\u53d1\u8005\u6211\u5f97\u5230\u4ec0\u4e48",id:"\u6210\u4e3a\u5f00\u53d1\u8005\u6211\u5f97\u5230\u4ec0\u4e48",level:2},{value:"\u89c6\u9891\u6559\u7a0b",id:"\u89c6\u9891\u6559\u7a0b",level:2},{value:"\u524d\u63d0\u51c6\u5907",id:"\u524d\u63d0\u51c6\u5907",level:2},{value:"Bash \u547d\u4ee4\u884c\u7ec8\u7aef",id:"bash-\u547d\u4ee4\u884c\u7ec8\u7aef",level:3},{value:"Git",id:"git",level:3},{value:"Git Flow",id:"git-flow",level:3},{value:"SSH Keys",id:"ssh-keys",level:3},{value:"GitHub",id:"github",level:3},{value:"\u5feb\u901f\u638c\u63e1",id:"\u5feb\u901f\u638c\u63e1",level:2},{value:"\u6d41\u7a0b\u6982\u8ff0",id:"\u6d41\u7a0b\u6982\u8ff0",level:3},{value:"1/15 Fork code repo",id:"115-fork-code-repo",level:3},{value:"2/15 Clone code repo",id:"215-clone-code-repo",level:3},{value:"3/15 New local branch",id:"315-new-local-branch",level:3},{value:"4/15 Commit sign-off codes",id:"415-commit-sign-off-codes",level:3},{value:"5/15 Git flow publish",id:"515-git-flow-publish",level:3},{value:"6/15 Open new PR",id:"615-open-new-pr",level:3},{value:"7/15 Set PR settings",id:"715-set-pr-settings",level:3},{value:"8/15 Checks on PR",id:"815-checks-on-pr",level:3},{value:"9/15 Code reviews",id:"915-code-reviews",level:3},{value:"10/15 Modify codes",id:"1015-modify-codes",level:3},{value:"11/15 Re-push codes",id:"1115-re-push-codes",level:3},{value:"12/15 Checks on PR",id:"1215-checks-on-pr",level:3},{value:"13/15 Code reviews again",id:"1315-code-reviews-again",level:3},{value:"14/15 PR merged",id:"1415-pr-merged",level:3},{value:"15/15 Pull to local",id:"1515-pull-to-local",level:3},{value:"\u5e38\u89c1\u95ee\u9898",id:"\u5e38\u89c1\u95ee\u9898",level:2},{value:"\u5982\u4f55\u786e\u5b9a\u5de5\u4f5c\u7684 Issue",id:"\u5982\u4f55\u786e\u5b9a\u5de5\u4f5c\u7684-issue",level:3},{value:"\u5982\u4f55\u642d\u5efa\u5f00\u53d1\u73af\u5883",id:"\u5982\u4f55\u642d\u5efa\u5f00\u53d1\u73af\u5883",level:3},{value:"\u5982\u4f55\u5feb\u901f\u5165\u95e8\u5b9a\u5236\u6625\u677e\u5ba2\u670d",id:"\u5982\u4f55\u5feb\u901f\u5165\u95e8\u5b9a\u5236\u6625\u677e\u5ba2\u670d",level:3},{value:"\u5982\u4f55\u5feb\u901f\u638c\u63e1 Git",id:"\u5982\u4f55\u5feb\u901f\u638c\u63e1-git",level:3},{value:"\u5982\u4f55\u6210\u4e3a\u4e00\u4e2a\u4f18\u79c0\u7684\u5f00\u53d1\u8005",id:"\u5982\u4f55\u6210\u4e3a\u4e00\u4e2a\u4f18\u79c0\u7684\u5f00\u53d1\u8005",level:3}],p={toc:o};function u(e){let{components:t,...i}=e;return(0,l.kt)("wrapper",(0,n.Z)({},p,i,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"\u63d0\u4ea4\u4ee3\u7801"},"\u63d0\u4ea4\u4ee3\u7801"),(0,l.kt)("p",null,"\u672c\u6587\u6863\u7684\u4f5c\u7528\uff1a\u8be6\u7ec6\u7684\u8bf4\u660e\u5982\u4f55\u63d0\u4ea4\u4ee3\u7801\u5230\u6625\u677e\u5ba2\u670d\u3002"),(0,l.kt)("h2",{id:"\u6210\u4e3a\u5f00\u53d1\u8005\u6211\u5f97\u5230\u4ec0\u4e48"},"\u6210\u4e3a\u5f00\u53d1\u8005\u6211\u5f97\u5230\u4ec0\u4e48"),(0,l.kt)("p",null,"\u624b\u91cc\u6ca1\u6709\u51e0\u767e\u4e07\uff0c\u4f5c\u4e3a\u5f00\u53d1\u8005\uff0c\u60a8\u5982\u4f55\u62e5\u6709\u4e00\u4e2a\u8f6f\u4ef6\u4ea7\u54c1\u5462\uff1f\u53c2\u4e0e\u5f00\u6e90\u9879\u76ee\u534f\u4f5c\u3002\u53c2\u4e0e\u8fed\u4ee3\u6625\u677e\u5ba2\u670d\uff0c\u6210\u4e3a",(0,l.kt)("a",{parentName:"p",href:"https://www.cskefu.com/core-developers/"},"\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005"),"\uff0c\u5c31\u662f\u548c\u4f17\u591a\u6709\u624d\u534e\u7684\u4eba\u4e00\u9053\uff0c\u505a\u597d\u5f00\u6e90\u5ba2\u670d\u7cfb\u7edf\uff0c\u8ba9\u60a8\u7684\u6f5c\u80fd\u81ea\u7531\u7684\u53d1\u6325\uff0c\u5728\u6625\u677e\u5ba2\u670d\u793e\u533a\uff0c\u60a8\u53ef\u4ee5\u83b7\u5f97\u6210\u5c31\u3001\u670b\u53cb\u7b49\u5f88\u591a\u8d22\u5bcc\u3002"),(0,l.kt)("p",null,"\u4f5c\u4e3a\u4e00\u4e2a\u5f00\u53d1\u8005\uff0c\u52a0\u5165\u6625\u677e\u5ba2\u670d\u5f00\u6e90\u793e\u533a\u5c31\u662f\u548c\u5f88\u591a\u70ed\u7231\u8f6f\u4ef6\u7814\u53d1\u7684\u4eba\u4e00\u8d77\u505a\u6709\u7ecf\u6d4e\u4ef7\u503c\u7684\u4f5c\u54c1\uff0c\u6625\u677e\u5ba2\u670d\u662f\u5f00\u653e\u578b\u7ec4\u7ec7\uff0c\u6625\u677e\u5ba2\u670d\u6280\u672f\u59d4\u5458\u4f1a\u4e3b\u5bfc\u793e\u533a\u53d1\u5c55\uff0c\u5e76\u4ee5",(0,l.kt)("a",{parentName:"p",href:"https://www.cskefu.com/profit-sharing-plans/"},"\u5206\u6da6\u7684\u5f62\u5f0f"),"\u5408\u4f5c\u5171\u8d62\uff01\u901a\u8fc7\u793e\u533a\u9ad8\u6548\u7387\u7684\u534f\u4f5c\u4f53\u7cfb\uff0c\u8ba9\u60a8\u5728\u5de5\u4f5c\u4e4b\u4f59\uff0c\u5229\u7528\u7a7a\u95f2\u65f6\u95f4\u4ea7\u751f\u66f4\u5927\u7684\u4ef7\u503c - \u63d0\u4ea4 PR \u5230\u6625\u677e\u5ba2\u670d\uff0c\u5728\u5f00\u6e90\u793e\u533a\u626e\u6f14\u5173\u952e\u89d2\u8272\uff01"),(0,l.kt)("p",null,"\u672c\u6587\u64b0\u5199\u7684\u4e3b\u8981\u76ee\u7684\uff0c\u5c31\u662f\u5e2e\u52a9\u60a8\u5feb\u901f\u7684\u638c\u63e1\u5982\u4f55\u63d0\u4ea4 PR",(0,l.kt)("sup",{parentName:"p",id:"fnref-what-is-pr"},(0,l.kt)("a",{parentName:"sup",href:"#fn-what-is-pr",className:"footnote-ref"},"what-is-pr"))," \u5230\u6625\u677e\u5ba2\u670d\u3002"),(0,l.kt)("h2",{id:"\u89c6\u9891\u6559\u7a0b"},"\u89c6\u9891\u6559\u7a0b"),(0,l.kt)("p",null,"\u4ee5\u4e0b\u5185\u5bb9\u5df2\u7ecf\u53d1\u5e03\u89c6\u9891\uff0c\u89c2\u770b\u5730\u5740\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://www.bilibili.com/video/BV1D8411q73M"},"Bilibili")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://www.youtube.com/watch?v=lYCdIgxXUSE"},"YouTube"))),(0,l.kt)("p",null,"\u89c6\u9891\u548c\u4ee5\u4e0b\u6587\u6863\u7ed3\u5408\uff0c\u53ef\u4ee5\u66f4\u5feb\u7684\u638c\u63e1\u63d0\u4ea4\u4ee3\u7801\u7684\u8fc7\u7a0b\uff0c\u5efa\u8bae\u5148\u770b\u89c6\u9891\u540e\u770b\u6587\u6863\u3002"),(0,l.kt)("h2",{id:"\u524d\u63d0\u51c6\u5907"},"\u524d\u63d0\u51c6\u5907"),(0,l.kt)("p",null,"\u6309\u7167\u4ee5\u4e0b\u987a\u5e8f\u5b89\u88c5\u4f9d\u8d56\u5de5\u5177\uff0c\u8fd9\u4e9b\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\uff0cGit Flow \u7684\u5b89\u88c5\u7a0d\u663e\u9ebb\u70e6\uff0c\u4f46\u662f Git Flow \u662f\u5fc5\u8981\u7684\uff0c\u5f53\u60a8\u9047\u5230\u95ee\u9898\uff0c\u53ef\u4ee5\u521b\u5efa ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/cskefu/cskefu/issues/new?labels=help-wanted&projects=&template=1_help.md"},"Issue \u6765\u53d6\u5f97\u5e2e\u52a9"),"\u3002"),(0,l.kt)("h3",{id:"bash-\u547d\u4ee4\u884c\u7ec8\u7aef"},"Bash \u547d\u4ee4\u884c\u7ec8\u7aef"),(0,l.kt)("p",null,"\u547d\u4ee4\u884c\u7ec8\u7aef\u63a8\u8350\u5b89\u88c5\u5982\u4e0b\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Windows: ",(0,l.kt)("a",{parentName:"li",href:"https://gitforwindows.org/"},"Git Bash")),(0,l.kt)("li",{parentName:"ul"},"Mac: ",(0,l.kt)("a",{parentName:"li",href:"https://iterm2.com/"},"iTerm2")),(0,l.kt)("li",{parentName:"ul"},"Linux: \u4e0d\u540c Linux \u53d1\u5e03\u7684\u9ed8\u8ba4\u7684\u63a7\u5236\u53f0\u5de5\u5177\u5373\u53ef")),(0,l.kt)("p",null,"\u4e0d\u540c\u64cd\u4f5c\u7cfb\u7edf\u7684 Bash \u7ec8\u7aef\u5176\u547d\u4ee4\u884c\u5de5\u5177\u90fd\u662f\u7c7b\u4f3c\u7684\uff0c\u4e0b\u6587\u4f7f\u7528\u7684\u547d\u4ee4\u4e5f\u662f\u901a\u7528\u7684\uff0c\u4e0b\u6587\u4ee5 Windows Git Bash \u4e3a\u4f8b\u3002"),(0,l.kt)("h3",{id:"git"},"Git"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Windows: ",(0,l.kt)("a",{parentName:"li",href:"https://gitforwindows.org/"},"Git Bash")),(0,l.kt)("li",{parentName:"ul"},"Mac \u548c Linux: ",(0,l.kt)("a",{parentName:"li",href:"https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git"},"\u5b89\u88c5 Git"))),(0,l.kt)("p",null,"\u5b8c\u6210\u4ee5\u4e0a\u5de5\u4f5c\uff0c\u60a8\u5c31\u53ef\u4ee5\u6253\u5f00\u547d\u4ee4\u884c\u7ec8\u7aef\uff0c\u5e76\u6267\u884c\u547d\u4ee4\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(52750).Z,width:"1308",height:"407"})),(0,l.kt)("h3",{id:"git-flow"},"Git Flow"),(0,l.kt)("p",null,"Git Flow \u662f\u4f7f\u7528 Git \u505a\u7814\u53d1\u8f6f\u4ef6\u534f\u4f5c\u7684\u8865\u5145\u5de5\u5177\u96c6\uff0c\u63d0\u4f9b\u5728 Git \u547d\u4ee4\u57fa\u7840\u4e0a\u7684",(0,l.kt)("a",{parentName:"p",href:"https://blog.csdn.net/Xue_zenghui/article/details/95212544"},"\u6700\u4f73\u5b9e\u8df5"),"\u3002\u4e0b\u6587\u5c06\u4f7f\u7528 Git Flow \u7b80\u5355\u9ad8\u6548\u7684\u5b8c\u6210 PR \u63d0\u4ea4\u7684\u6d41\u7a0b\u3002"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Windows: ",(0,l.kt)("a",{parentName:"li",href:"https://www.jianshu.com/p/8a804d8bf08b"},"\u5b89\u88c5 Git Flow")),(0,l.kt)("li",{parentName:"ul"},"macOS: ",(0,l.kt)("a",{parentName:"li",href:"https://juejin.cn/post/7057102433704476708"},"\u5b89\u88c5 Git Flow")),(0,l.kt)("li",{parentName:"ul"},"Linux: ",(0,l.kt)("a",{parentName:"li",href:"https://blog.csdn.net/u012336923/article/details/50425879"},"\u5b89\u88c5 Git Flow"))),(0,l.kt)("p",null,"\u5b89\u88c5\u597d Git Flow \u540e\uff0c\u901a\u8fc7\u547d\u4ee4\u884c ",(0,l.kt)("inlineCode",{parentName:"p"},"git flow")," \u6765\u4f7f\u7528\uff0c\u4e0d\u5f71\u54cd\u5176\u5b83\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"git")," \u547d\u4ee4\u3002"),(0,l.kt)("h3",{id:"ssh-keys"},"SSH Keys"),(0,l.kt)("p",null,"\u751f\u6210 SSH \u5bc6\u94a5\u6587\u4ef6\uff0c\u7528\u4e8e\u52a0\u5bc6\u8ba4\u8bc1\uff0c\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"git")," \u4e0b\u8f7d\u4e0a\u4f20\u4ee3\u7801\u3002\u5982\u679c\u60a8\u5df2\u7ecf\u6709\u4e86 SSH Keys \u672c\u6b65\u9aa4\u53ef\u4ee5\u8df3\u8fc7\uff0c\u5373:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"$HOME/.ssh/id_rsa $HOME/.ssh/id_rsa.pub\n")),(0,l.kt)("p",null,"\u5176\u4e2d\uff0c",(0,l.kt)("inlineCode",{parentName:"p"},"$HOME/.ssh/id_rsa ")," \u662f\u79c1\u94a5\u6587\u4ef6\uff0c\u60a8\u81ea\u5df1\u4fdd\u7559\uff0c\u4e0d\u8981\u516c\u5f00\u5171\u4eab\uff1b",(0,l.kt)("inlineCode",{parentName:"p"},"$HOME/.ssh/id_rsa.pub")," \u662f\u516c\u94a5\uff0c\u53ef\u4ee5\u516c\u5f00\u5171\u4eab\u3002"),(0,l.kt)("p",null,"\u751f\u6210 SSH Keys \u6267\u884c\u547d\u4ee4\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"ssh-keygen -t rsa # \u5f39\u51fa\u9009\u9879\u90fd\u6309 Enter\n")),(0,l.kt)("p",null,"\u786e\u8ba4\uff0c\u7cfb\u7edf\u8def\u5f84\u5b58\u5728 ",(0,l.kt)("inlineCode",{parentName:"p"},"$HOME/.ssh/id_rsa.pub"),"\uff0c\u6267\u884c\u547d\u4ee4\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"cat $HOME/.ssh/id_rsa.pub\n")),(0,l.kt)("h3",{id:"github"},"GitHub"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u6ce8\u518c GitHub \u8d26\u53f7\uff1a",(0,l.kt)("a",{parentName:"li",href:"https://github.com/"},"https://github.com/")),(0,l.kt)("li",{parentName:"ul"},"\u6dfb\u52a0 SSH Keys: \u6ce8\u518c\u5b8c\u6210\u540e\uff0c\u6253\u5f00 URL ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/settings/keys"},"https://github.com/settings/keys"),"\uff0c\u70b9\u51fb ",(0,l.kt)("inlineCode",{parentName:"li"},"New SSH Key"))),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(21039).Z,width:"965",height:"428"})),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u6dfb\u52a0 Title \u548c Key\uff0c\u5373 SSH \u516c\u94a5\u3002")),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(57775).Z,width:"1327",height:"708"})),(0,l.kt)("h2",{id:"\u5feb\u901f\u638c\u63e1"},"\u5feb\u901f\u638c\u63e1"),(0,l.kt)("h3",{id:"\u6d41\u7a0b\u6982\u8ff0"},"\u6d41\u7a0b\u6982\u8ff0"),(0,l.kt)("p",null,"\u6574\u4e2a\u63d0\u4ea4 PR \u7684\u8fc7\u7a0b\u53ef\u4ee5\u7528\u4ee5\u4e0b\u65f6\u5e8f\u56fe\u8bf4\u660e\uff0c\u6211\u4eec\u5c06\u8fd9\u4e2a\u8fc7\u7a0b\u7ec6\u5316\u4e3a\u5341\u4e94\u6b65\uff0c\u5b9e\u9645\u4e0a\u5f88\u7b80\u5355\uff0c\u53ea\u9700\u8981\u6309\u7167\u63cf\u8ff0\u5b8c\u6210\u4e00\u6b21\uff0c\u5c31\u53ef\u4ee5\u638c\u63e1\uff0c\u800c\u4e14\u9664\u4e86\u7b2c\u4e00\u4e2a PR\uff0c\u540e\u9762\u7684 PR \u53ea\u9700\u8981\u91cd\u590d\u7b2c 3-15 \u6b65\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"\u63d0\u4ea4 PR \u6d41\u7a0b\u6982\u8ff0",src:A(61612).Z,width:"1700",height:"1743"})),(0,l.kt)("p",null,"\u4e0a\u56fe\u4e2d\uff0c\u6709\u4e09\u4e2a\u4ed3\u5e93\u5730\u5740\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("strong",{parentName:"li"},"GitHub Upstream"),", \u5373\u4ed3\u5e93 ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/cskefu/cskefu"},"https://github.com/cskefu/cskefu")," \uff0c\u7b80\u79f0 Upstream Repo"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("strong",{parentName:"li"},"GitHub Origin"),", \u5373 ",(0,l.kt)("inlineCode",{parentName:"li"},"https://github.com/${\u4e2a\u4eba forked repo}$/cskefu"),"\uff0c\u7b80\u79f0 Origin Repo"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("strong",{parentName:"li"},"Localhost Repo"),"\uff0c\u5373\u60a8\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"li"},"git clone git@github.com:${\u4e2a\u4eba forked repo}/cskefu.git"),", \u7b80\u79f0 Local Repo")),(0,l.kt)("p",null,"\u4ee5\u4e0a\u4e09\u4e2a\u4ed3\u5e93\u5728\u4e0b\u9762\u6709\u8be6\u7ec6\u4ecb\u7ecd\uff0c\u4e3b\u8981\u539f\u5219\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u5de5\u4f5c\u524d\u5148\u6709 Issue \u53f7\uff0c\u6bd4\u5982 ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/cskefu/cskefu/issues/897"},"https://github.com/cskefu/cskefu/issues/897")," \u7684 Issue \u53f7\u5c31\u662f ",(0,l.kt)("inlineCode",{parentName:"li"},"879"),"\uff0c\u4ee5\u4e0b\u4e5f\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"li"},"#879")," \u6307\u4ee3 Issue 879;"),(0,l.kt)("li",{parentName:"ul"},"\u4ee3\u7801\u6700\u7ec8\u8fdb\u5165 Upstream/develop \u5206\u652f\u5373\u5c5e\u4e8e\u8fdb\u5165\u6625\u677e\u5ba2\u670d\uff0c\u4e0d\u8981\u76f4\u63a5\u66f4\u6539Local/develop \u548c Origin/develop \u5206\u652f\uff0c\u8fd9\u4e24\u4e2a Repo \u7684 develop \u5206\u652f\u7684\u66f4\u65b0\u662f\u901a\u8fc7 ",(0,l.kt)("inlineCode",{parentName:"li"},"git pull upstream develop")," \u6765\u5b8c\u6210\u7684\u3002"),(0,l.kt)("li",{parentName:"ul"},"\u4ee3\u7801\u662f\u7531",(0,l.kt)("a",{parentName:"li",href:"https://github.com/cskefu/cskefu/issues/758"},"\u6625\u677e\u5ba2\u670d\u7684 CodeOwners")," \u5408\u5e76\u8fdb\u5165 Upstream/develop \u5206\u652f\u7684\u3002")),(0,l.kt)("h3",{id:"115-fork-code-repo"},"1/15 Fork code repo"),(0,l.kt)("p",null,"\u9996\u5148\uff0c\u6253\u5f00 Upstream \u7f51\u5740 ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/cskefu/cskefu"},"https://github.com/cskefu/cskefu"),"\uff0c\u70b9\u51fb\u53f3\u4fa7\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"Fork"),"\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(38511).Z,width:"1486",height:"582"})),(0,l.kt)("p",null,"\u9009\u62e9\u514b\u9686\u5230\u7a7a\u95f4\uff0c\u53d6\u6d88",(0,l.kt)("inlineCode",{parentName:"p"},"Copy the develop branch only")," \u9009\u62e9\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(78518).Z,width:"1746",height:"952"})),(0,l.kt)("p",null,"\u70b9\u51fb ",(0,l.kt)("inlineCode",{parentName:"p"},"Create fork"),"\uff0c\u8fd9\u65f6\u6d4f\u89c8\u5668\u4f1a\u8df3\u8f6c\u5230 Origin Repo, \u5373\u60a8\u521a\u521a\u9009\u62e9\u7684\u7a7a\u95f4\u4e0b\u7684 Repo \u5730\u5740\u3002"),(0,l.kt)("h3",{id:"215-clone-code-repo"},"2/15 Clone code repo"),(0,l.kt)("p",null,"\u4f7f\u7528 Bash \u547d\u4ee4\u884c\u7ec8\u7aef\uff0c\u521b\u5efa Local repo\uff0c\u9996\u5148\u5728\u6d4f\u89c8\u5668\u4e2d\uff0c\u83b7\u5f97 Origin Repo \u7684\u5730\u5740"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(33084).Z,width:"2230",height:"1153"})),(0,l.kt)("p",null,"\u6267\u884c\u547d\u4ee4\u5982\u4e0b\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"mkdir ~/cskefu\ncd ~/cskefu\ngit clone git@github.com:${\u4e2a\u4eba forked repo}/cskefu.git # \u4ece\u6d4f\u89c8\u5668\u4e2d\u590d\u5236\u7684\u5730\u5740\n")),(0,l.kt)("p",null,"\u7136\u540e\uff0c\u8fdb\u5165\u6625\u677e\u5ba2\u670d Local Repo\uff0c\u8bbe\u7f6e Sign-off\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},'cd ~/cskefu/cskefu # \u4ee5\u4e0b\u79f0\u6b64\u8def\u5f84\u4e3a CSKEFU_ROOT\ngit config alias.ci "commit -s"\ngit config user.name "\u60a8\u7684\u540d\u5b57"\ngit config user.email "\u60a8\u7684\u90ae\u7bb1"\n')),(0,l.kt)("p",null,"\u8be5\u547d\u4ee4\u7684\u4f5c\u7528\u662f\uff0c\u5728 ",(0,l.kt)("inlineCode",{parentName:"p"},"CSKEFU_ROOT")," \u4e0b\u6267\u884c ",(0,l.kt)("inlineCode",{parentName:"p"},'git ci -m "xxx"')," \u4ee5\u5b8c\u6210\u7b7e\u7f72 DCO",(0,l.kt)("sup",{parentName:"p",id:"fnref-what-is-dco"},(0,l.kt)("a",{parentName:"sup",href:"#fn-what-is-dco",className:"footnote-ref"},"what-is-dco")),"\u3002"),(0,l.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u914d\u7f6e upstream\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"cd ~/cskefu/cskefu\ngit remote add upstream https://github.com/cskefu/cskefu.git\n")),(0,l.kt)("p",null,"\u6700\u540e\uff0c\u521d\u59cb\u5316 ",(0,l.kt)("inlineCode",{parentName:"p"},"Git Flow"),"\uff0c\u6267\u884c"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"cd ~/cskefu/cskefu\ngit flow init\n")),(0,l.kt)("p",null,"\u8be5\u547d\u4ee4\u4f1a\u542f\u52a8\u4e00\u4e2a\u4ea4\u4e92\u95ee\u7b54\uff0c\u6309\u7167\u5982\u4e0b\u8bbe\u7f6e\uff0c\u4f7f\u7528 Enter \u8fdb\u5165\u4e0b\u4e00\u4e2a\u76f4\u81f3\u5b8c\u6210\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(52252).Z,width:"1691",height:"813"})),(0,l.kt)("p",null,"\u4fee\u6539\uff0c\u5982\u679c\u8bbe\u7f6e\u9519\u8bef\uff0c\u53ef\u4ee5\u5728\u8fd0\u884c\u4e86\u4e0a\u8ff0\u547d\u4ee4\u540e\uff0c\u7f16\u8f91 ",(0,l.kt)("inlineCode",{parentName:"p"},".git/config")," \u6587\u4ef6\u3002\u4e0a\u9762\u7684\u4e3b\u8981\u6b65\u9aa4\uff0c\u56f4\u7ed5 ",(0,l.kt)("inlineCode",{parentName:"p"},"CSKEFU_ROOT/.git/config")," \u6587\u4ef6\uff0c\u6267\u884c\u540e\u770b\u8d77\u6765\u5982\u4e0b\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},'[core]\n repositoryformatversion = 0\n filemode = false\n bare = false\n logallrefupdates = true\n ignorecase = true\n[remote "origin"]\n url = git@github.com:${\u4e2a\u4eba forked repo}/cskefu.git\n fetch = +refs/heads/*:refs/remotes/origin/*\n[branch "develop"]\n remote = origin\n merge = refs/heads/develop\n[remote "upstream"]\n url = https://github.com/cskefu/cskefu.git\n fetch = +refs/heads/*:refs/remotes/upstream/*\n[branch "master"]\n remote = origin\n merge = refs/heads/master\n[gitflow "branch"]\n master = master\n develop = develop\n[gitflow "prefix"]\n feature = feature/\n bugfix = bugfix/\n release = release/\n hotfix = hotfix/\n support = support/\n versiontag =\n[gitflow "path"]\n hooks = C:/Users/Administrator/git/cskefu/.git/hooks\n[alias]\n ci = commit -s\n[user]\n name = Zhang San\n email = zhangsan@xyz.com\n')),(0,l.kt)("h3",{id:"315-new-local-branch"},"3/15 New local branch"),(0,l.kt)("p",null,"\u5bf9\u4e8e\u63d0\u4ea4\u7684\u4ee3\u7801\uff0c\u662f\u4ee5 ",(0,l.kt)("inlineCode",{parentName:"p"},"Git Commits")," \u4e3a\u5355\u4f4d\u7684\uff0c\u6bcf\u4e2a ",(0,l.kt)("inlineCode",{parentName:"p"},"Git Commit")," \u9700\u8981\u5173\u8054\u4e00\u4e2a GitHub Isssue \u53f7\uff0c\u6240\u4ee5\uff0c\u5148\u627e\u5230\u5de5\u4f5c\u7684 Issues\uff1a"),(0,l.kt)("p",null,(0,l.kt)("a",{parentName:"p",href:"https://github.com/cskefu/cskefu/issues"},"https://github.com/cskefu/cskefu/issues")),(0,l.kt)("p",null,"\u5047\u8bbe\uff0c\u6211\u4eec\u6709\u4e86\u4e00\u4e2a GitHub Issue ",(0,l.kt)("inlineCode",{parentName:"p"},"#NUMBER"),"\uff0c\u6bd4\u5982 ",(0,l.kt)("inlineCode",{parentName:"p"},"#879"),"\uff0c\u8fd9\u4e2a Issue \u662f\u4e00\u4e2a\u65b0\u529f\u80fd\uff0c\u90a3\u4e48\uff0c\u6211\u4eec\u8fd9\u6837\u5f00\u59cb\u5de5\u4f5c\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"# \u5efa\u7acb\u65b0\u7684\u5206\u652f\ncd ~/cskefu/cskefu\ngit flow feature start 879 # \u6267\u884c\uff0c\u7136\u540e\u5f97\u5230\u4e0b\u9762\u7684\u63d0\u793a\u4fe1\u606f\nSwitched to a new branch 'feature/879'\n\nSummary of actions:\n- A new branch 'feature/879' was created, based on 'develop'\n- You are now on branch 'feature/879'\n\nNow, start committing on your feature. When done, use:\n\n git flow feature finish 879\n")),(0,l.kt)("p",null,"\u5982\u4e0a\u4ecb\u7ecd\uff0c\u73b0\u5728 Git \u81ea\u52a8\u5207\u6362\u4e86\u65b0\u7684\u5206\u652f\uff0c\u6211\u4eec\u5c31\u5728\u8fd9\u4e2a\u5206\u652f\u4e0b\u8c03\u6574\u4ee3\u7801\u3002\n\u663e\u793a\u4e86\u5de5\u4f5c\u4e2d\u7684\u5206\u652f\uff0c\u60a8\u53ef\u4ee5\u7528\u547d\u4ee4 ",(0,l.kt)("inlineCode",{parentName:"p"},"git branch")," \u67e5\u770b\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(47533).Z,width:"1160",height:"696"})),(0,l.kt)("h3",{id:"415-commit-sign-off-codes"},"4/15 Commit sign-off codes"),(0,l.kt)("p",null,"\u5047\u8bbe\uff0c\u6211\u4eec\u5df2\u7ecf\u8c03\u6574\u5b8c\u6210\u4e86\u4ee3\u7801\uff0c\u901a\u8fc7 ",(0,l.kt)("inlineCode",{parentName:"p"},"git status")," \u67e5\u770b\u53d8\u66f4\u7684\u72b6\u6001\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(17443).Z,width:"2061",height:"344"})),(0,l.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86\uff0c\u6267\u884c\u4ee5\u4e0b\u7684\u547d\u4ee4\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},'cd ~/cskefu/cskefu\ngit add --all\ngit ci -m "#879 \u8c03\u6574\u4e86 XXX" # \u7b80\u8981\u63cf\u8ff0\n')),(0,l.kt)("p",null,"\u6ce8\u610f\uff0c\u6b64\u5904\u4f7f\u7528\u4e86 ",(0,l.kt)("inlineCode",{parentName:"p"},"git ci"),"\uff0c\u5373\u662f\u524d\u6587\u4ecb\u7ecd\u7684 DCO \u7b7e\u540d\uff0c\u6ca1\u6709\u7b7e\u540d\u7684 commit \u7684 PR \u662f\u4e0d\u88ab\u63a5\u53d7\u7684\u3002"),(0,l.kt)("h3",{id:"515-git-flow-publish"},"5/15 Git flow publish"),(0,l.kt)("p",null,"\u4e0b\u4e00\u6b65\uff0c\u5c06 Local Repo \u7684 Commit \u53d1\u5e03\u5230 Origin Repo \u4e2d\uff0c\u4f7f\u7528\u5982\u4e0b\u547d\u4ee4\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"cd ~/cskefu/cskefu\ngit flow feature publish\n")),(0,l.kt)("p",null,"\u5728\u6267\u884c\u4e86\u4e0a\u8ff0\u547d\u4ee4\u540e\uff0c\u5f97\u5230\u63d0\u793a\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(72384).Z,width:"2281",height:"1168"})),(0,l.kt)("p",null,"\u900f\u9732\u7684\u4fe1\u606f\u662f\uff1a1\uff09Origin repo \u7684 'feature/879' \u5206\u652f\u88ab\u65b0\u5efa\u6216\u66f4\u65b0\u4e86\uff0c2\uff09Local repo \u7684 'feature/879' \u5206\u652f\u7528\u6765\u8ddf\u8e2a Origin/feature/879 \u7684\u53d8\u5316\u3002"),(0,l.kt)("h3",{id:"615-open-new-pr"},"6/15 Open new PR"),(0,l.kt)("p",null,"\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u4e0a\u4e00\u6b65\u7684\u63d0\u793a\u6d88\u606f\u4e2d\uff0c\u6709\u4e00\u4e2a URL \u5730\u5740\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"https://github.com/${\u4e2a\u4eba forked repo}/cskefu/pull/new/feature/879\n")),(0,l.kt)("p",null,"\u590d\u5236\u8fd9\u4e2a\u5730\u5740\uff0c\u5e76\u5728\u6d4f\u89c8\u5668\u4e2d\u6253\u5f00\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(44586).Z,width:"2665",height:"1708"})),(0,l.kt)("p",null,"\u8fd9\u4e2a\u5c31\u662f\u521b\u5efa PR \u7684\u754c\u9762\uff0c\u901a\u8fc7\u8c03\u6574\u6807\u9898\uff0c\u6b63\u6587\uff0c\u66f4\u597d\u7684\u63cf\u8ff0\u672c\u6b21\u53d8\u66f4\u7684\u539f\u56e0\u3002\u7136\u540e\u70b9\u51fb\u53f3\u4e0b\u89d2\u7684 \u3010Create pull request\u3011\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(88940).Z,width:"674",height:"244"})),(0,l.kt)("h3",{id:"715-set-pr-settings"},"7/15 Set PR settings"),(0,l.kt)("p",null,"\u63d0\u4ea4\u540e\uff0c\u6d4f\u89c8\u5668\u81ea\u52a8\u8df3\u8f6c\u5230\u65b0\u5efa\u7acb\u7684 PR \u9875\u9762\uff0c\u6bd4\u5982 ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/cskefu/cskefu/pull/900"},"https://github.com/cskefu/cskefu/pull/900"),"\u3002"),(0,l.kt)("p",null,"\u5728\u8fd9\u4e2a\u9875\u9762\uff0c\u53ef\u4ee5\u5f97\u5230\u548c\u6dfb\u52a0\u66f4\u591a\u7684\u4fe1\u606f\uff0c\u6bd4\u5982\u67e5\u770b\u5ba1\u6838\u8005(Reviewers)\uff0c\u53ea\u6709\u8fbe\u5230\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Code \u5ba1\u6838\u901a\u8fc7\u7684\u4eba\u6570\u8d85\u8fc7\u8bbe\u5b9a\uff08\u76ee\u524d\u4e3a 1 \u4eba\uff09\uff0c\u76ee\u524d\uff0c\u5ba1\u6838\u8005\u662f\u81ea\u52a8\u8bbe\u7f6e\u7684\uff0c\u8be6\u7ec6\u7684\u89c4\u5219\u67e5\u770b\uff1a",(0,l.kt)("a",{parentName:"li",href:"https://github.com/cskefu/cskefu/issues/758"},"\u6625\u677e\u5ba2\u670d\u7684 CodeOwners")),(0,l.kt)("li",{parentName:"ul"},"Code Review \u6ca1\u6709\u8ba8\u8bba\u4e2d\u7684\u4f1a\u8bdd"),(0,l.kt)("li",{parentName:"ul"},"PR \u7684\u81ea\u52a8\u68c0\u67e5\u901a\u8fc7")),(0,l.kt)("p",null,"PR \u624d\u53ef\u4ee5\u7531 CodeOwners \u8fdb\u884c\u5408\u5e76\uff0c\u5206\u522b\u5bf9\u5e94 PR \u9875\u9762\u4e2d\u7684\u4e0b\u56fe\u90e8\u5206\u7684\u72b6\u6001\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(11461).Z,width:"1854",height:"696"})),(0,l.kt)("h3",{id:"815-checks-on-pr"},"8/15 Checks on PR"),(0,l.kt)("p",null,"\u5728 PR \u9875\u9762\uff0c\u60a8\u4f1a\u770b\u5230\u7c7b\u4f3c\u7684\u4fe1\u606f\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(12150).Z,width:"2079",height:"1017"})),(0,l.kt)("p",null,"\u4ee3\u8868\u5f53\u524d\u7684 PR \u81ea\u52a8\u68c0\u67e5\u901a\u8fc7\uff0c\u4f46\u662f\u4e5f\u53ef\u80fd\u53d1\u751f\u4e0d\u901a\u8fc7\u7684\u60c5\u51b5\uff0c\u6b64\u65f6\u8fdb\u5165\u7b2c 10/15 \u6b65\u89e3\u51b3\u3002"),(0,l.kt)("h3",{id:"915-code-reviews"},"9/15 Code reviews"),(0,l.kt)("p",null,"\u5728 PR \u9875\u9762\uff0c\u60a8\u4f1a\u770b\u5230\u7c7b\u4f3c\u7684\u4fe1\u606f\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(98069).Z,width:"2006",height:"1197"})),(0,l.kt)("p",null,"\u4ee3\u8868\u5f53\u524d\u8fd8\u9700\u8981\u5b8c\u6210 Code Review \u5de5\u4f5c\uff0c\u8be5 PR \u624d\u80fd\u88ab\u5408\u5e76\u3002"),(0,l.kt)("p",null,"\u6b64\u65f6\uff0cCode Reviewer \u4f1a\u6536\u5230\u901a\u77e5\uff0cCode Reviewer \u4f1a\u5728 PR \u7684\u4e0b\u9762\u9875\u9762\u7ed9\u4e0e\u53cd\u9988\uff1a1\uff09Comment/Request Changes - \u4ee3\u7801\u8fd8\u9700\u8981\u505a\u4e00\u4e9b\u8c03\u6574\uff0c\u8fdb\u5165 10/15 \u6b65\uff1b2) Approve - \u901a\u8fc7\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(56508).Z,width:"3020",height:"1520"})),(0,l.kt)("p",null,"\u901a\u8fc7 Checks \u548c Review\uff0c\u4ee3\u7801\u4f1a\u81ea\u52a8\u8fdb\u5165 ",(0,l.kt)("inlineCode",{parentName:"p"},"upstream/develop")," \u5206\u652f\u3002 "),(0,l.kt)("h3",{id:"1015-modify-codes"},"10/15 Modify codes"),(0,l.kt)("p",null,"\u7531\u4e8e PR Checks \u6216 Review \u6ca1\u6709\u901a\u8fc7\uff0c\u90a3\u4e48\u6839\u636e\u53cd\u9988\u9700\u8981\u66f4\u6539\u4ee3\u7801\uff0c\u8fdb\u884c\u5982\u4e0b\u64cd\u4f5c\u3002"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"cd ~/cskefu/cskefu")),(0,l.kt)("li",{parentName:"ul"},"\u786e\u8ba4 Local repo \u6240\u5728\u5206\u652f\u4e3a ",(0,l.kt)("inlineCode",{parentName:"li"},"feature/879"),"\uff1b\u5982\u679c\u5f53\u524d\u4e0d\u5728\u8fd9\u4e2a\u5206\u652f\uff0c\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"li"},"git checkout feature/879")," \u5207\u6362\u56de\u8fd9\u4e2a\u5206\u652f"),(0,l.kt)("li",{parentName:"ul"},"\u8c03\u6574\u4ee3\u7801\uff0c\u76f4\u5230\u53ef\u4ee5\u518d\u6b21\u63d0\u4ea4")),(0,l.kt)("h3",{id:"1115-re-push-codes"},"11/15 Re-push codes"),(0,l.kt)("p",null,"\u6267\u884c\u547d\u4ee4\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},'cd ~/cskefu/cskefu\ngit add --all\ngit ci -m "#879 \u518d\u6b21\u8c03\u6574 XXX"\ngit push origin feature/879\n')),(0,l.kt)("h3",{id:"1215-checks-on-pr"},"12/15 Checks on PR"),(0,l.kt)("p",null,"\u56de\u5230\u524d\u6b21\u521b\u5efa\u7684 PR \u9875\u9762\uff0c\u5728 Commits \u9875\u9762\uff0c\u6211\u4eec\u770b\u5230\uff0c\u5df2\u7ecf\u6709\u4e86\u7b2c\u4e8c\u6b21\u7684\u63d0\u4ea4\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(21198).Z,width:"2749",height:"1148"})),(0,l.kt)("p",null,"\u6b64\u65f6\uff0c\u518d\u6b21\u6267\u884c\u4e86 Checks\u3002"),(0,l.kt)("h3",{id:"1315-code-reviews-again"},"13/15 Code reviews again"),(0,l.kt)("p",null,"\u8fd9\u65f6\u5019\uff0cCode Reviewer \u518d\u6b21\u6536\u5230\u63d0\u793a\uff0c\u8fdb\u884c\u4ee3\u7801 Reviews\u3002\u60a8\u4e5f\u53ef\u4ee5\u5728 PR \u4e0a\u4e0e Reviewers \u4ea4\u4e92\uff0c\u5982\u4e0b\u56fe\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(90659).Z,width:"1939",height:"574"})),(0,l.kt)("h3",{id:"1415-pr-merged"},"14/15 PR merged"),(0,l.kt)("p",null,"\u5047\u8bbe\uff0c\u8fd9\u6b21 Checks \u548c Reviews \u901a\u8fc7\uff0c\u6ee1\u8db3\u4e86\u5408\u5e76\u7684\u9700\u6c42\uff0c\u56e0\u4e3a\u524d\u6587\u6211\u4eec\u8bbe\u7f6e\u4e86\u3010Auto-merge\u3011\uff0c\u73b0\u5728\u4ee3\u7801\u5c31\u4f1a\u76f4\u63a5\u8fdb\u5165 ",(0,l.kt)("inlineCode",{parentName:"p"},"upstream/develop")," \u5206\u652f\u3002"),(0,l.kt)("p",null,"\u60a8\u4e5f\u53ef\u4ee5\u5728 develop \u5206\u652f\u786e\u8ba4\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(40183).Z,width:"2100",height:"913"})),(0,l.kt)("p",null,"\u70b9\u51fb ",(0,l.kt)("inlineCode",{parentName:"p"},"commits"),"\u3002"),(0,l.kt)("h3",{id:"1515-pull-to-local"},"15/15 Pull to local"),(0,l.kt)("p",null,"\u73b0\u5728\uff0c\u60a8\u7684 PR \u63d0\u4ea4\u5b8c\u6210\u4e86\uff0c\u4f46\u662f\u60a8\u7684 Origin \u548c Local Repo \u7684 develop \u5206\u652f\uff0c\u8fd8\u548c Upstream develop \u4e0d\u540c\u6b65\uff0c\u7ee7\u7eed\u6267\u884c\u4ee5\u4e0b\u64cd\u4f5c\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"cd ~/cskefu/cskefu\ngit checkout develop\ngit pull upstream develop\ngit push origin develop\n")),(0,l.kt)("p",null,"\u4f5c\u4e3a\u5019\u9009\uff0c\u60a8\u53ef\u4ee5\u5220\u9664\u672c\u5730\u7684 feature \u5206\u652f\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"git branch -d feature/879\n")),(0,l.kt)("p",null,"\u6625\u677e\u5ba2\u670d\u662f\u6700\u6d41\u884c\u7684\u5f00\u6e90\u5ba2\u670d\u7cfb\u7edf\uff0c\u73b0\u5728\u5df2\u7ecf\u5728\u4f01\u4e1a\u90e8\u7f72\u8d85\u8fc7 19,000 \u6b21\uff0c\u4e3a\u6570\u767e\u653f\u5e9c\u673a\u6784\u3001\u4e8b\u4e1a\u5355\u4f4d\u548c\u4f01\u4e1a\u4e0a\u7ebf\u667a\u80fd\u5ba2\u670d\u7cfb\u7edf\uff0c\u73b0\u5728\u60a8\u662f\u6625\u677e\u5ba2\u670d\u7684\u5f00\u53d1\u8005\u4e00\u5458\u4e86\uff01"),(0,l.kt)("p",null,"\u6625\u677e\u5ba2\u670d\u4f1a\u5c3d\u5feb\u7684\u5c06\u60a8\u6dfb\u52a0\u5230",(0,l.kt)("a",{parentName:"p",href:"https://github.com/cskefu/cskefu#%E8%B4%A1%E7%8C%AE%E8%80%85%E5%88%97%E8%A1%A8-"},"\u8d21\u732e\u8005\u5217\u8868"),"!"),(0,l.kt)("h2",{id:"\u5e38\u89c1\u95ee\u9898"},"\u5e38\u89c1\u95ee\u9898"),(0,l.kt)("h3",{id:"\u5982\u4f55\u786e\u5b9a\u5de5\u4f5c\u7684-issue"},"\u5982\u4f55\u786e\u5b9a\u5de5\u4f5c\u7684 Issue"),(0,l.kt)("p",null,"Issue \u5373\u5de5\u4f5c\u7684\u5185\u5bb9\uff0c\u8bb0\u5f55\u5728\u6625\u677e\u5ba2\u670d\u7684",(0,l.kt)("a",{parentName:"p",href:"https://github.com/cskefu/cskefu/issues"},"\u5de5\u5355(Issue)"),"\u4e2d\uff0c\u53ef\u4ee5\u521b\u5efa\u6839\u636e\u60a8\u81ea\u5df1\u7684\u9700\u8981\u521b\u5efa\u5de5\u5355\uff0c\u6216\u8005\u9009\u62e9\u4e00\u4e2a\u5df2\u6709\u7684\u5de5\u5355\u3002"),(0,l.kt)("h3",{id:"\u5982\u4f55\u642d\u5efa\u5f00\u53d1\u73af\u5883"},"\u5982\u4f55\u642d\u5efa\u5f00\u53d1\u73af\u5883"),(0,l.kt)("p",null,"\u5f00\u53d1\u73af\u5883\u642d\u5efa\uff0c\u5305\u62ec\u4e0b\u8f7d\u6e90\u7801\u3001\u5b89\u88c5 IDE\u3001\u542f\u52a8\u6570\u636e\u5e93\u548c\u914d\u7f6e\u9879\u76ee\u7b49\u3002"),(0,l.kt)("p",null,"\u8be6\u7ec6\u5185\u5bb9\uff0c\u53c2\u8003\u6587\u6863",(0,l.kt)("a",{parentName:"p",href:"https://docs.cskefu.com/docs/osc/engineering"},"\u5f00\u53d1\u73af\u5883\u642d\u5efa"),"\u3002"),(0,l.kt)("h3",{id:"\u5982\u4f55\u5feb\u901f\u5165\u95e8\u5b9a\u5236\u6625\u677e\u5ba2\u670d"},"\u5982\u4f55\u5feb\u901f\u5165\u95e8\u5b9a\u5236\u6625\u677e\u5ba2\u670d"),(0,l.kt)("p",null,"\u6625\u677e\u5ba2\u670d\u793e\u533a\u53d1\u5e03\u4e86",(0,l.kt)("a",{parentName:"p",href:"https://docs.cskefu.com/docs/osc/training"},"\u300a\u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802\u300b"),"\uff0c\u5feb\u901f\u7684\u5165\u95e8\u4ee5\u53ca\u719f\u6089\u5f00\u53d1\u6280\u80fd\u3002"),(0,l.kt)("p",null,"\u5728\u300a\u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802\u300b\u4e2d\uff0c\u6709\u5f88\u591a\u77e5\u8bc6\u5185\u5bb9\uff0c\u800c\u5355\u5143\u6d4b\u8bd5\u3001AOP \u53d8\u6210\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u7b49\u4e5f\u6d89\u53ca\uff0c\u5185\u5bb9\u4e30\u5bcc\u3002"),(0,l.kt)("h3",{id:"\u5982\u4f55\u5feb\u901f\u638c\u63e1-git"},"\u5982\u4f55\u5feb\u901f\u638c\u63e1 Git"),(0,l.kt)("p",null,"Git \u7528\u4e8e\u7248\u672c\u7ba1\u7406\uff0c\u4f7f\u7528 Git \u65f6\uff0c\u4e00\u4e2a\u6587\u4ef6\u6709\u4e09\u4e2a\u53ef\u80fd\u5b58\u5728\u7684\u5730\u65b9\uff1aindexed\uff08\u7d22\u5f15\u533a\uff09\uff0cstaged\uff08\u6682\u5b58\u533a\uff09 \u548c workarea\uff08\u5de5\u4f5c\u533a\uff09\u3002indexed \u6587\u4ef6\u5c31\u662f\u88ab\u7d22\u5f15\u4e86\uff08\u63d0\u4ea4\u4e86\uff09\uff1bstaged \u5c31\u662f\u88ab\u4e34\u65f6\u7684\u4fdd\u5b58\u4e86\uff08\u6682\u672a\u63d0\u4ea4\uff0c\u4fdd\u62a4\u4e00\u4e0b\uff09\uff1bworkarea\uff0c\u5728\u7f16\u8f91\u5668\u4e2d\u6253\u5f00\u7684\u8fd9\u4efd\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"Git \u4f7f\u7528\u6982\u8ff0",src:A(35245).Z,width:"314",height:"160"})),(0,l.kt)("p",null,"\u4e0a\u56fe\u4e2d master \u6240\u5728\u533a\u5c31\u662f indexed\u3002"),(0,l.kt)("p",null,"Git \u7684\u7248\u672c\u7ba1\u7406\uff0c\u5c31\u662f\u6307\u8fd9\u4e09\u4e2a\u5c42\u9762\u540c\u4e00\u4e2a\u6587\u4ef6\u7684\u5dee\u5f02\u3002"),(0,l.kt)("p",null,"Git add: \u4ece workarea \u6dfb\u52a0\u5230 staged"),(0,l.kt)("p",null,"Git commit: \u4ece staged \u5230 indexed"),(0,l.kt)("p",null,"\u5f53\u7136\u8fd8\u6709\u4e0d\u540c\u7684\u65b9\u5411\uff0c\u8fd9\u6784\u6210\u4e86 git checkout, git stash, git restore, git reset, git clean \u7b49\u547d\u4ee4\u3002"),(0,l.kt)("p",null,"\u5f53\u672c\u5730\u7684 Git \u5e93\u548c\u5b83\u7684\u8fdc\u7a0b\u7684 Git \u5e93\u540c\u6b65\u65f6\uff0c\u5c31\u6d89\u53ca\u4f7f\u7528 git push \u548c git pull\u3002"),(0,l.kt)("p",null,"\u4ee5\u4e0a\u662f\u5bf9 Git \u7684\u7b80\u8981\u4ecb\u7ecd\uff0c\u5feb\u901f\u5165\u95e8 Git\uff0c\u9996\u5148\u719f\u6089\u5b83\u7684\u8fdc\u79bb\uff0c\u6bd4\u5982\u4ee5\u4e0a\uff1b\u5176\u6b21\uff0c\u505a\u4e00\u4e9b\u7ec3\u4e60\uff0c\u6bd4\u5982\u4f7f\u7528 ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/grayghostvisuals/practice-git"},"practice-git"),"\u3002"),(0,l.kt)("h3",{id:"\u5982\u4f55\u6210\u4e3a\u4e00\u4e2a\u4f18\u79c0\u7684\u5f00\u53d1\u8005"},"\u5982\u4f55\u6210\u4e3a\u4e00\u4e2a\u4f18\u79c0\u7684\u5f00\u53d1\u8005"),(0,l.kt)("p",null,"\u8981\u4ece\u5de5\u4f5c\u4e2d\u83b7\u5f97\u66f4\u591a\u5feb\u4e50\uff0c\u540c\u65f6\u4e5f\u4e3a\u4e86\u4e0d\u65ad\u6da8\u85aa\uff0c\u5c31\u9700\u8981\u4e0d\u65ad\u7684\u524d\u8fdb\uff0c\u4f9d\u8d56\u4e8e\u5fc3\u6001\u3002"),(0,l.kt)("p",null,"\u8fd9\u662f\u4e00\u4e2a\u6bd4\u63d0\u5347\u6280\u80fd\u66f4\u9700\u8981\u65f6\u95f4\u548c\u91cd\u89c6\u7684\u90e8\u5206\uff0c\u4e00\u4e2a\u597d\u7684\u5f00\u53d1\u8005\u7684\u5fc3\u6001\uff0c\u53ef\u4ee5\u548c\u4e00\u4e2a\u89c9\u609f\u8005\u76f8\u63d0\u5e76\u8bba\u4e86\uff0c\u90a3\u4e9b\u4e2a\u770b\u4e0d\u5230\u3001\u6478\u4e0d\u7740\u7684\u5b57\u8282\uff0c\u5b8c\u6210\u4f60\u7684\u590d\u6742\u7684\u903b\u8f91\uff0c\u9700\u8981\u4f60\u4fdd\u6301\u7a33\u5b9a\u548c\u7406\u6027\u7684\u72b6\u6001\u3002"),(0,l.kt)("p",null,"\u8fd9\u65b9\u9762\u6709\u5f88\u591a\u597d\u7684\u8bfb\u7269\uff0c\u6bd4\u5982",(0,l.kt)("a",{parentName:"p",href:"https://item.jd.com/10393278.html"},"\u300a\u7a0b\u5e8f\u5458\u4fee\u70bc\u4e4b\u9053\uff1a\u4ece\u5c0f\u5de5\u5230\u4e13\u5bb6\u300b"),"\u3001",(0,l.kt)("a",{parentName:"p",href:"https://item.jd.com/12058554.html"},"\u300a\u51a5\u60f3\u300b"),"\u548c",(0,l.kt)("a",{parentName:"p",href:"https://item.jd.com/10024708744202.html"},"\u300a\u7a0b\u5e8f\u5458\u7684\u81ea\u6211\u4fee\u517b\u2014\u2014\u94fe\u63a5\u3001\u88c5\u8f7d\u4e0e\u5e93\u300b"),"\u3002\u8fd9\u51e0\u672c\u4e66\uff0c\u503c\u5f97\u5e38\u770b\uff0c\u5e38\u770b\u53ef\u4ee5\u5e38\u65b0\u3002\u5c24\u5176\u662f\u300a\u51a5\u60f3\u300b\uff0c\u6bcf\u5929\u65e9\u665a\u5404\u5341\u5206\u949f\u51a5\u60f3\uff0c\u575a\u6301 90 \u5929\uff0c\u4fdd\u8bc1\u4f60\u6210\u4e3a\u7a0b\u5e8f\u5458\u4e2d\u7684\u5927\u5e08\uff01"),(0,l.kt)("div",{className:"footnotes"},(0,l.kt)("hr",{parentName:"div"}),(0,l.kt)("ol",{parentName:"div"},(0,l.kt)("li",{parentName:"ol",id:"fn-what-is-pr"},"\u4ec0\u4e48\u662f PR\uff1f\u5373 PullRequest\uff0c\u662f\u5408\u5e76\u4ee3\u7801\u7684\u7533\u8bf7\uff0c\u6625\u677e\u5ba2\u670d\u7684 PR \u5217\u8868\u89c1 ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/cskefu/cskefu/pulls"},"https://github.com/cskefu/cskefu/pulls"),(0,l.kt)("a",{parentName:"li",href:"#fnref-what-is-pr",className:"footnote-backref"},"\u21a9")),(0,l.kt)("li",{parentName:"ol",id:"fn-what-is-dco"},"\u4ec0\u4e48\u662f DCO\uff1fDCO \u662f\u4e00\u79cd\u8d21\u732e\u8005\u534f\u8bae\uff0c\u4ee3\u8868\u60a8\u6709\u6743\u529b\u5c06\u4ee3\u7801\u8d21\u732e\u81f3\u5f00\u6e90\u793e\u533a\uff0c\u6625\u677e\u5ba2\u670d\u5408\u5e76\u7684\u4ee3\u7801\u5fc5\u987b\u6709 DCO \u6216 CLA \u534f\u8bae\uff0c\u8be6\u7ec6\u4ecb\u7ecd ",(0,l.kt)("a",{parentName:"li",href:"https://www.cskefu.com/2022/10/19/vote-cla-dco-result/"},"https://www.cskefu.com/2022/10/19/vote-cla-dco-result/"),(0,l.kt)("a",{parentName:"li",href:"#fnref-what-is-dco",className:"footnote-backref"},"\u21a9")))))}u.isMDXComponent=!0},61612:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/cskefu-pr-workflow-3c7b67afe5eda0962fbc871933c9a955.png"},52750:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819144222-0a5c30b13d9f2b30841a94c7e87dc073.png"},21039:(e,t,A)=>{A.d(t,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA8UAAAGsCAYAAAD0VgXXAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAHYcAAB2HAY/l8WUAACJSSURBVHhe7d3LryTXfR9w/QWBSQ45FClS0IMiafElzpAUJYu2xPgB2lIoSoYlJZbiTQAhGyPeeCdo5U2gnVeKAb2lANplqaVXVlYJsoiz8ypeRHkgAbLIojO/Oy7yzJlfVZ3qe7tv9zmfA3xg3/P7nb5zwepyfV3ddd73jx64uQMAAIARCcUAAAAMSygGAABgWEIxAAAAwxKKAQAAGJZQDAAAwLCEYgAAAIYlFAMAADAsoRgAAIBhCcUAAAAMSygGAABgWEIxAAAAwxKKAQAAGJZQDAAAwLCEYgAAAIYlFAMAADAsoRgAAIBhCcUAAAAMSygGAABgWEIxAAAAwxKKAQAAGJZQDAAAwLCEYgAAAIYlFAMAADAsoRgAAIBhCcUAAAAMSygGAABgWEIxAAAAwxKKAQAAGJZQDAAAwLCEYgAAAIYlFAMAADAsoRgAAIBhCcUAAAAMSygGAABgWEIxAAzkxs0ndx9+6rnd8y+9urv92hu71z712d0nP/05gKHFuTDOiXFujHNknCuzcyh9EooBYABxgffsc7fSi0EA7hfnTOF4DEIxAHTuyQ89c88d4U/c/o3dcy99cvfMc7d3H33mxd2HP/Y8wNDiXBjnxDg3xjlyOl/GuTPOodm5lX4IxQDQsfgY4HRx98rrv7X72K9/Ir0gBOA9T3/85Ytz5nT+jHNpdo6lD0IxAHQq7m5MF3Qv3vrU7iNPv5Be/AFwvzhnxrlzOo+6Y9wvoRgAOhTfg5s+Mv3irdfTCz4A1sU5NM6lcU71HeM+CcUA0KHpoVqvvP6b7hADXEKcQ6ePUse5NTvnct6EYgDoTNzJiIu34DvEAJcX3zGezqvuFvdHKAaAzkwP13r51c+kF3cAbHfrtc9cnFs9dKs/QjEAdOb5l169uHB74WXfJQa4KnFOjXNrnGOzcy/nSygGgM7cfu2Niwu3Z5+/nV7YAbBdnFPj3Brn2Ozcy/kSigGgM9NTp5969sX0wg6A7eKcGufWOMdm517Ol1AMAJ2Ji7aQXdQBsL/p/JqdezlfQjEAdEYoBjgMobhPQjEAdEYoBjgMobhPQjEAdEYoBjgMobhPQjEAdEYoBjgMobhPQjEAdEYoBjgMobhPQjEAdEYoBjgMobhPQjEAdEYoBjgMobhPQjEAdEYohvP07//D374rq5+j8m+a/q7656y3nD8lQnGfhGIA6MwphOLy4raW9QP9heLy7yn/rvrnrL+cPyVCcZ+EYgDozHWG4vKidkm29lCu43fCPq7rPXII5d9S/z1b50+JUNwnoRgAOnNdobi8oF26qD3mBW/LvwdORU/H6z5/yz5rjk0o7pNQDACduY5QfKoXs6f674JMT8frPn/LPmuOTSjuk1AMAJ05dig+5QvZU/63Qa2n43Wfv2WfNccmFPdJKAaAzpxzKC5fq5T1Lsleo9TaX/ctaVm31FPWSnXfZK1nrl7P1z+vyfrLuXI+U/cu9dc99c9ZX6ns2ac3ZD3lXDlfq/tKa/1ZPZOtKefK+VJdr3+e6y3VfUu9k7pnbm05n9WX+g5JKO6TUAwAnTlmKL7Ki9PytTLZmjnZ+tK+vWvW1szVp/k5dX+9Zku9nK+VfXPq/vLnUr1uqXeypX9LT0tvqPvrNfXPpaV1c5bW1LU59Zry59LSulprXyh7W/vrn7O15Xxdy9T9hyIU90koBoDOnGMoXnqdpdqatbVL9aXanKU1c7W5+cvUlurlfF1rsbR+bn6pNjdf19bqWa3+eam3pVbXW2rlXDmf1efml5Rr6nVz83Utq9c9W2pr9bnaVc0fklDcJ6EYADpzSqG4rNfmesr1WU9Wn7O0rqxl9bonq9eW+rNaOVfOl+bqc/Nr9XK+rrVYW5vVs7nSXL2cr2t1va6Vyr653rn63HxrPTO3Zm5+ydqauXo5X9da6nXPVdSy+WyutFa/akJxn4RiAOjMOYficm2ppSeztG6pNmnpqc31Z/PTXNY/meuZm1+rz823Wluf1bO50lx9bj6rz/WEy/TMzbfWQ9lTm+sr55esrZmrz8231sNSzz61bD6bK63Vr5pQ3CehGAA6c0qhuJb1Z3O1lp7M0rql2qSlp5atyeaW5ktzPXPza/W5+VZr67N6Obdm7bVqZU9prqecL831zM2v1cv5JXNryvkla2vm6nPzrfWw1LNPLZsv59aUr3UoQnGfhGIA6IxQ/J6ldUu1SUtPpl4z9xrTfFabzPXMza/V5+Zbra3P6uXcmrXXmlP21muyudpcz9z8Ur2cq2tza5bml6ytmavPzbfWw1LPPrVsvpxbU77WoQjFfRKKAaAzxwzFYctFadabzdVaejJL65Zqk5aeTL1m7jWm+aw2meuZm1+rz823Wluf1bO5FvusK9dM6+qfM3M9c/NL9WyuNFefm1+ytmauPjffWg9LPfvUsvls7joJxX0SigGgM9cZitcuXLO+cq6cL63V5yytK2tZve7J6nPKdaW1vrpe97TMr9Xn5lutrc/q2VyLq1pX/jzN1ebqc/NL9WyuNFefm1+ytmauPjef1Vt6rqKWzWdz10ko7pNQDACdOXYoDuWF69LF61zP3Pxabc3a2qX6Uq1FuX7pNZZ6Wmt1vbVWzrcq19evMTe/Vpvq2dzWNdN8vS6bu2xtrl7OlfNbauX8knJNvW5ufq02WepZqq3V52pb58t6Nn8IQnGfhGIA6Mx1hOJQXri22Lq+7m+RvU5o6ZmUvVtseZ26t5atCVlvZm5NOd+qXL9kn7VL/XWtrmcu21+v2VIv55fMrSnnl5Rrliytq2ulsi+TrQlLPXO1ufm6lqn7D0Uo7pNQDACdua5QPMkuWEvZmknWH7LeVi2vl/WEum+rLa9V9pay3tJcfza3NN+qXl/+PM0tqfsna71r9VrWH7LekPWGtZ6lelkr69nc0vySek358zSXaemZlL2lrHey1DdXm5vP6qWs91CE4j4JxQDQmesOxbznOi7aD+26wgg5/z2OSyjuk1AMAJ0Rik9Dr2Gl17/rXPnvcVxCcZ+EYgDojFB8GnoNKkLYafHf47iE4j4JxQDQGaH4+vUcVHr+286R/x7HJRT3SSgGgM4IxdenDCi9hpTe/75z47/HcQnFfRKKAaAzQvH1GSGgjPA3nhP/PY5LKO6TUAwAnXntU5+9uGj76DMvphd1AGwX59Q4t8Y5Njv3cr6EYgDozO3X3ri4cHvmuVvphR0A28U5Nc6tcY7Nzr2cL6EYADrz/EuvXly4PffSa+mFHQDbxTk1zq1xjs3OvZwvoRgAOvPhp567uHB76dan0ws7ALb7xO1PX5xb4xybnXs5X0IxAHTmxs0nLy7cXvvU53ZPPftSenEHQLs4l8Y5Nc6tcY7Nzr2cL6EYADr07PTdt0/+5u4jT7+QXuQBsC7OoXEujXNqnFuzcy7nTSgGgA7FnYzpKdQvvPx6eqEHwLo4h9799M1n3SXulFAMAJ168kPPXFzIhRdvfcodY4AN4pwZ587pPBrn1Oxcy/kTigGgY9NDt8Irr//W7umPv5xe/AHwnqc/fuvinDmdPz1cq29CMQB0Lu5uTB+lDvHduLj78esv3N499eyL6QUhwEjiXBjnxDg3Tt8fDnHudIe4f0IxAAwgvgc3PXwLgHVxzvQd4jEIxQAwkLjAi48BPv/Sq7vbr71xzx1kgFHFuTDOiXFujHOkMDwWoRgAAIBhCcUAAAAMSygGAABgWEIxAAAAwxKKAQAAGJZQDAAAwLCEYgAAAIYlFAMAADAsoRgAAIBhCcUAAAAMSygGAABgWEIxAAAAwxKKAQAAGJZQDAAAwLCEYgAAAIYlFAMAADAsoRgAAIBhCcUAAAAMSygGAABgWEIxAAAAwxKKAQAAGJZQDAAAwLCEYgAAAIYlFAMAADAsoRgAAIBhCcUAAAAMSygGAABgWEIxAAAAwxKKAQAAGJZQDAAAwLCEYpjxo/c/tPvXj97YPfVgXgcAAM6fUAwznnvokd2/uROM/88TD+z+8wce3P2rRx5O+wAAgPMlFEODb928sfvvTz6w+393/M3jD+7+5Z2A/EjSBwAAnBehGDb4Fzcf3v3qiQd2uzvhePfkr+1++YEHd39+JzDHXeWsHwAAOG1CMezhGw8/vPtvH5jC8d2A/F/uBOS/fPSh3Vt3atkaAADg9AjFcAlxl/hX/xCKy4D8P5/4td3PH3to981Hbuye8KAuAAA4WUIxXFJ8t/gvbj60+193gnAdjie/fPzBi+8lf/qGj1kDAMApEYrhisQd4fj49P+9787xvQH57z7wwO6v3v/Q7msPe1gXAABcN6EYrljsaxx7HJdB+K57w3GIAP3vHntw96ePPOxhXQAAcA2EYjiQ+Kh0BN57g/D9wbj0Hx9/YPedR2/s3vQxawAAOAqhGA4snkb9149vC8fh75944OKO85/cWe9hXQAAcBhCMRxJfIc47gTfH4Bjbj0k/+JOsI6nXd/2MWsAALgyQjEcWWzTFHeB7w++09x6QI6HdcVDvd7xMWsAALgUoRiuQTx1Ou76xn7GWehtvXsc4mFd057I8ZCv7PcBAAA5oRiuUXxXOPY4fm8bp0x7QA7xEW17IgMAQBuhGE5A3OGNj0NnIfde7eE4xMe07YkMAADzhGI4IbFX8f3bOF0deyIDAMC9hGI4QfHR5/u3capNH6vedvd48rcfePDi7rQ9kQEAGJlQDCcs9jjOt3GqfDD+537hOMQDv+JhXfZEBgBgNEIxnIH4TnBsw5QF2nvtf+e49MsT3xPZx78BALgqQjGckQiq+R7Hcy4fkCOMx8O6TmlP5Pg3uaMNAMBVEIrhzMRTpGMbp/k9jjNXcwc5to6Kh3Vd557I8Xvj3xJ3sz1RGwCAyxKK4UzFndJ4UNbyHseZy4fjSXzf+TuPHndP5Pjo9PT743vQWQ8AALQSiuHMxZ3TH72/ZY/j0nTn+OoCcnysO/4d8bCuQ97BLUNxiFCe9QEAQAuhGDoRd2v32+P4asPx5Bf/8LCuq34oVh2KQ+y9nPUCAMAaoRg6E9s4re9xnLn6YDyZ9kSOf1v2b94iXiP7Haf0IDAAAM6HUAydim2cmvY4vs9h7hxPpj2R42Fd+zxBei4Ux3erj/ndZgAA+iAUQ+cifG7bxql02IAc4inS37rZ/rCuuVAc4u+0hzEAAFsIxTCAePBVfL932zZOtcMH5GlP5LjLPfewrqVQHOKj2vYwBgCglVAMA4mwGHscb9/GqXT4cBymPZHjIVrl3d+48531l+I71fYwBgCghVAMA4ptnOLBV1mgbDeF48MH5DDtiRyyes0exgAAtBCKYWBxB3a/bZwyxwnHW9jDGACANUIxcPGQq/22caqdXjC2hzEAAEuEYuBd8RCr/bZxqk0fqz6NkGwPYwAA5gjFwH3i6c/xJOgsYG53/eE4nrptD2MAADJCMTArPnq8/x7HtesNxxHy7WEMAEBNKAYWxdZGsY3T5fY4rl1PQI6PhtvDGACAklAMNIkwGds4XW6P48xxw/Ev7GEMAEBBKAY2iT2Of/T+y+5xPOc4ATn+/dnfBgDAeIRiYC+3r3SP49JxPlodHwnP/i4AAMYiFAOXEts4Xc0ex5nDBuRvPnIj/ZsAABiHUAxcidjG6Wr2OM4c5nXj+9H2MAYAGJtQDFypuPt6dXsc167+zrE9jAEAxiYUA1cunu785zdvXPE2TrWrC8f2MAYAGJdQDBxMbOMUD7S6+m2cape/gxwf/bZVEwDAeIRi4OBiG6fY4zgLo1frTjD+YDbfJvYwzv79AAD0SygGjiY+ovzzx44Ujve8e/xXe+5h/NgzH9q98rXbu7e+/ebuK9/9wu4bP/3S7p//2y/DWYnjNo7fOI7jeI7jOjveAaAnQjFwdPFgq8Nt43R537rZvlVThIY3/+yNNGBAD+L4Fo4B6JlQDFyb2OP4cNs41bb9nj+582/L/s2lFz7/4j13hL/2ky/s/uhHv7/78g9+d/f29z+3+yff+yyclThu4/iN4ziO5+nYjuM8jvfsfQAA504oBq5d7HF8uG2cam0fq46Hg0Voz/69IT5aOgWGr//snd07P/jtNGTAOfvSneM6ju/pWI/jPns/AMA5E4qBk/Gnjzy8+/snjhWOw3JAji2lbidbNcUdsykkfPXHn9+9/T13helXHN9xnE/HvDvGAPRGKAZORtyZPfz2TZkpHN//u+MOdjw9e/o3xncrp49Mf/Unf5CGCOhRHO9x3Mfx7zvGAPREKAZOQjx8K+7M1qH0+O4Px+UextNDtb7+sy+6Q8xQ4nifPkod74P6PQwA50ooBq5dfET5NAJx7b2AHHsYx92xCATBd4gZUXzHeHoPuFsMQC+EYuBaxd7Fx3vI1mU8sPubFx67CAP/7Cdvp4EBRvDHP3374n3goVsA9EIoBq7NEw/ePItAHB+f/k+PP7j7H08/vPu715/YffXHv5+GBRhBHP8Rit/69pvp+xoAzo1QDFyLCMTH26P4rviI9l/fCbeT7zx6Y/cXNx+68M1Hblw86Cu8eeP+J06Hr3z37r6tf/jD303DAozgyz/4vYv3QbwfsvcJAJwboRg4unhoVYTSLLi2ikA9hdufP3Y32E6mcBvKJ0df1vTU6S9+/800LMAI4viP90G8H7L3CQCcG6EYOKoIxPHQqincxhZMU7gNf/noe+G25e7tMUUQCFlQgJFM74XsfQIA50YoBo4q7tzGw7Wy2qkTiuEuoRiAngjFAI2EYrhLKAagJ0IxQCOhGO4SigHoiVAM0EgohruEYgB6IhQDNBKK4S6hGICeCMUAjYRiuEsoBqAnQjFAI6EY7hKKAeiJUAzQSChmTjmyem+EYgB6IhQDNDp2KK5H1jMpR1Y/ZUsj6w9LY6m3rtXKkdXnlCOr90YoBqAnQjFAI6H4arWMq15T12rlyOpzypHVeyMUA9AToRig0XWH4hhZXyhHVj9F5ZirZ3PTqGtTPZubRl2rlSOrzylHVu+NUAxAT4RigEanEIpjrPVm9VNTjqyeKUdWn1OOrF4qR1afU46s3huhGICeCMUAjYTiq1OOrJ4pR1afU46sXipHVp9TjqzeG6EYgJ4IxQCNrjMUZz8v9WaysdRT19bq5ahrtXJk9Uw5svqccmT1Ujmy+pxyLNVirNVjLPXUtUk5svpVEooB6IlQDNDoukNxOVf2lfMx6lpdz0bWV65vqZejrmXqkfXU6pH11MqR1UvlyOpzyjE3H6OsZfV6ZL3lXGkaWe2qCcUA9EQoBmh0SqE4xlrvWq0cW+djlLWyXs/PmRtZ72RuZL2TfUf2WnPK0TK/VCtHy/xa7RCEYgB6IhQDNDqFUFzOZ3MxWuaX6uWY640xVyvnW2Qj6ytlI+sL+47steaUY2mupTZXL0fZu1Y7BKEYgJ4IxQCNTi0Ux9ind61ejrneaayt2SIbWV8pG0s9da1Wjqw+pxzZz7VybKlPo5xbmj8UoRiAngjFAI1OJRRntXLM9a2NbN2+P19GObJ6phxbarVyZPU5cyPrDVvG3LqluUMTigHoiVAM0GjEUByj/Lmuz/18WeXI6plytMxnypHV58yNrDdsGXNr534+BqEYgJ4IxQCNTikU1/VyzPWU82vKUf5c17Peq1COrJ4pR8t8phxZfU45sp9r5cjqS6Yx9/MxCMUA9EQoBmh0aqE4ZGOuXs63mMb0v8/Vp1HXL6McWT1Tjpb5TDmy+pxyLM211NbMjaz3UIRiAHoiFAM0OsdQXPfUtak+N1+OrfUl01iqTaOeL3vr2jTmauV8phxZfU45WubXalM9mw/1yHoOSSgGoCdCMUCjUwzFoR4tPfVoWbO1vqR1XHZNva6u1cqR1eeUY24+RlnL6vWo+yf1yHoOSSgGoCdCMUCjcw7FYW5kvaEeW+trlkbWH5ZG1h/KkdVL5cjqc8qxVIuxVp9G3VcrR1Y/JKEYgJ4IxQCNjh2KYck0stqhCcUA9EQoBmgkFHMqypHVD00oBqAnQjFAI6GYUzGNrHYMQjEAPRGKARoJxZyCcmT1YxCKAeiJUAzQSCjmOtUj6zkWoRiAngjFAI2EYq5TObL6MQnFAPREKAZo9I2ffukiCLz9/c+lQQFGEMd/vA/i/ZC9TwDg3AjFAI2+8t0vXISBL//wd9KwACOI4z/eB/F+yN4nAHBuhGKARm99+82LMPBHP3orDQswgjj+430Q74fsfQIA50YoBmj0ytduX4SBr/34C2lYgBH805/c/cREvB+y9wkAnBuhGKDRY8986CIMfONnX9698/1/nAYG6Fkc93H8x/sg3g/Z+wQAzo1QDLDBm3/2xkUg+OOffnH39vc8cItxxPEex30c//E+yN4fAHCOhGKADeLu2PQU6q/8+A/S8AA9iuP94pMSd45/d4kB6IlQDLDRC59/8SIchK/++PPuGNO1OL7jOJ+O+Tj+s/cFAJwroRhgD9NDt8LXf/bO7ks/+O00UMA5+9IPfufi+J6OdQ/XAqBHQjHAnuKO2fRR6hDft4w7an/4w9/bffH7b6YhA05ZHLdx/MZxPH1/OMRx7g4xAL0SigEuIb5bOT18C3oUx7fvEAPQM6EY4ApEaIiPlr717Td3X/nuF+65gwznIo7bOH7jOI7jWRgGYARCMQAAAMMSigEAABiWUAwAAMCwhGIAAACGJRQDAAAwLKEYAACAYQnFAAAADEsoBgAAYFhCMQAAAMMSigEAABiWUAwAAMCwhGIAAACGJRQDAAAwLKEYAACAYQnFAAAADEsoBgAAYFhCMQAAAMMSigEAABiWUAwAAMCwhGIAAACGJRQDAAAwLKEYAACAYQnFAAAADEsoBgAAYFjv+/DHnt8BAGyVXVgAwLkRigGAvWQXFgBwbnx8GgAAgGEJxQAAAAxLKAYAAGBYQjEAAADDEooBAAAYllAMAADAsIRiAAAAhiUUAwAAMCyhGAAAgGEJxQAAAAxLKAYAAGBYQjEAAADDEooBAAAYllAMAADAsIRiAAAAhiUUAwAAMCyhGAAAgGEJxQAAAAxLKAYAAGBYQjEAAADDEooBAAAYllAMAADAsIRiAAAAhiUUAwAAMCyhGAAAgGEJxQAAAAxLKAYAAGBYQjEAAADDEooBAAAYllAMAADAsIRiAAAAhiUUAwAAMCyhGAAAgGEJxQAAAAxLKAYAAGBYQjEAAADDEooBAAAYllAMAADAsIRiAAAAhiUUAwAAMCyhGAAAgGEJxQAAAAxLKAYAAGBYQjEAAADD2hyK/+uv/veFrAbHNh2PjkkAAGAfQjFnTSgGAAAuQyjmrAnFAADAZQjFGwlfAAAA/RCKNxj9/yEAAADQG6F4A6EYAACgL0LxBkIxAABAX9JQPIW/Ul0r+2vlupb+FtnrlK9f15bU69bWZv2lbE2m7i9fo5wv1T1zfZls7STrD1t6M0vr65+X5qe5rFab6ynXr6nXTrb0AgAA5+eeUJwFgFLZU66blL1zsnUtyvXl62XqtZOst7bPumxNpuwv15fzde+csjeTrSlt7Q/1mlLWXyp75taW//ucem25Zm5+Tb2uZW22BgAAOD/vhuK1C/6ynvUs1Vrqa8r12Wss1a6iHtbqa8rfsfQ6Sz1LtclaTz3f0n9V9axnS72ulfWsNmfpNfetAQAA5+e+UFwWa0uBYMv6rLZmWru0fqlnbW1Y62l5jSXT+rXXWOtZqq+tzbSsWerZsj7rW6pNlnrW1taWXqusZ7WwVgcAAM7HRSieLvJbLvSzvta1YUtvqXVd1te6Niz1bnmdTMv61t+R9U1zLesnW/qz3mmu5TXm+o61frLU3/parX0AAMBpuycU18VM1nvZ9S1a12V9rWvDUu+W18m0rG/9HVlf69rSljVZ72XXL83XLrs+rPW2vlZrHwAAcNqE4spS75bXybSsn3paZWvLuTVb1mS9l12/NF+7qvVLvWVPi+w1AACA8yEUV5Z6t7xOpmX91NMqW1vOrdmyJuu97Pql+dpl1k89W/paZK8BAACcD6G4stS75XUyLesv8zv2WbtlTdZ72fVL87XLrG/pCa19AABAH4TiylLvltfJtKy/zO+Y1m5Zv6U/673s+qX52r7r1+qlLb0AAMD5uwjFoSUMTD1Z35b1WW1N69q5vpb1az0tr7Gkdf1lfs8+a1vWLPVsWZ/1tawP+6yfanP1zNZ+AADgfN0XiufCQFnPepZqLfU1rWvn+qb5uddYq4eWniWta1t+z1ytXLvUU/+81n9V9axnbr62df00n9WWtKybq62tAwAATsu7oThMF/Rzyp5y3aTsnZOta9G6fqlvqi3J1pX2WTPZ0l++/pxsXch6a1exppT1l8qeubX1fG3r+mm+xT5r6zXluqwGAACcnntCcSgv+rML/GyuVq5t6W/R+jotfVNPKeubs+/arf2h/D2lrLeWrQtZ72Rrf2ltbTa3NF/bsn6aa1WuLWW9IesNa3UAAOC03BeK4VAERgAA4NQIxRzFFIiFYgAA4JQIxRyFQAwAAJwioZhLWwq7UxgWigEAgFMkFHNpdfCdk60FAAC4TkIxVyILwZOsHwAA4BQIxQAAAAxLKAYAAGBYQjEAAADDEooBAAAYllAMAADAsIRiAAAAhiUUAwAAMCyhGAAAgGEJxQAAAAxLKAYAAGBYQjEAAADDEooBAAAYllAMAADAsIRiAAAAhiUUAwAAMCyhGAAAgGEJxQAAAAxLKAYAAGBYQjEAAADDEooBAAAYllAMAADAsIRiAAAAhiUUAwAAMCyhGAAAgGEJxQAAAAxLKAYAAGBYQjEAAADDEooBAAAYllAMAADAsIRiAAAAhiUUAwAAMCyhGAAAgGEJxQAAAAxLKAYAAGBYQjEAAADDEooBAAAYllAMAADAsIRiAAAAhiUUAwAAMCyhGAAAgGEJxQAAAAxLKAYAAGBYQjEAAADDEooBAAAYllAMAADAsIRiAAAAhiUUAwAAMCyhGAAAgGEJxQAAAAxLKAYAAGBYQjEAAADDEooBAAAYllAMAADAsIRiAAAAhiUUAwAAMCyhGAAAgGEJxQAAAAxLKAYAAGBYQjEAAADDEooBAAAYllAMAADAsIRiAAAAhiUUAwAAMCyhGAAAgGEJxQAAAAxLKAYAAGBYQjEAAADDEooBAAAYllAMAADAsIRiAAAAhiUUAwAAMCyhGAAAgGEJxQAAAAxLKAYAAGBYQjEAAADDEooBAAAYllAMAADAsIRiAAAAhiUUAwAAMKz3feLVz+wAAF565Td2z996fffMc7d2T37k2d1DjzyRXjwAQE/eF/8HEAAgC8pPPfuicAxA13x8GgB41wMPP757/xMf3X30mRffDcYRmB//4MfSfgA4d0IxAJCKgFyG46efezntA4BzJhQDAIue+NDT7wZjd4wB6I1QDACsmoJxfJTad4wB6IlQDAA0mT5KHQ/fyuoAcI6EYgCgSXzHePoYtbvFAPRCKAYAmk13i2Mf46wOAOdGKAYAmsV2TRGKn3nuVloHgHMjFAMAzaaPUD9/6/W0DgDnRigGADaJUBxPoc5qAHBuhGIAYJMIxBGMsxoAnBuhGADYRCgGoCdCMQCwiVAMQE+EYgBgE6EYgJ4IxQDAJkIxAD0RigGATYRiAHoiFAMAmwjFAPREKAYANhGKAeiJUAwAbCIUA9AToRgA2EQoBqAnQjEAsIlQDEBPhGIAYBOhGICeCMUAwCZCMQA9EYoBgE2EYgB6IhQDAJsIxQD0RCgGADYRigHoiVAMAGwiFAPQj5u7/w/TiSMwsTzhQwAAAABJRU5ErkJggg=="},57775:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819150059-5e3326d126bbf5e97b5caeea5f694a2b.png"},38511:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819154050-2d137798a1f11be8981b439eaee81efa.png"},78518:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819154121-e1cb12b4246e82b3022b57993c194be9.png"},33084:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819154635-de937cd27c3de3a15ad24f0f1507fe66.png"},52252:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819170111-fdbef6538d9cd1d37fb0f36923132c2a.png"},47533:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819171137-8a2b8326dacdc517e6b6b844d9543d77.png"},17443:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819171254-8e4266b176a66cb068ae9a379b68e521.png"},72384:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819172301-2a2c58b2705cec61413a91a35db5866f.png"},44586:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819172636-f48e17bba2af5efbd891998b62bbd537.png"},88940:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819172750-b3cf243e5f1744dcf33e5d35bc141642.png"},98069:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819173250-72420506e5185a8c5a0c580c66160b61.png"},12150:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819173357-981832576196d967ac12b09bd46dadf9.png"},56508:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819173544-260706de594d5889d16453b847d00896.png"},21198:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819174201-3678cdf3186f57a60adaadab40dbd9ef.png"},90659:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819174401-960332cb6dc3f3ddd536632dc202e7bd.png"},40183:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819174514-641d54479c3be63155c0c0db0ee6599d.png"},11461:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230828081950-0359d8b46cf971131363c6434ef3bf85.png"},35245:(e,t,A)=>{A.d(t,{Z:()=>n});const n="data:image/png;base64,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"}}]); \ No newline at end of file diff --git a/assets/js/715c4002.a534adde.js b/assets/js/715c4002.a534adde.js deleted file mode 100644 index ed74277f..00000000 --- a/assets/js/715c4002.a534adde.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcskefu_docs=self.webpackChunkcskefu_docs||[]).push([[3681],{3905:(e,t,A)=>{A.d(t,{Zo:()=>p,kt:()=>d});var n=A(67294);function l(e,t,A){return t in e?Object.defineProperty(e,t,{value:A,enumerable:!0,configurable:!0,writable:!0}):e[t]=A,e}function i(e,t){var A=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),A.push.apply(A,n)}return A}function r(e){for(var t=1;t=0||(l[A]=e[A]);return l}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,A)&&(l[A]=e[A])}return l}var a=n.createContext({}),o=function(e){var t=n.useContext(a),A=t;return e&&(A="function"==typeof e?e(t):r(r({},t),e)),A},p=function(e){var t=o(e.components);return n.createElement(a.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var A=e.components,l=e.mdxType,i=e.originalType,a=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),c=o(A),d=l,k=c["".concat(a,".").concat(d)]||c[d]||u[d]||i;return A?n.createElement(k,r(r({ref:t},p),{},{components:A})):n.createElement(k,r({ref:t},p))}));function d(e,t){var A=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var i=A.length,r=new Array(i);r[0]=c;var s={};for(var a in t)hasOwnProperty.call(t,a)&&(s[a]=t[a]);s.originalType=e,s.mdxType="string"==typeof e?e:l,r[1]=s;for(var o=2;o{A.r(t),A.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>o});var n=A(87462),l=(A(67294),A(3905));const i={sidebar_position:3},r="\u63d0\u4ea4\u4ee3\u7801",s={unversionedId:"osc/contribution",id:"version-v8/osc/contribution",title:"\u63d0\u4ea4\u4ee3\u7801",description:"\u672c\u6587\u6863\u7684\u4f5c\u7528\uff1a\u8be6\u7ec6\u7684\u8bf4\u660e\u5982\u4f55\u63d0\u4ea4\u4ee3\u7801\u5230\u6625\u677e\u5ba2\u670d\u3002",source:"@site/versioned_docs/version-v8/osc/contribution.md",sourceDirName:"osc",slug:"/osc/contribution",permalink:"/cskefu-docs/docs/osc/contribution",draft:!1,editUrl:"https://github.com/cskefu/docs/tree/main/packages/create-docusaurus/templates/shared/versioned_docs/version-v8/osc/contribution.md",tags:[],version:"v8",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"\u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802",permalink:"/cskefu-docs/docs/osc/training"},next:{title:"\u5f00\u53d1\u73af\u5883\u642d\u5efa",permalink:"/cskefu-docs/docs/osc/engineering"}},a={},o=[{value:"\u6210\u4e3a\u5f00\u53d1\u8005\u6211\u5f97\u5230\u4ec0\u4e48",id:"\u6210\u4e3a\u5f00\u53d1\u8005\u6211\u5f97\u5230\u4ec0\u4e48",level:2},{value:"\u89c6\u9891\u6559\u7a0b",id:"\u89c6\u9891\u6559\u7a0b",level:2},{value:"\u524d\u63d0\u51c6\u5907",id:"\u524d\u63d0\u51c6\u5907",level:2},{value:"Bash \u547d\u4ee4\u884c\u7ec8\u7aef",id:"bash-\u547d\u4ee4\u884c\u7ec8\u7aef",level:3},{value:"Git",id:"git",level:3},{value:"Git Flow",id:"git-flow",level:3},{value:"SSH Keys",id:"ssh-keys",level:3},{value:"GitHub",id:"github",level:3},{value:"\u5feb\u901f\u638c\u63e1",id:"\u5feb\u901f\u638c\u63e1",level:2},{value:"\u6d41\u7a0b\u6982\u8ff0",id:"\u6d41\u7a0b\u6982\u8ff0",level:3},{value:"1/15 Fork code repo",id:"115-fork-code-repo",level:3},{value:"2/15 Clone code repo",id:"215-clone-code-repo",level:3},{value:"3/15 New local branch",id:"315-new-local-branch",level:3},{value:"4/15 Commit sign-off codes",id:"415-commit-sign-off-codes",level:3},{value:"5/15 Git flow publish",id:"515-git-flow-publish",level:3},{value:"6/15 Open new PR",id:"615-open-new-pr",level:3},{value:"7/15 Set PR settings",id:"715-set-pr-settings",level:3},{value:"8/15 Checks on PR",id:"815-checks-on-pr",level:3},{value:"9/15 Code reviews",id:"915-code-reviews",level:3},{value:"10/15 Modify codes",id:"1015-modify-codes",level:3},{value:"11/15 Re-push codes",id:"1115-re-push-codes",level:3},{value:"12/15 Checks on PR",id:"1215-checks-on-pr",level:3},{value:"13/15 Code reviews again",id:"1315-code-reviews-again",level:3},{value:"14/15 PR merged",id:"1415-pr-merged",level:3},{value:"15/15 Pull to local",id:"1515-pull-to-local",level:3},{value:"\u5e38\u89c1\u95ee\u9898",id:"\u5e38\u89c1\u95ee\u9898",level:2},{value:"\u5982\u4f55\u786e\u5b9a\u5de5\u4f5c\u7684 Issue",id:"\u5982\u4f55\u786e\u5b9a\u5de5\u4f5c\u7684-issue",level:3},{value:"\u5982\u4f55\u642d\u5efa\u5f00\u53d1\u73af\u5883",id:"\u5982\u4f55\u642d\u5efa\u5f00\u53d1\u73af\u5883",level:3},{value:"\u5982\u4f55\u5feb\u901f\u5165\u95e8\u5b9a\u5236\u6625\u677e\u5ba2\u670d",id:"\u5982\u4f55\u5feb\u901f\u5165\u95e8\u5b9a\u5236\u6625\u677e\u5ba2\u670d",level:3},{value:"\u5982\u4f55\u5feb\u901f\u638c\u63e1 Git",id:"\u5982\u4f55\u5feb\u901f\u638c\u63e1-git",level:3},{value:"\u5982\u4f55\u6210\u4e3a\u4e00\u4e2a\u4f18\u79c0\u7684\u5f00\u53d1\u8005",id:"\u5982\u4f55\u6210\u4e3a\u4e00\u4e2a\u4f18\u79c0\u7684\u5f00\u53d1\u8005",level:3}],p={toc:o};function u(e){let{components:t,...i}=e;return(0,l.kt)("wrapper",(0,n.Z)({},p,i,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"\u63d0\u4ea4\u4ee3\u7801"},"\u63d0\u4ea4\u4ee3\u7801"),(0,l.kt)("p",null,"\u672c\u6587\u6863\u7684\u4f5c\u7528\uff1a\u8be6\u7ec6\u7684\u8bf4\u660e\u5982\u4f55\u63d0\u4ea4\u4ee3\u7801\u5230\u6625\u677e\u5ba2\u670d\u3002"),(0,l.kt)("h2",{id:"\u6210\u4e3a\u5f00\u53d1\u8005\u6211\u5f97\u5230\u4ec0\u4e48"},"\u6210\u4e3a\u5f00\u53d1\u8005\u6211\u5f97\u5230\u4ec0\u4e48"),(0,l.kt)("p",null,"\u624b\u91cc\u6ca1\u6709\u51e0\u767e\u4e07\uff0c\u4f5c\u4e3a\u5f00\u53d1\u8005\uff0c\u60a8\u5982\u4f55\u62e5\u6709\u4e00\u4e2a\u8f6f\u4ef6\u4ea7\u54c1\u5462\uff1f\u53c2\u4e0e\u5f00\u6e90\u9879\u76ee\u534f\u4f5c\u3002\u53c2\u4e0e\u8fed\u4ee3\u6625\u677e\u5ba2\u670d\uff0c\u6210\u4e3a",(0,l.kt)("a",{parentName:"p",href:"https://www.cskefu.com/core-developers/"},"\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005"),"\uff0c\u5c31\u662f\u548c\u4f17\u591a\u6709\u624d\u534e\u7684\u4eba\u4e00\u9053\uff0c\u505a\u597d\u5f00\u6e90\u5ba2\u670d\u7cfb\u7edf\uff0c\u8ba9\u60a8\u7684\u6f5c\u80fd\u81ea\u7531\u7684\u53d1\u6325\uff0c\u5728\u6625\u677e\u5ba2\u670d\u793e\u533a\uff0c\u60a8\u53ef\u4ee5\u83b7\u5f97\u6210\u5c31\u3001\u670b\u53cb\u7b49\u5f88\u591a\u8d22\u5bcc\u3002"),(0,l.kt)("p",null,"\u4f5c\u4e3a\u4e00\u4e2a\u5f00\u53d1\u8005\uff0c\u52a0\u5165\u6625\u677e\u5ba2\u670d\u5f00\u6e90\u793e\u533a\u5c31\u662f\u548c\u5f88\u591a\u70ed\u7231\u8f6f\u4ef6\u7814\u53d1\u7684\u4eba\u4e00\u8d77\u505a\u6709\u7ecf\u6d4e\u4ef7\u503c\u7684\u4f5c\u54c1\uff0c\u6625\u677e\u5ba2\u670d\u662f\u5f00\u653e\u578b\u7ec4\u7ec7\uff0c\u6625\u677e\u5ba2\u670d\u6280\u672f\u59d4\u5458\u4f1a\u4e3b\u5bfc\u793e\u533a\u53d1\u5c55\uff0c\u5e76\u4ee5",(0,l.kt)("a",{parentName:"p",href:"https://www.cskefu.com/profit-sharing-plans/"},"\u5206\u6da6\u7684\u5f62\u5f0f"),"\u5408\u4f5c\u5171\u8d62\uff01\u901a\u8fc7\u793e\u533a\u9ad8\u6548\u7387\u7684\u534f\u4f5c\u4f53\u7cfb\uff0c\u8ba9\u60a8\u5728\u5de5\u4f5c\u4e4b\u4f59\uff0c\u5229\u7528\u7a7a\u95f2\u65f6\u95f4\u4ea7\u751f\u66f4\u5927\u7684\u4ef7\u503c - \u63d0\u4ea4 PR \u5230\u6625\u677e\u5ba2\u670d\uff0c\u5728\u5f00\u6e90\u793e\u533a\u626e\u6f14\u5173\u952e\u89d2\u8272\uff01"),(0,l.kt)("p",null,"\u672c\u6587\u64b0\u5199\u7684\u4e3b\u8981\u76ee\u7684\uff0c\u5c31\u662f\u5e2e\u52a9\u60a8\u5feb\u901f\u7684\u638c\u63e1\u5982\u4f55\u63d0\u4ea4 PR",(0,l.kt)("sup",{parentName:"p",id:"fnref-what-is-pr"},(0,l.kt)("a",{parentName:"sup",href:"#fn-what-is-pr",className:"footnote-ref"},"what-is-pr"))," \u5230\u6625\u677e\u5ba2\u670d\u3002"),(0,l.kt)("h2",{id:"\u89c6\u9891\u6559\u7a0b"},"\u89c6\u9891\u6559\u7a0b"),(0,l.kt)("p",null,"\u4ee5\u4e0b\u5185\u5bb9\u5df2\u7ecf\u53d1\u5e03\u89c6\u9891\uff0c\u89c2\u770b\u5730\u5740\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://www.bilibili.com/video/BV1D8411q73M"},"Bilibili")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://www.youtube.com/watch?v=lYCdIgxXUSE"},"YouTube"))),(0,l.kt)("p",null,"\u89c6\u9891\u548c\u4ee5\u4e0b\u6587\u6863\u7ed3\u5408\uff0c\u53ef\u4ee5\u66f4\u5feb\u7684\u638c\u63e1\u63d0\u4ea4\u4ee3\u7801\u7684\u8fc7\u7a0b\uff0c\u5efa\u8bae\u5148\u770b\u89c6\u9891\u540e\u770b\u6587\u6863\u3002"),(0,l.kt)("h2",{id:"\u524d\u63d0\u51c6\u5907"},"\u524d\u63d0\u51c6\u5907"),(0,l.kt)("p",null,"\u6309\u7167\u4ee5\u4e0b\u987a\u5e8f\u5b89\u88c5\u4f9d\u8d56\u5de5\u5177\uff0c\u8fd9\u4e9b\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\uff0cGit Flow \u7684\u5b89\u88c5\u7a0d\u663e\u9ebb\u70e6\uff0c\u4f46\u662f Git Flow \u662f\u5fc5\u8981\u7684\uff0c\u5f53\u60a8\u9047\u5230\u95ee\u9898\uff0c\u53ef\u4ee5\u521b\u5efa ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/cskefu/cskefu/issues/new?labels=help-wanted&projects=&template=1_help.md"},"Issue \u6765\u53d6\u5f97\u5e2e\u52a9"),"\u3002"),(0,l.kt)("h3",{id:"bash-\u547d\u4ee4\u884c\u7ec8\u7aef"},"Bash \u547d\u4ee4\u884c\u7ec8\u7aef"),(0,l.kt)("p",null,"\u547d\u4ee4\u884c\u7ec8\u7aef\u63a8\u8350\u5b89\u88c5\u5982\u4e0b\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Windows: ",(0,l.kt)("a",{parentName:"li",href:"https://gitforwindows.org/"},"Git Bash")),(0,l.kt)("li",{parentName:"ul"},"Mac: ",(0,l.kt)("a",{parentName:"li",href:"https://iterm2.com/"},"iTerm2")),(0,l.kt)("li",{parentName:"ul"},"Linux: \u4e0d\u540c Linux \u53d1\u5e03\u7684\u9ed8\u8ba4\u7684\u63a7\u5236\u53f0\u5de5\u5177\u5373\u53ef")),(0,l.kt)("p",null,"\u4e0d\u540c\u64cd\u4f5c\u7cfb\u7edf\u7684 Bash \u7ec8\u7aef\u5176\u547d\u4ee4\u884c\u5de5\u5177\u90fd\u662f\u7c7b\u4f3c\u7684\uff0c\u4e0b\u6587\u4f7f\u7528\u7684\u547d\u4ee4\u4e5f\u662f\u901a\u7528\u7684\uff0c\u4e0b\u6587\u4ee5 Windows Git Bash \u4e3a\u4f8b\u3002"),(0,l.kt)("h3",{id:"git"},"Git"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Windows: ",(0,l.kt)("a",{parentName:"li",href:"https://gitforwindows.org/"},"Git Bash")),(0,l.kt)("li",{parentName:"ul"},"Mac \u548c Linux: ",(0,l.kt)("a",{parentName:"li",href:"https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git"},"\u5b89\u88c5 Git"))),(0,l.kt)("p",null,"\u5b8c\u6210\u4ee5\u4e0a\u5de5\u4f5c\uff0c\u60a8\u5c31\u53ef\u4ee5\u6253\u5f00\u547d\u4ee4\u884c\u7ec8\u7aef\uff0c\u5e76\u6267\u884c\u547d\u4ee4\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(52750).Z,width:"1308",height:"407"})),(0,l.kt)("h3",{id:"git-flow"},"Git Flow"),(0,l.kt)("p",null,"Git Flow \u662f\u4f7f\u7528 Git \u505a\u7814\u53d1\u8f6f\u4ef6\u534f\u4f5c\u7684\u8865\u5145\u5de5\u5177\u96c6\uff0c\u63d0\u4f9b\u5728 Git \u547d\u4ee4\u57fa\u7840\u4e0a\u7684",(0,l.kt)("a",{parentName:"p",href:"https://blog.csdn.net/Xue_zenghui/article/details/95212544"},"\u6700\u4f73\u5b9e\u8df5"),"\u3002\u4e0b\u6587\u5c06\u4f7f\u7528 Git Flow \u7b80\u5355\u9ad8\u6548\u7684\u5b8c\u6210 PR \u63d0\u4ea4\u7684\u6d41\u7a0b\u3002"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Windows: ",(0,l.kt)("a",{parentName:"li",href:"https://www.jianshu.com/p/8a804d8bf08b"},"\u5b89\u88c5 Git Flow")),(0,l.kt)("li",{parentName:"ul"},"macOS: ",(0,l.kt)("a",{parentName:"li",href:"https://juejin.cn/post/7057102433704476708"},"\u5b89\u88c5 Git Flow")),(0,l.kt)("li",{parentName:"ul"},"Linux: ",(0,l.kt)("a",{parentName:"li",href:"https://blog.csdn.net/u012336923/article/details/50425879"},"\u5b89\u88c5 Git Flow"))),(0,l.kt)("p",null,"\u5b89\u88c5\u597d Git Flow \u540e\uff0c\u901a\u8fc7\u547d\u4ee4\u884c ",(0,l.kt)("inlineCode",{parentName:"p"},"git flow")," \u6765\u4f7f\u7528\uff0c\u4e0d\u5f71\u54cd\u5176\u5b83\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"git")," \u547d\u4ee4\u3002"),(0,l.kt)("h3",{id:"ssh-keys"},"SSH Keys"),(0,l.kt)("p",null,"\u751f\u6210 SSH \u5bc6\u94a5\u6587\u4ef6\uff0c\u7528\u4e8e\u52a0\u5bc6\u8ba4\u8bc1\uff0c\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"git")," \u4e0b\u8f7d\u4e0a\u4f20\u4ee3\u7801\u3002\u5982\u679c\u60a8\u5df2\u7ecf\u6709\u4e86 SSH Keys \u672c\u6b65\u9aa4\u53ef\u4ee5\u8df3\u8fc7\uff0c\u5373:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"$HOME/.ssh/id_rsa $HOME/.ssh/id_rsa.pub\n")),(0,l.kt)("p",null,"\u5176\u4e2d\uff0c",(0,l.kt)("inlineCode",{parentName:"p"},"$HOME/.ssh/id_rsa ")," \u662f\u79c1\u94a5\u6587\u4ef6\uff0c\u60a8\u81ea\u5df1\u4fdd\u7559\uff0c\u4e0d\u8981\u516c\u5f00\u5171\u4eab\uff1b",(0,l.kt)("inlineCode",{parentName:"p"},"$HOME/.ssh/id_rsa.pub")," \u662f\u516c\u94a5\uff0c\u53ef\u4ee5\u516c\u5f00\u5171\u4eab\u3002"),(0,l.kt)("p",null,"\u751f\u6210 SSH Keys \u6267\u884c\u547d\u4ee4\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"ssh-keygen -t rsa # \u5f39\u51fa\u9009\u9879\u90fd\u6309 Enter\n")),(0,l.kt)("p",null,"\u786e\u8ba4\uff0c\u7cfb\u7edf\u8def\u5f84\u5b58\u5728 ",(0,l.kt)("inlineCode",{parentName:"p"},"$HOME/.ssh/id_rsa.pub"),"\uff0c\u6267\u884c\u547d\u4ee4\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"cat $HOME/.ssh/id_rsa.pub\n")),(0,l.kt)("h3",{id:"github"},"GitHub"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u6ce8\u518c GitHub \u8d26\u53f7\uff1a",(0,l.kt)("a",{parentName:"li",href:"https://github.com/"},"https://github.com/")),(0,l.kt)("li",{parentName:"ul"},"\u6dfb\u52a0 SSH Keys: \u6ce8\u518c\u5b8c\u6210\u540e\uff0c\u6253\u5f00 URL ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/settings/keys"},"https://github.com/settings/keys"),"\uff0c\u70b9\u51fb ",(0,l.kt)("inlineCode",{parentName:"li"},"New SSH Key"))),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(21039).Z,width:"965",height:"428"})),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u6dfb\u52a0 Title \u548c Key\uff0c\u5373 SSH \u516c\u94a5\u3002")),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(57775).Z,width:"1327",height:"708"})),(0,l.kt)("h2",{id:"\u5feb\u901f\u638c\u63e1"},"\u5feb\u901f\u638c\u63e1"),(0,l.kt)("h3",{id:"\u6d41\u7a0b\u6982\u8ff0"},"\u6d41\u7a0b\u6982\u8ff0"),(0,l.kt)("p",null,"\u6574\u4e2a\u63d0\u4ea4 PR \u7684\u8fc7\u7a0b\u53ef\u4ee5\u7528\u4ee5\u4e0b\u65f6\u5e8f\u56fe\u8bf4\u660e\uff0c\u6211\u4eec\u5c06\u8fd9\u4e2a\u8fc7\u7a0b\u7ec6\u5316\u4e3a\u5341\u4e94\u6b65\uff0c\u5b9e\u9645\u4e0a\u5f88\u7b80\u5355\uff0c\u53ea\u9700\u8981\u6309\u7167\u63cf\u8ff0\u5b8c\u6210\u4e00\u6b21\uff0c\u5c31\u53ef\u4ee5\u638c\u63e1\uff0c\u800c\u4e14\u9664\u4e86\u7b2c\u4e00\u4e2a PR\uff0c\u540e\u9762\u7684 PR \u53ea\u9700\u8981\u91cd\u590d\u7b2c 3-15 \u6b65\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"\u63d0\u4ea4 PR \u6d41\u7a0b\u6982\u8ff0",src:A(61612).Z,width:"1700",height:"1743"})),(0,l.kt)("p",null,"\u4e0a\u56fe\u4e2d\uff0c\u6709\u4e09\u4e2a\u4ed3\u5e93\u5730\u5740\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("strong",{parentName:"li"},"GitHub Upstream"),", \u5373\u4ed3\u5e93 ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/cskefu/cskefu"},"https://github.com/cskefu/cskefu")," \uff0c\u7b80\u79f0 Upstream Repo"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("strong",{parentName:"li"},"GitHub Origin"),", \u5373 ",(0,l.kt)("inlineCode",{parentName:"li"},"https://github.com/${\u4e2a\u4eba forked repo}$/cskefu"),"\uff0c\u7b80\u79f0 Origin Repo"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("strong",{parentName:"li"},"Localhost Repo"),"\uff0c\u5373\u60a8\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"li"},"git clone git@github.com:${\u4e2a\u4eba forked repo}/cskefu.git"),", \u7b80\u79f0 Local Repo")),(0,l.kt)("p",null,"\u4ee5\u4e0a\u4e09\u4e2a\u4ed3\u5e93\u5728\u4e0b\u9762\u6709\u8be6\u7ec6\u4ecb\u7ecd\uff0c\u4e3b\u8981\u539f\u5219\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u5de5\u4f5c\u524d\u5148\u6709 Issue \u53f7\uff0c\u6bd4\u5982 ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/cskefu/cskefu/issues/897"},"https://github.com/cskefu/cskefu/issues/897")," \u7684 Issue \u53f7\u5c31\u662f ",(0,l.kt)("inlineCode",{parentName:"li"},"879"),"\uff0c\u4ee5\u4e0b\u4e5f\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"li"},"#879")," \u6307\u4ee3 Issue 879;"),(0,l.kt)("li",{parentName:"ul"},"\u4ee3\u7801\u6700\u7ec8\u8fdb\u5165 Upstream/develop \u5206\u652f\u5373\u5c5e\u4e8e\u8fdb\u5165\u6625\u677e\u5ba2\u670d\uff0c\u4e0d\u8981\u76f4\u63a5\u66f4\u6539Local/develop \u548c Origin/develop \u5206\u652f\uff0c\u8fd9\u4e24\u4e2a Repo \u7684 develop \u5206\u652f\u7684\u66f4\u65b0\u662f\u901a\u8fc7 ",(0,l.kt)("inlineCode",{parentName:"li"},"git pull upstream develop")," \u6765\u5b8c\u6210\u7684\u3002"),(0,l.kt)("li",{parentName:"ul"},"\u4ee3\u7801\u662f\u7531",(0,l.kt)("a",{parentName:"li",href:"https://github.com/cskefu/cskefu/issues/758"},"\u6625\u677e\u5ba2\u670d\u7684 CodeOwners")," \u5408\u5e76\u8fdb\u5165 Upstream/develop \u5206\u652f\u7684\u3002")),(0,l.kt)("h3",{id:"115-fork-code-repo"},"1/15 Fork code repo"),(0,l.kt)("p",null,"\u9996\u5148\uff0c\u6253\u5f00 Upstream \u7f51\u5740 ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/cskefu/cskefu"},"https://github.com/cskefu/cskefu"),"\uff0c\u70b9\u51fb\u53f3\u4fa7\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"Fork"),"\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(38511).Z,width:"1486",height:"582"})),(0,l.kt)("p",null,"\u9009\u62e9\u514b\u9686\u5230\u7a7a\u95f4\uff0c\u53d6\u6d88",(0,l.kt)("inlineCode",{parentName:"p"},"Copy the develop branch only")," \u9009\u62e9\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(78518).Z,width:"1746",height:"952"})),(0,l.kt)("p",null,"\u70b9\u51fb ",(0,l.kt)("inlineCode",{parentName:"p"},"Create fork"),"\uff0c\u8fd9\u65f6\u6d4f\u89c8\u5668\u4f1a\u8df3\u8f6c\u5230 Origin Repo, \u5373\u60a8\u521a\u521a\u9009\u62e9\u7684\u7a7a\u95f4\u4e0b\u7684 Repo \u5730\u5740\u3002"),(0,l.kt)("h3",{id:"215-clone-code-repo"},"2/15 Clone code repo"),(0,l.kt)("p",null,"\u4f7f\u7528 Bash \u547d\u4ee4\u884c\u7ec8\u7aef\uff0c\u521b\u5efa Local repo\uff0c\u9996\u5148\u5728\u6d4f\u89c8\u5668\u4e2d\uff0c\u83b7\u5f97 Origin Repo \u7684\u5730\u5740"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(33084).Z,width:"2230",height:"1153"})),(0,l.kt)("p",null,"\u6267\u884c\u547d\u4ee4\u5982\u4e0b\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"mkdir ~/cskefu\ncd ~/cskefu\ngit clone git@github.com:${\u4e2a\u4eba forked repo}/cskefu.git # \u4ece\u6d4f\u89c8\u5668\u4e2d\u590d\u5236\u7684\u5730\u5740\n")),(0,l.kt)("p",null,"\u7136\u540e\uff0c\u8fdb\u5165\u6625\u677e\u5ba2\u670d Local Repo\uff0c\u8bbe\u7f6e Sign-off\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},'cd ~/cskefu/cskefu # \u4ee5\u4e0b\u79f0\u6b64\u8def\u5f84\u4e3a CSKEFU_ROOT\ngit config alias.ci "commit -s"\ngit config user.name "\u60a8\u7684\u540d\u5b57"\ngit config user.email "\u60a8\u7684\u90ae\u7bb1"\n')),(0,l.kt)("p",null,"\u8be5\u547d\u4ee4\u7684\u4f5c\u7528\u662f\uff0c\u5728 ",(0,l.kt)("inlineCode",{parentName:"p"},"CSKEFU_ROOT")," \u4e0b\u6267\u884c ",(0,l.kt)("inlineCode",{parentName:"p"},'git ci -m "xxx"')," \u4ee5\u5b8c\u6210\u7b7e\u7f72 DCO",(0,l.kt)("sup",{parentName:"p",id:"fnref-what-is-dco"},(0,l.kt)("a",{parentName:"sup",href:"#fn-what-is-dco",className:"footnote-ref"},"what-is-dco")),"\u3002"),(0,l.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u914d\u7f6e upstream\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"cd ~/cskefu/cskefu\ngit remote add upstream https://github.com/cskefu/cskefu.git\n")),(0,l.kt)("p",null,"\u6700\u540e\uff0c\u521d\u59cb\u5316 ",(0,l.kt)("inlineCode",{parentName:"p"},"Git Flow"),"\uff0c\u6267\u884c"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"cd ~/cskefu/cskefu\ngit flow init\n")),(0,l.kt)("p",null,"\u8be5\u547d\u4ee4\u4f1a\u542f\u52a8\u4e00\u4e2a\u4ea4\u4e92\u95ee\u7b54\uff0c\u6309\u7167\u5982\u4e0b\u8bbe\u7f6e\uff0c\u4f7f\u7528 Enter \u8fdb\u5165\u4e0b\u4e00\u4e2a\u76f4\u81f3\u5b8c\u6210\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(52252).Z,width:"1691",height:"813"})),(0,l.kt)("p",null,"\u4fee\u6539\uff0c\u5982\u679c\u8bbe\u7f6e\u9519\u8bef\uff0c\u53ef\u4ee5\u5728\u8fd0\u884c\u4e86\u4e0a\u8ff0\u547d\u4ee4\u540e\uff0c\u7f16\u8f91 ",(0,l.kt)("inlineCode",{parentName:"p"},".git/config")," \u6587\u4ef6\u3002\u4e0a\u9762\u7684\u4e3b\u8981\u6b65\u9aa4\uff0c\u56f4\u7ed5 ",(0,l.kt)("inlineCode",{parentName:"p"},"CSKEFU_ROOT/.git/config")," \u6587\u4ef6\uff0c\u6267\u884c\u540e\u770b\u8d77\u6765\u5982\u4e0b\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},'[core]\n repositoryformatversion = 0\n filemode = false\n bare = false\n logallrefupdates = true\n ignorecase = true\n[remote "origin"]\n url = git@github.com:${\u4e2a\u4eba forked repo}/cskefu.git\n fetch = +refs/heads/*:refs/remotes/origin/*\n[branch "develop"]\n remote = origin\n merge = refs/heads/develop\n[remote "upstream"]\n url = https://github.com/cskefu/cskefu.git\n fetch = +refs/heads/*:refs/remotes/upstream/*\n[branch "master"]\n remote = origin\n merge = refs/heads/master\n[gitflow "branch"]\n master = master\n develop = develop\n[gitflow "prefix"]\n feature = feature/\n bugfix = bugfix/\n release = release/\n hotfix = hotfix/\n support = support/\n versiontag =\n[gitflow "path"]\n hooks = C:/Users/Administrator/git/cskefu/.git/hooks\n[alias]\n ci = commit -s\n[user]\n name = Zhang San\n email = zhangsan@xyz.com\n')),(0,l.kt)("h3",{id:"315-new-local-branch"},"3/15 New local branch"),(0,l.kt)("p",null,"\u5bf9\u4e8e\u63d0\u4ea4\u7684\u4ee3\u7801\uff0c\u662f\u4ee5 ",(0,l.kt)("inlineCode",{parentName:"p"},"Git Commits")," \u4e3a\u5355\u4f4d\u7684\uff0c\u6bcf\u4e2a ",(0,l.kt)("inlineCode",{parentName:"p"},"Git Commit")," \u9700\u8981\u5173\u8054\u4e00\u4e2a GitHub Isssue \u53f7\uff0c\u6240\u4ee5\uff0c\u5148\u627e\u5230\u5de5\u4f5c\u7684 Issues\uff1a"),(0,l.kt)("p",null,(0,l.kt)("a",{parentName:"p",href:"https://github.com/cskefu/cskefu/issues"},"https://github.com/cskefu/cskefu/issues")),(0,l.kt)("p",null,"\u5047\u8bbe\uff0c\u6211\u4eec\u6709\u4e86\u4e00\u4e2a GitHub Issue ",(0,l.kt)("inlineCode",{parentName:"p"},"#NUMBER"),"\uff0c\u6bd4\u5982 ",(0,l.kt)("inlineCode",{parentName:"p"},"#879"),"\uff0c\u8fd9\u4e2a Issue \u662f\u4e00\u4e2a\u65b0\u529f\u80fd\uff0c\u90a3\u4e48\uff0c\u6211\u4eec\u8fd9\u6837\u5f00\u59cb\u5de5\u4f5c\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"# \u5efa\u7acb\u65b0\u7684\u5206\u652f\ncd ~/cskefu/cskefu\ngit flow feature start 879 # \u6267\u884c\uff0c\u7136\u540e\u5f97\u5230\u4e0b\u9762\u7684\u63d0\u793a\u4fe1\u606f\nSwitched to a new branch 'feature/879'\n\nSummary of actions:\n- A new branch 'feature/879' was created, based on 'develop'\n- You are now on branch 'feature/879'\n\nNow, start committing on your feature. When done, use:\n\n git flow feature finish 879\n")),(0,l.kt)("p",null,"\u5982\u4e0a\u4ecb\u7ecd\uff0c\u73b0\u5728 Git \u81ea\u52a8\u5207\u6362\u4e86\u65b0\u7684\u5206\u652f\uff0c\u6211\u4eec\u5c31\u5728\u8fd9\u4e2a\u5206\u652f\u4e0b\u8c03\u6574\u4ee3\u7801\u3002\n\u663e\u793a\u4e86\u5de5\u4f5c\u4e2d\u7684\u5206\u652f\uff0c\u60a8\u53ef\u4ee5\u7528\u547d\u4ee4 ",(0,l.kt)("inlineCode",{parentName:"p"},"git branch")," \u67e5\u770b\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(47533).Z,width:"1160",height:"696"})),(0,l.kt)("h3",{id:"415-commit-sign-off-codes"},"4/15 Commit sign-off codes"),(0,l.kt)("p",null,"\u5047\u8bbe\uff0c\u6211\u4eec\u5df2\u7ecf\u8c03\u6574\u5b8c\u6210\u4e86\u4ee3\u7801\uff0c\u901a\u8fc7 ",(0,l.kt)("inlineCode",{parentName:"p"},"git status")," \u67e5\u770b\u53d8\u66f4\u7684\u72b6\u6001\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(17443).Z,width:"2061",height:"344"})),(0,l.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86\uff0c\u6267\u884c\u4ee5\u4e0b\u7684\u547d\u4ee4\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},'cd ~/cskefu/cskefu\ngit add --all\ngit ci -m "#879 \u8c03\u6574\u4e86 XXX" # \u7b80\u8981\u63cf\u8ff0\n')),(0,l.kt)("p",null,"\u6ce8\u610f\uff0c\u6b64\u5904\u4f7f\u7528\u4e86 ",(0,l.kt)("inlineCode",{parentName:"p"},"git ci"),"\uff0c\u5373\u662f\u524d\u6587\u4ecb\u7ecd\u7684 DCO \u7b7e\u540d\uff0c\u6ca1\u6709\u7b7e\u540d\u7684 commit \u7684 PR \u662f\u4e0d\u88ab\u63a5\u53d7\u7684\u3002"),(0,l.kt)("h3",{id:"515-git-flow-publish"},"5/15 Git flow publish"),(0,l.kt)("p",null,"\u4e0b\u4e00\u6b65\uff0c\u5c06 Local Repo \u7684 Commit \u53d1\u5e03\u5230 Origin Repo \u4e2d\uff0c\u4f7f\u7528\u5982\u4e0b\u547d\u4ee4\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"cd ~/cskefu/cskefu\ngit flow feature publish\n")),(0,l.kt)("p",null,"\u5728\u6267\u884c\u4e86\u4e0a\u8ff0\u547d\u4ee4\u540e\uff0c\u5f97\u5230\u63d0\u793a\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(72384).Z,width:"2281",height:"1168"})),(0,l.kt)("p",null,"\u900f\u9732\u7684\u4fe1\u606f\u662f\uff1a1\uff09Origin repo \u7684 'feature/879' \u5206\u652f\u88ab\u65b0\u5efa\u6216\u66f4\u65b0\u4e86\uff0c2\uff09Local repo \u7684 'feature/879' \u5206\u652f\u7528\u6765\u8ddf\u8e2a Origin/feature/879 \u7684\u53d8\u5316\u3002"),(0,l.kt)("h3",{id:"615-open-new-pr"},"6/15 Open new PR"),(0,l.kt)("p",null,"\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u4e0a\u4e00\u6b65\u7684\u63d0\u793a\u6d88\u606f\u4e2d\uff0c\u6709\u4e00\u4e2a URL \u5730\u5740\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"https://github.com/${\u4e2a\u4eba forked repo}/cskefu/pull/new/feature/879\n")),(0,l.kt)("p",null,"\u590d\u5236\u8fd9\u4e2a\u5730\u5740\uff0c\u5e76\u5728\u6d4f\u89c8\u5668\u4e2d\u6253\u5f00\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(44586).Z,width:"2665",height:"1708"})),(0,l.kt)("p",null,"\u8fd9\u4e2a\u5c31\u662f\u521b\u5efa PR \u7684\u754c\u9762\uff0c\u901a\u8fc7\u8c03\u6574\u6807\u9898\uff0c\u6b63\u6587\uff0c\u66f4\u597d\u7684\u63cf\u8ff0\u672c\u6b21\u53d8\u66f4\u7684\u539f\u56e0\u3002\u7136\u540e\u70b9\u51fb\u53f3\u4e0b\u89d2\u7684 \u3010Create pull request\u3011\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(88940).Z,width:"674",height:"244"})),(0,l.kt)("h3",{id:"715-set-pr-settings"},"7/15 Set PR settings"),(0,l.kt)("p",null,"\u63d0\u4ea4\u540e\uff0c\u6d4f\u89c8\u5668\u81ea\u52a8\u8df3\u8f6c\u5230\u65b0\u5efa\u7acb\u7684 PR \u9875\u9762\uff0c\u6bd4\u5982 ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/cskefu/cskefu/pull/900"},"https://github.com/cskefu/cskefu/pull/900"),"\u3002"),(0,l.kt)("p",null,"\u5728\u8fd9\u4e2a\u9875\u9762\uff0c\u53ef\u4ee5\u5f97\u5230\u548c\u6dfb\u52a0\u66f4\u591a\u7684\u4fe1\u606f\uff0c\u6bd4\u5982\u67e5\u770b\u5ba1\u6838\u8005(Reviewers)\uff0c\u53ea\u6709\u8fbe\u5230\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Code \u5ba1\u6838\u901a\u8fc7\u7684\u4eba\u6570\u8d85\u8fc7\u8bbe\u5b9a\uff08\u76ee\u524d\u4e3a 1 \u4eba\uff09\uff0c\u76ee\u524d\uff0c\u5ba1\u6838\u8005\u662f\u81ea\u52a8\u8bbe\u7f6e\u7684\uff0c\u8be6\u7ec6\u7684\u89c4\u5219\u67e5\u770b\uff1a",(0,l.kt)("a",{parentName:"li",href:"https://github.com/cskefu/cskefu/issues/758"},"\u6625\u677e\u5ba2\u670d\u7684 CodeOwners")),(0,l.kt)("li",{parentName:"ul"},"Code Review \u6ca1\u6709\u8ba8\u8bba\u4e2d\u7684\u4f1a\u8bdd"),(0,l.kt)("li",{parentName:"ul"},"PR \u7684\u81ea\u52a8\u68c0\u67e5\u901a\u8fc7")),(0,l.kt)("p",null,"PR \u624d\u53ef\u4ee5\u7531 CodeOwners \u8fdb\u884c\u5408\u5e76\uff0c\u5206\u522b\u5bf9\u5e94 PR \u9875\u9762\u4e2d\u7684\u4e0b\u56fe\u90e8\u5206\u7684\u72b6\u6001\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(11461).Z,width:"1854",height:"696"})),(0,l.kt)("h3",{id:"815-checks-on-pr"},"8/15 Checks on PR"),(0,l.kt)("p",null,"\u5728 PR \u9875\u9762\uff0c\u60a8\u4f1a\u770b\u5230\u7c7b\u4f3c\u7684\u4fe1\u606f\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(12150).Z,width:"2079",height:"1017"})),(0,l.kt)("p",null,"\u4ee3\u8868\u5f53\u524d\u7684 PR \u81ea\u52a8\u68c0\u67e5\u901a\u8fc7\uff0c\u4f46\u662f\u4e5f\u53ef\u80fd\u53d1\u751f\u4e0d\u901a\u8fc7\u7684\u60c5\u51b5\uff0c\u6b64\u65f6\u8fdb\u5165\u7b2c 10/15 \u6b65\u89e3\u51b3\u3002"),(0,l.kt)("h3",{id:"915-code-reviews"},"9/15 Code reviews"),(0,l.kt)("p",null,"\u5728 PR \u9875\u9762\uff0c\u60a8\u4f1a\u770b\u5230\u7c7b\u4f3c\u7684\u4fe1\u606f\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(98069).Z,width:"2006",height:"1197"})),(0,l.kt)("p",null,"\u4ee3\u8868\u5f53\u524d\u8fd8\u9700\u8981\u5b8c\u6210 Code Review \u5de5\u4f5c\uff0c\u8be5 PR \u624d\u80fd\u88ab\u5408\u5e76\u3002"),(0,l.kt)("p",null,"\u6b64\u65f6\uff0cCode Reviewer \u4f1a\u6536\u5230\u901a\u77e5\uff0cCode Reviewer \u4f1a\u5728 PR \u7684\u4e0b\u9762\u9875\u9762\u7ed9\u4e0e\u53cd\u9988\uff1a1\uff09Comment/Request Changes - \u4ee3\u7801\u8fd8\u9700\u8981\u505a\u4e00\u4e9b\u8c03\u6574\uff0c\u8fdb\u5165 10/15 \u6b65\uff1b2) Approve - \u901a\u8fc7\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(56508).Z,width:"3020",height:"1520"})),(0,l.kt)("p",null,"\u901a\u8fc7 Checks \u548c Review\uff0c\u4ee3\u7801\u4f1a\u81ea\u52a8\u8fdb\u5165 ",(0,l.kt)("inlineCode",{parentName:"p"},"upstream/develop")," \u5206\u652f\u3002 "),(0,l.kt)("h3",{id:"1015-modify-codes"},"10/15 Modify codes"),(0,l.kt)("p",null,"\u7531\u4e8e PR Checks \u6216 Review \u6ca1\u6709\u901a\u8fc7\uff0c\u90a3\u4e48\u6839\u636e\u53cd\u9988\u9700\u8981\u66f4\u6539\u4ee3\u7801\uff0c\u8fdb\u884c\u5982\u4e0b\u64cd\u4f5c\u3002"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"cd ~/cskefu/cskefu")),(0,l.kt)("li",{parentName:"ul"},"\u786e\u8ba4 Local repo \u6240\u5728\u5206\u652f\u4e3a ",(0,l.kt)("inlineCode",{parentName:"li"},"feature/879"),"\uff1b\u5982\u679c\u5f53\u524d\u4e0d\u5728\u8fd9\u4e2a\u5206\u652f\uff0c\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"li"},"git checkout feature/879")," \u5207\u6362\u56de\u8fd9\u4e2a\u5206\u652f"),(0,l.kt)("li",{parentName:"ul"},"\u8c03\u6574\u4ee3\u7801\uff0c\u76f4\u5230\u53ef\u4ee5\u518d\u6b21\u63d0\u4ea4")),(0,l.kt)("h3",{id:"1115-re-push-codes"},"11/15 Re-push codes"),(0,l.kt)("p",null,"\u6267\u884c\u547d\u4ee4\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},'cd ~/cskefu/cskefu\ngit add --all\ngit ci -m "#879 \u518d\u6b21\u8c03\u6574 XXX"\ngit push origin feature/879\n')),(0,l.kt)("h3",{id:"1215-checks-on-pr"},"12/15 Checks on PR"),(0,l.kt)("p",null,"\u56de\u5230\u524d\u6b21\u521b\u5efa\u7684 PR \u9875\u9762\uff0c\u5728 Commits \u9875\u9762\uff0c\u6211\u4eec\u770b\u5230\uff0c\u5df2\u7ecf\u6709\u4e86\u7b2c\u4e8c\u6b21\u7684\u63d0\u4ea4\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(21198).Z,width:"2749",height:"1148"})),(0,l.kt)("p",null,"\u6b64\u65f6\uff0c\u518d\u6b21\u6267\u884c\u4e86 Checks\u3002"),(0,l.kt)("h3",{id:"1315-code-reviews-again"},"13/15 Code reviews again"),(0,l.kt)("p",null,"\u8fd9\u65f6\u5019\uff0cCode Reviewer \u518d\u6b21\u6536\u5230\u63d0\u793a\uff0c\u8fdb\u884c\u4ee3\u7801 Reviews\u3002\u60a8\u4e5f\u53ef\u4ee5\u5728 PR \u4e0a\u4e0e Reviewers \u4ea4\u4e92\uff0c\u5982\u4e0b\u56fe\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(90659).Z,width:"1939",height:"574"})),(0,l.kt)("h3",{id:"1415-pr-merged"},"14/15 PR merged"),(0,l.kt)("p",null,"\u5047\u8bbe\uff0c\u8fd9\u6b21 Checks \u548c Reviews \u901a\u8fc7\uff0c\u6ee1\u8db3\u4e86\u5408\u5e76\u7684\u9700\u6c42\uff0c\u56e0\u4e3a\u524d\u6587\u6211\u4eec\u8bbe\u7f6e\u4e86\u3010Auto-merge\u3011\uff0c\u73b0\u5728\u4ee3\u7801\u5c31\u4f1a\u76f4\u63a5\u8fdb\u5165 ",(0,l.kt)("inlineCode",{parentName:"p"},"upstream/develop")," \u5206\u652f\u3002"),(0,l.kt)("p",null,"\u60a8\u4e5f\u53ef\u4ee5\u5728 develop \u5206\u652f\u786e\u8ba4\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:A(40183).Z,width:"2100",height:"913"})),(0,l.kt)("p",null,"\u70b9\u51fb ",(0,l.kt)("inlineCode",{parentName:"p"},"commits"),"\u3002"),(0,l.kt)("h3",{id:"1515-pull-to-local"},"15/15 Pull to local"),(0,l.kt)("p",null,"\u73b0\u5728\uff0c\u60a8\u7684 PR \u63d0\u4ea4\u5b8c\u6210\u4e86\uff0c\u4f46\u662f\u60a8\u7684 Origin \u548c Local Repo \u7684 develop \u5206\u652f\uff0c\u8fd8\u548c Upstream develop \u4e0d\u540c\u6b65\uff0c\u7ee7\u7eed\u6267\u884c\u4ee5\u4e0b\u64cd\u4f5c\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"cd ~/cskefu/cskefu\ngit checkout develop\ngit pull upstream develop\ngit push origin develop\n")),(0,l.kt)("p",null,"\u4f5c\u4e3a\u5019\u9009\uff0c\u60a8\u53ef\u4ee5\u5220\u9664\u672c\u5730\u7684 feature \u5206\u652f\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"git branch -d feature/879\n")),(0,l.kt)("p",null,"\u6625\u677e\u5ba2\u670d\u662f\u6700\u6d41\u884c\u7684\u5f00\u6e90\u5ba2\u670d\u7cfb\u7edf\uff0c\u73b0\u5728\u5df2\u7ecf\u5728\u4f01\u4e1a\u90e8\u7f72\u8d85\u8fc7 19,000 \u6b21\uff0c\u4e3a\u6570\u767e\u653f\u5e9c\u673a\u6784\u3001\u4e8b\u4e1a\u5355\u4f4d\u548c\u4f01\u4e1a\u4e0a\u7ebf\u667a\u80fd\u5ba2\u670d\u7cfb\u7edf\uff0c\u73b0\u5728\u60a8\u662f\u6625\u677e\u5ba2\u670d\u7684\u5f00\u53d1\u8005\u4e00\u5458\u4e86\uff01"),(0,l.kt)("p",null,"\u6625\u677e\u5ba2\u670d\u4f1a\u5c3d\u5feb\u7684\u5c06\u60a8\u6dfb\u52a0\u5230",(0,l.kt)("a",{parentName:"p",href:"https://github.com/cskefu/cskefu#%E8%B4%A1%E7%8C%AE%E8%80%85%E5%88%97%E8%A1%A8-"},"\u8d21\u732e\u8005\u5217\u8868"),"!"),(0,l.kt)("h2",{id:"\u5e38\u89c1\u95ee\u9898"},"\u5e38\u89c1\u95ee\u9898"),(0,l.kt)("h3",{id:"\u5982\u4f55\u786e\u5b9a\u5de5\u4f5c\u7684-issue"},"\u5982\u4f55\u786e\u5b9a\u5de5\u4f5c\u7684 Issue"),(0,l.kt)("p",null,"Issue \u5373\u5de5\u4f5c\u7684\u5185\u5bb9\uff0c\u8bb0\u5f55\u5728\u6625\u677e\u5ba2\u670d\u7684",(0,l.kt)("a",{parentName:"p",href:"https://github.com/cskefu/cskefu/issues"},"\u5de5\u5355(Issue)"),"\u4e2d\uff0c\u53ef\u4ee5\u521b\u5efa\u6839\u636e\u60a8\u81ea\u5df1\u7684\u9700\u8981\u521b\u5efa\u5de5\u5355\uff0c\u6216\u8005\u9009\u62e9\u4e00\u4e2a\u5df2\u6709\u7684\u5de5\u5355\u3002"),(0,l.kt)("h3",{id:"\u5982\u4f55\u642d\u5efa\u5f00\u53d1\u73af\u5883"},"\u5982\u4f55\u642d\u5efa\u5f00\u53d1\u73af\u5883"),(0,l.kt)("p",null,"\u5f00\u53d1\u73af\u5883\u642d\u5efa\uff0c\u5305\u62ec\u4e0b\u8f7d\u6e90\u7801\u3001\u5b89\u88c5 IDE\u3001\u542f\u52a8\u6570\u636e\u5e93\u548c\u914d\u7f6e\u9879\u76ee\u7b49\u3002"),(0,l.kt)("p",null,"\u8be6\u7ec6\u5185\u5bb9\uff0c\u53c2\u8003\u6587\u6863",(0,l.kt)("a",{parentName:"p",href:"https://docs.cskefu.com/docs/osc/engineering"},"\u5f00\u53d1\u73af\u5883\u642d\u5efa"),"\u3002"),(0,l.kt)("h3",{id:"\u5982\u4f55\u5feb\u901f\u5165\u95e8\u5b9a\u5236\u6625\u677e\u5ba2\u670d"},"\u5982\u4f55\u5feb\u901f\u5165\u95e8\u5b9a\u5236\u6625\u677e\u5ba2\u670d"),(0,l.kt)("p",null,"\u6625\u677e\u5ba2\u670d\u793e\u533a\u53d1\u5e03\u4e86",(0,l.kt)("a",{parentName:"p",href:"https://docs.cskefu.com/docs/osc/training"},"\u300a\u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802\u300b"),"\uff0c\u5feb\u901f\u7684\u5165\u95e8\u4ee5\u53ca\u719f\u6089\u5f00\u53d1\u6280\u80fd\u3002"),(0,l.kt)("p",null,"\u5728\u300a\u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802\u300b\u4e2d\uff0c\u6709\u5f88\u591a\u77e5\u8bc6\u5185\u5bb9\uff0c\u800c\u5355\u5143\u6d4b\u8bd5\u3001AOP \u53d8\u6210\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u7b49\u4e5f\u6d89\u53ca\uff0c\u5185\u5bb9\u4e30\u5bcc\u3002"),(0,l.kt)("h3",{id:"\u5982\u4f55\u5feb\u901f\u638c\u63e1-git"},"\u5982\u4f55\u5feb\u901f\u638c\u63e1 Git"),(0,l.kt)("p",null,"Git \u7528\u4e8e\u7248\u672c\u7ba1\u7406\uff0c\u4f7f\u7528 Git \u65f6\uff0c\u4e00\u4e2a\u6587\u4ef6\u6709\u4e09\u4e2a\u53ef\u80fd\u5b58\u5728\u7684\u5730\u65b9\uff1aindexed\uff08\u7d22\u5f15\u533a\uff09\uff0cstaged\uff08\u6682\u5b58\u533a\uff09 \u548c workarea\uff08\u5de5\u4f5c\u533a\uff09\u3002indexed \u6587\u4ef6\u5c31\u662f\u88ab\u7d22\u5f15\u4e86\uff08\u63d0\u4ea4\u4e86\uff09\uff1bstaged \u5c31\u662f\u88ab\u4e34\u65f6\u7684\u4fdd\u5b58\u4e86\uff08\u6682\u672a\u63d0\u4ea4\uff0c\u4fdd\u62a4\u4e00\u4e0b\uff09\uff1bworkarea\uff0c\u5728\u7f16\u8f91\u5668\u4e2d\u6253\u5f00\u7684\u8fd9\u4efd\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"Git \u4f7f\u7528\u6982\u8ff0",src:A(35245).Z,width:"314",height:"160"})),(0,l.kt)("p",null,"\u4e0a\u56fe\u4e2d master \u6240\u5728\u533a\u5c31\u662f indexed\u3002"),(0,l.kt)("p",null,"Git \u7684\u7248\u672c\u7ba1\u7406\uff0c\u5c31\u662f\u6307\u8fd9\u4e09\u4e2a\u5c42\u9762\u540c\u4e00\u4e2a\u6587\u4ef6\u7684\u5dee\u5f02\u3002"),(0,l.kt)("p",null,"Git add: \u4ece workarea \u6dfb\u52a0\u5230 staged"),(0,l.kt)("p",null,"Git commit: \u4ece staged \u5230 indexed"),(0,l.kt)("p",null,"\u5f53\u7136\u8fd8\u6709\u4e0d\u540c\u7684\u65b9\u5411\uff0c\u8fd9\u6784\u6210\u4e86 git checkout, git stash, git restore, git reset, git clean \u7b49\u547d\u4ee4\u3002"),(0,l.kt)("p",null,"\u5f53\u672c\u5730\u7684 Git \u5e93\u548c\u5b83\u7684\u8fdc\u7a0b\u7684 Git \u5e93\u540c\u6b65\u65f6\uff0c\u5c31\u6d89\u53ca\u4f7f\u7528 git push \u548c git pull\u3002"),(0,l.kt)("p",null,"\u4ee5\u4e0a\u662f\u5bf9 Git \u7684\u7b80\u8981\u4ecb\u7ecd\uff0c\u5feb\u901f\u5165\u95e8 Git\uff0c\u9996\u5148\u719f\u6089\u5b83\u7684\u8fdc\u79bb\uff0c\u6bd4\u5982\u4ee5\u4e0a\uff1b\u5176\u6b21\uff0c\u505a\u4e00\u4e9b\u7ec3\u4e60\uff0c\u6bd4\u5982\u4f7f\u7528 ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/grayghostvisuals/practice-git"},"practice-git"),"\u3002"),(0,l.kt)("h3",{id:"\u5982\u4f55\u6210\u4e3a\u4e00\u4e2a\u4f18\u79c0\u7684\u5f00\u53d1\u8005"},"\u5982\u4f55\u6210\u4e3a\u4e00\u4e2a\u4f18\u79c0\u7684\u5f00\u53d1\u8005"),(0,l.kt)("p",null,"\u8981\u4ece\u5de5\u4f5c\u4e2d\u83b7\u5f97\u66f4\u591a\u5feb\u4e50\uff0c\u540c\u65f6\u4e5f\u4e3a\u4e86\u4e0d\u65ad\u6da8\u85aa\uff0c\u5c31\u9700\u8981\u4e0d\u65ad\u7684\u524d\u8fdb\uff0c\u4f9d\u8d56\u4e8e\u5fc3\u6001\u3002"),(0,l.kt)("p",null,"\u8fd9\u662f\u4e00\u4e2a\u6bd4\u63d0\u5347\u6280\u80fd\u66f4\u9700\u8981\u65f6\u95f4\u548c\u91cd\u89c6\u7684\u90e8\u5206\uff0c\u4e00\u4e2a\u597d\u7684\u5f00\u53d1\u8005\u7684\u5fc3\u6001\uff0c\u53ef\u4ee5\u548c\u4e00\u4e2a\u89c9\u609f\u8005\u76f8\u63d0\u5e76\u8bba\u4e86\uff0c\u90a3\u4e9b\u4e2a\u770b\u4e0d\u5230\u3001\u6478\u4e0d\u7740\u7684\u5b57\u8282\uff0c\u5b8c\u6210\u4f60\u7684\u590d\u6742\u7684\u903b\u8f91\uff0c\u9700\u8981\u4f60\u4fdd\u6301\u7a33\u5b9a\u548c\u7406\u6027\u7684\u72b6\u6001\u3002"),(0,l.kt)("p",null,"\u8fd9\u65b9\u9762\u6709\u5f88\u591a\u597d\u7684\u8bfb\u7269\uff0c\u6bd4\u5982",(0,l.kt)("a",{parentName:"p",href:"https://item.jd.com/10393278.html"},"\u300a\u7a0b\u5e8f\u5458\u4fee\u70bc\u4e4b\u9053\uff1a\u4ece\u5c0f\u5de5\u5230\u4e13\u5bb6\u300b"),"\u3001",(0,l.kt)("a",{parentName:"p",href:"https://item.jd.com/12058554.html"},"\u300a\u51a5\u60f3\u300b"),"\u548c",(0,l.kt)("a",{parentName:"p",href:"https://item.jd.com/10024708744202.html"},"\u300a\u7a0b\u5e8f\u5458\u7684\u81ea\u6211\u4fee\u517b\u2014\u2014\u94fe\u63a5\u3001\u88c5\u8f7d\u4e0e\u5e93\u300b"),"\u3002\u8fd9\u51e0\u672c\u4e66\uff0c\u503c\u5f97\u5e38\u770b\uff0c\u5e38\u770b\u53ef\u4ee5\u5e38\u65b0\u3002\u5c24\u5176\u662f\u300a\u51a5\u60f3\u300b\uff0c\u6bcf\u5929\u65e9\u665a\u5404\u5341\u5206\u949f\u51a5\u60f3\uff0c\u575a\u6301 90 \u5929\uff0c\u4fdd\u8bc1\u4f60\u6210\u4e3a\u7a0b\u5e8f\u5458\u4e2d\u7684\u5927\u5e08\uff01"),(0,l.kt)("div",{className:"footnotes"},(0,l.kt)("hr",{parentName:"div"}),(0,l.kt)("ol",{parentName:"div"},(0,l.kt)("li",{parentName:"ol",id:"fn-what-is-pr"},"\u4ec0\u4e48\u662f PR\uff1f\u5373 PullRequest\uff0c\u662f\u5408\u5e76\u4ee3\u7801\u7684\u7533\u8bf7\uff0c\u6625\u677e\u5ba2\u670d\u7684 PR \u5217\u8868\u89c1 ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/cskefu/cskefu/pulls"},"https://github.com/cskefu/cskefu/pulls"),(0,l.kt)("a",{parentName:"li",href:"#fnref-what-is-pr",className:"footnote-backref"},"\u21a9")),(0,l.kt)("li",{parentName:"ol",id:"fn-what-is-dco"},"\u4ec0\u4e48\u662f DCO\uff1fDCO \u662f\u4e00\u79cd\u8d21\u732e\u8005\u534f\u8bae\uff0c\u4ee3\u8868\u60a8\u6709\u6743\u529b\u5c06\u4ee3\u7801\u8d21\u732e\u81f3\u5f00\u6e90\u793e\u533a\uff0c\u6625\u677e\u5ba2\u670d\u5408\u5e76\u7684\u4ee3\u7801\u5fc5\u987b\u6709 DCO \u6216 CLA \u534f\u8bae\uff0c\u8be6\u7ec6\u4ecb\u7ecd ",(0,l.kt)("a",{parentName:"li",href:"https://www.cskefu.com/2022/10/19/vote-cla-dco-result/"},"https://www.cskefu.com/2022/10/19/vote-cla-dco-result/"),(0,l.kt)("a",{parentName:"li",href:"#fnref-what-is-dco",className:"footnote-backref"},"\u21a9")))))}u.isMDXComponent=!0},61612:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/cskefu-pr-workflow-3c7b67afe5eda0962fbc871933c9a955.png"},52750:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819144222-0a5c30b13d9f2b30841a94c7e87dc073.png"},21039:(e,t,A)=>{A.d(t,{Z:()=>n});const n="data:image/png;base64,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"},57775:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819150059-5e3326d126bbf5e97b5caeea5f694a2b.png"},38511:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819154050-2d137798a1f11be8981b439eaee81efa.png"},78518:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819154121-e1cb12b4246e82b3022b57993c194be9.png"},33084:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819154635-de937cd27c3de3a15ad24f0f1507fe66.png"},52252:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819170111-fdbef6538d9cd1d37fb0f36923132c2a.png"},47533:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819171137-8a2b8326dacdc517e6b6b844d9543d77.png"},17443:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819171254-8e4266b176a66cb068ae9a379b68e521.png"},72384:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819172301-2a2c58b2705cec61413a91a35db5866f.png"},44586:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819172636-f48e17bba2af5efbd891998b62bbd537.png"},88940:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819172750-b3cf243e5f1744dcf33e5d35bc141642.png"},98069:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819173250-72420506e5185a8c5a0c580c66160b61.png"},12150:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819173357-981832576196d967ac12b09bd46dadf9.png"},56508:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819173544-260706de594d5889d16453b847d00896.png"},21198:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819174201-3678cdf3186f57a60adaadab40dbd9ef.png"},90659:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819174401-960332cb6dc3f3ddd536632dc202e7bd.png"},40183:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230819174514-641d54479c3be63155c0c0db0ee6599d.png"},11461:(e,t,A)=>{A.d(t,{Z:()=>n});const n=A.p+"assets/images/screenshot_20230828081950-0359d8b46cf971131363c6434ef3bf85.png"},35245:(e,t,A)=>{A.d(t,{Z:()=>n});const n="data:image/png;base64,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"}}]); \ No newline at end of file diff --git a/assets/js/72610070.17ddde7f.js b/assets/js/72610070.17ddde7f.js new file mode 100644 index 00000000..e75e6614 --- /dev/null +++ b/assets/js/72610070.17ddde7f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcskefu_docs=self.webpackChunkcskefu_docs||[]).push([[8693],{3905:(t,e,n)=>{n.d(e,{Zo:()=>c,kt:()=>m});var a=n(67294);function r(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function l(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,a)}return n}function o(t){for(var e=1;e=0||(r[n]=t[n]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(r[n]=t[n])}return r}var p=a.createContext({}),s=function(t){var e=a.useContext(p),n=e;return t&&(n="function"==typeof t?t(e):o(o({},e),t)),n},c=function(t){var e=s(t.components);return a.createElement(p.Provider,{value:e},t.children)},u={inlineCode:"code",wrapper:function(t){var e=t.children;return a.createElement(a.Fragment,{},e)}},d=a.forwardRef((function(t,e){var n=t.components,r=t.mdxType,l=t.originalType,p=t.parentName,c=i(t,["components","mdxType","originalType","parentName"]),d=s(n),m=r,k=d["".concat(p,".").concat(m)]||d[m]||u[m]||l;return n?a.createElement(k,o(o({ref:e},c),{},{components:n})):a.createElement(k,o({ref:e},c))}));function m(t,e){var n=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var l=n.length,o=new Array(l);o[0]=d;var i={};for(var p in e)hasOwnProperty.call(e,p)&&(i[p]=e[p]);i.originalType=t,i.mdxType="string"==typeof t?t:r,o[1]=i;for(var s=2;s{n.r(e),n.d(e,{assets:()=>p,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var a=n(87462),r=(n(67294),n(3905));const l={sidebar_position:2},o="\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005",i={unversionedId:"osc/devonboard",id:"version-v8/osc/devonboard",title:"\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005",description:"\u5f53\u60a8\u6709\u8f6f\u4ef6\u5f00\u53d1\u6280\u80fd\uff0c\u5728\u60a8\u52a0\u5165\u6625\u677e\u5ba2\u670d\u98de\u4e66\u7fa4\u540e\uff0c\u63a5\u4e0b\u6765\u600e\u4e48\u53c2\u4e0e\u6625\u677e\u5ba2\u670d\u793e\u533a\u5efa\u8bbe\u5462\uff1f\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005\uff01",source:"@site/versioned_docs/version-v8/osc/devonboard.md",sourceDirName:"osc",slug:"/osc/devonboard",permalink:"/cskefu-docs/docs/osc/devonboard",draft:!1,editUrl:"https://github.com/cskefu/docs/tree/main/packages/create-docusaurus/templates/shared/versioned_docs/version-v8/osc/devonboard.md",tags:[],version:"v8",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"\u5f00\u6e90\u8bb8\u53ef\u534f\u8bae",permalink:"/cskefu-docs/docs/osc/license"},next:{title:"\u5b9a\u5236\u5f00\u53d1\u6559\u7a0b",permalink:"/cskefu-docs/docs/osc/training"}},p={},s=[{value:"\u6210\u4e3a\u5f00\u53d1\u8005\uff0c\u6211\u80fd\u5f97\u5230\u4ec0\u4e48",id:"\u6210\u4e3a\u5f00\u53d1\u8005\u6211\u80fd\u5f97\u5230\u4ec0\u4e48",level:2},{value:"\u5982\u4f55\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u7684\u5f00\u53d1\u8005\u5462\uff1f",id:"\u5982\u4f55\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u7684\u5f00\u53d1\u8005\u5462",level:2},{value:"Step 1. \u5b8c\u6210\u7b2c\u4e00\u4e2a PR",id:"step-1-\u5b8c\u6210\u7b2c\u4e00\u4e2a-pr",level:3},{value:"Step 2. \u9886\u53d6\u5f00\u53d1\u4efb\u52a1",id:"step-2-\u9886\u53d6\u5f00\u53d1\u4efb\u52a1",level:3},{value:"Step 3. \u63d0\u4ea4 PR",id:"step-3-\u63d0\u4ea4-pr",level:3},{value:"\u6210\u4e3a\u6838\u5fc3\u5f00\u53d1\u8005",id:"\u6210\u4e3a\u6838\u5fc3\u5f00\u53d1\u8005",level:2},{value:"\u4eba\u5458\u8054\u7cfb\u65b9\u5f0f",id:"\u4eba\u5458\u8054\u7cfb\u65b9\u5f0f",level:2}],c={toc:s};function u(t){let{components:e,...l}=t;return(0,r.kt)("wrapper",(0,a.Z)({},c,l,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005"},"\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005"),(0,r.kt)("p",null,"\u5f53\u60a8\u6709\u8f6f\u4ef6\u5f00\u53d1\u6280\u80fd\uff0c\u5728\u60a8\u52a0\u5165\u6625\u677e\u5ba2\u670d\u98de\u4e66\u7fa4\u540e\uff0c\u63a5\u4e0b\u6765\u600e\u4e48\u53c2\u4e0e\u6625\u677e\u5ba2\u670d\u793e\u533a\u5efa\u8bbe\u5462\uff1f\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005\uff01"),(0,r.kt)("h2",{id:"\u6210\u4e3a\u5f00\u53d1\u8005\u6211\u80fd\u5f97\u5230\u4ec0\u4e48"},"\u6210\u4e3a\u5f00\u53d1\u8005\uff0c\u6211\u80fd\u5f97\u5230\u4ec0\u4e48"),(0,r.kt)("p",null,"\u5f00\u53d1\u8f6f\u4ef6\u5e76\u6ee1\u8db3\u7528\u6237\u7684\u9700\u6c42\uff0c\u5bf9\u4e8e\u6625\u677e\u5ba2\u670d\u800c\u8a00\u662f\u4e00\u4ef6\u4e25\u8083\u7684\u4e8b\u60c5\uff0c\u56e0\u4e3a\u6625\u677e\u5ba2\u670d\u7684\u7528\u6237\u662f\u4f01\u4e1a\u7684\u5ba2\u670d\u90e8\u95e8\uff0c\u5ba2\u6237\u670d\u52a1\u5bf9\u4e8e\u4f01\u4e1a\u7684\u91cd\u8981\u6027\u6beb\u65e0\u7591\u95ee\uff1a\u975e\u5e38\u91cd\u8981\u3002\u6625\u677e\u5ba2\u670d\u627f\u8bfa\uff0c\u4e3a\u7528\u6237\u63d0\u4f9b\u9ad8\u54c1\u8d28\u7684\u5f00\u6e90\u5ba2\u670d\u7cfb\u7edf\uff01"),(0,r.kt)("p",null,"\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005\u540e\uff0c\u901a\u8fc7\u8d21\u732e\u4ee3\u7801\uff0c\u53d6\u5f97\u8ba4\u53ef\uff0c\u53ef\u8fdb\u4e00\u6b65\u7684\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u6838\u5fc3\u5f00\u53d1\u8005\u3002"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u5982\u4f55\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u6838\u5fc3\u5f00\u53d1\u8005\uff1a",(0,r.kt)("a",{parentName:"li",href:"https://www.cskefu.com/core-developers/"},"https://www.cskefu.com/core-developers/")),(0,r.kt)("li",{parentName:"ul"},"\u6210\u4e3a\u6838\u5fc3\u5f00\u53d1\u8005\uff0c\u53c2\u4e0e\u6625\u677e\u5ba2\u670d\u5546\u4e1a\u5316\u53d6\u5f97\u7684\u5229\u6da6\u5206\u914d\uff1a",(0,r.kt)("a",{parentName:"li",href:"https://www.cskefu.com/profit-sharing-plans/"},"https://www.cskefu.com/profit-sharing-plans/"))),(0,r.kt)("h2",{id:"\u5982\u4f55\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u7684\u5f00\u53d1\u8005\u5462"},"\u5982\u4f55\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u7684\u5f00\u53d1\u8005\u5462\uff1f"),(0,r.kt)("p",null,"\u867d\u7136\u60a8\u53ef\u80fd\u521a\u521a\u5de5\u4f5c\uff0c\u5bf9\u8f6f\u4ef6\u5f00\u53d1\u5de5\u4f5c\u8fd8\u4e0d\u719f\u6089\uff0c\u4f46\u662f\u5728\u6625\u677e\u5ba2\u670d\u793e\u533a\u7684\u5e2e\u52a9\u4e0b\uff0c\u60a8\u4e5f\u53ef\u4ee5\u5f88\u5feb\u7684\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005\uff0c\u8fd9\u662f\u56e0\u4e3a\u9762\u5bf9\u521a\u521a\u52a0\u5165\u7684\u5f00\u53d1\u8005\uff0c\u6211\u4eec\u63d0\u4f9b\u4e86\u5982\u4e0b\u7684\u652f\u6301\u5e2e\u52a9\u60a8\u5feb\u901f\u878d\u5165\u6625\u677e\u5ba2\u670d\u5f00\u6e90\u793e\u533a\uff1a\u6211\u4eec\u79f0\u8fd9\u4e2a\u6d41\u7a0b\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005 Onboard \u6d41\u7a0b\uff08\u7b80\u79f0 Dev Onboard\uff09\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(88638).Z,width:"794",height:"577"})),(0,r.kt)("h3",{id:"step-1-\u5b8c\u6210\u7b2c\u4e00\u4e2a-pr"},"Step 1. \u5b8c\u6210\u7b2c\u4e00\u4e2a PR"),(0,r.kt)("p",null,"\u6625\u677e\u5ba2\u670d\u793e\u533a\u5df2\u7ecf\u6709\u4e86\u975e\u5e38\u8be6\u7ec6\u7684\u63cf\u8ff0\u5982\u4f55\u63d0\u4ea4 PR \u5230\u6625\u677e\u5ba2\u670d\u7684\u6587\u6863\uff0c"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://docs.cskefu.com/docs/osc/contribution"},"https://docs.cskefu.com/docs/osc/contribution")),(0,r.kt)("p",null,"\u4f46\u662f\uff0c\u4f5c\u4e3a\u6bcf\u4e2a\u65b0\u52a0\u5165\u7684\u5f00\u53d1\u8005\u7684\u7b2c\u4e00\u4e2a PR\uff0c\u6211\u4eec\u4f1a\u5c3d\u53ef\u80fd\u7684\u4e13\u6ce8\u4e8e\u5e2e\u52a9\u60a8\u638c\u63e1\u3010\u63d0\u4ea4 PR \u7684\u5de5\u5177\u94fe\u3011\u7684\u4f7f\u7528\uff0c\u964d\u4f4e\u5177\u4f53\u7684\u6e90\u7801\u6539\u52a8\u7684\u96be\u5ea6\u3002\u540c\u65f6\uff0c\u8fd9\u4e00\u6b65\u9aa4\uff0c\u4f1a\u7531\u6625\u677e\u5ba2\u670d\u6280\u672f\u4e13\u5bb6\uff08\u8054\u7cfb\u65b9\u5f0f\u89c1\u540e\u6587\uff1a\u4eba\u5458\u8054\u7cfb\u65b9\u5f0f\uff09\u534f\u52a9\u60a8\u5b8c\u6210\u3002\u7b2c\u4e00\u4e2a PR \u7684\u5177\u4f53\u5de5\u4f5c\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u9996\u5148\uff0c\u6625\u677e\u5ba2\u670d\u6280\u672f\u4e13\u5bb6\u4f1a\u521b\u5efa\u4e00\u4e2a Issue\uff0c\u6807\u9898\uff1a\u67d0\u67d0\u67d0\u7684\u7b2c\u4e00\u4e2a PR\uff1b\u5185\u5bb9\uff1a\u4fee\u6539\u6587\u4ef6 ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/cskefu/cskefu/blob/develop/public/pr1st.md"},"pr1st.md"),"\uff0c\u6dfb\u52a0\u4e00\u884c ",(0,r.kt)("inlineCode",{parentName:"li"},"\u67d0\u67d0\u67d0 @ \u65e5\u671f"),"\u3002\u5e76\u59d4\u6d3e\u7ed9\u60a8\uff0c\u8fd9\u9700\u8981\u60a8\u4e8b\u5148\u51c6\u5907 GitHub \u8d26\u53f7\uff0c\u6b64\u65f6\u60a8\u5f97\u5230\u4e86\u4e00\u4e2a Issue \u53ca\u5176 Issue \u53f7\u3002\n"),(0,r.kt)("li",{parentName:"ul"},"\u7136\u540e\uff0c\u6839\u636e\u6587\u6863",(0,r.kt)("a",{parentName:"li",href:"https://cskefu.gitee.io/cskefu-docs/docs/osc/contribution"},"\u300a\u5982\u4f55\u63d0\u4ea4 PR \u5230\u6625\u677e\u5ba2\u670d\u300b"),"\uff0c \u60a8\u63d0\u4ea4 PR\uff0c\u5728\u8fd9\u671f\u95f4\u9047\u5230\u4efb\u4f55\u56f0\u96be\uff0c\u4efb\u4f55\u56f0\u96be\uff0c\u8bf7\u627e\u6625\u677e\u5ba2\u670d\u6280\u672f\u4e13\u5bb6\u53d6\u5f97\u5e2e\u52a9\uff0c\u53ef\u4ee5\u5728 GitHub Issue\u3001\u98de\u4e66\u3001\u5fae\u4fe1\u7b49\u6e20\u9053\uff0c\u53d6\u5f97\u4e00\u5bf9\u4e00\u7684\u5e2e\u52a9\u3002\n"),(0,r.kt)("li",{parentName:"ul"},"\u8fd9\u4e00\u6b65\u7684\u5b8c\u6210\uff0c\u662f\u8be5\u8c03\u6574\u6700\u7ec8\u5408\u5e76\u5230\u4e86 github.com/cskefu/cskefu:develop \u5206\u652f\u4e0a\uff0c\u7136\u540e\u60a8\u5173\u95ed Issue\uff0c\u5173\u95ed\u6309\u94ae\u5982\u4e0b\u3002")),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(57873).Z,width:"1280",height:"699"})),(0,r.kt)("h3",{id:"step-2-\u9886\u53d6\u5f00\u53d1\u4efb\u52a1"},"Step 2. \u9886\u53d6\u5f00\u53d1\u4efb\u52a1"),(0,r.kt)("p",null,"\u5728 Step 1 \u4e2d\uff0c\u60a8\u8fd8\u6ca1\u6709\u5bf9\u6625\u677e\u5ba2\u670d\u4ea7\u54c1\u505a\u4efb\u4f55\u6539\u52a8\uff0c\u5728\u5b8c\u6210\u4e86 Step 1 \u540e\uff0c\u60a8\u548c\u6625\u677e\u5ba2\u670d\u4ea7\u54c1\u7ecf\u7406\u8054\u7cfb\uff08\u8054\u7cfb\u65b9\u5f0f\u89c1\u540e\u6587\uff1a\u4eba\u5458\u8054\u7cfb\u65b9\u5f0f\uff09\uff0c\u4f60\u4eec\u4e00\u8d77\u6765\u5546\u5b9a\u5177\u4f53\u7684\u5f00\u53d1\u4efb\u52a1\uff0c\u4e5f\u662f\u67d0\u4e2a Issue\u3002\u6625\u677e\u5ba2\u670d\u4ea7\u54c1\u7ecf\u7406\u6839\u636e\u7528\u6237\u9700\u6c42\u8bbe\u8ba1\u6625\u677e\u5ba2\u670d\u7684\u754c\u9762\u3001\u529f\u80fd\u548c\u63a5\u53e3\u5b9a\u4e49\u7b49\uff0c\u8fd9\u4e9b\u548c\u4e1a\u52a1\u5173\u7cfb\u7d27\u5bc6\u7684\u5de5\u4f5c\u7edf\u79f0\u4e3a\u8bbe\u8ba1\u5de5\u4f5c\uff0c\u60a8\u7684\u4efb\u52a1\u548c\u5177\u4f53\u7684\u6625\u677e\u5ba2\u670d\u529f\u80fd\u5bf9\u5e94\u65f6\uff0c\u7531\u4ea7\u54c1\u7ecf\u7406\u5e2e\u52a9\u60a8\u7406\u89e3\u8bbe\u8ba1\u548c\u80cc\u666f\uff0c\u53ef\u80fd\u67d0\u4e9b\u66f4\u7ec6\u8282\u7684\u8bbe\u8ba1\u4e5f\u9700\u8981\u5728\u5b9e\u73b0\u9636\u6bb5\u7ee7\u7eed\u7684\u63a2\u8ba8\u3002\u6240\u4ee5\uff0c\u6625\u677e\u5ba2\u670d\u7684\u7814\u53d1\u5de5\u4f5c\uff0c\u5c31\u662f\u3010\u8ba1\u5212-\u8bbe\u8ba1-\u5b9e\u73b0-\u6d4b\u8bd5-\u7528\u6237\u53cd\u9988-\u8ba1\u5212\u3011\u7684\u5faa\u73af\u7684\u6d41\u6c34\u7ebf\uff0c\u73b0\u5728\u60a8\u548c\u6625\u677e\u5ba2\u670d\u4ea7\u54c1\u7ecf\u7406\u7684\u534f\u4f5c\u5904\u4e8e\u8bbe\u8ba1\u9636\u6bb5\u3002"),(0,r.kt)("p",null,"\u7b49\u60a8\u6709\u4e86\u4e00\u4e2a\u5f00\u53d1\u4efb\u52a1\uff0c\u5c31\u8fdb\u5165\u5230\u4e86\u5b9e\u73b0\u9636\u6bb5\uff0c\u5728\u5b9e\u73b0\u9636\u6bb5\uff0c\u60a8\u4f1a\u7ee7\u7eed\u53d6\u5f97\u6765\u81ea\u793e\u533a\u7684\u652f\u6301\uff0c\u6211\u4eec\u90fd\u4e3b\u8981\u4ee5 GitHub Issue \u548c PR \u7684\u65b9\u5f0f\u8fdb\u884c\u534f\u4f5c\uff0c\u56e0\u4e3a\u516c\u5f00\u7684\u65b9\u5f0f\u53ef\u4ee5\u63d0\u5347\u96c6\u4f53\u534f\u4f5c\u7684\u6548\u7387\uff0c\u5f53\u60a8\u53d1\u5e03\u4e86\u95ee\u9898\u540e\uff0c\u60a8\u53ef\u4ee5\u4e3b\u52a8\u7684\u8054\u7cfb\u76f8\u5173\u7684\u4eba\uff0c\u5f53\u60a8\u4e0d\u77e5\u9053\u8054\u7cfb\u8c01\u7684\u65f6\u5019\uff0c\u60a8\u53ef\u4ee5\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u9700\u6c42\u3001\u8bbe\u8ba1\u3001\u91cc\u7a0b\u7891\u65b9\u9762\u7684\u95ee\u9898\uff0c\u627e\u6625\u677e\u5ba2\u670d\u4ea7\u54c1\u7ecf\u7406\n"),(0,r.kt)("li",{parentName:"ul"},"\u5b9e\u73b0\u3001\u6280\u672f\u95ee\u9898\u3001\u5f00\u53d1\u73af\u5883\u642d\u5efa\u3001PR Review \u7b49\uff0c\u627e\u6625\u677e\u5ba2\u670d\u6280\u672f\u4e13\u5bb6\n"),(0,r.kt)("li",{parentName:"ul"},"\u5176\u5b83\u95ee\u9898\uff0c\u627e\u6625\u677e\u5ba2\u670d\u603b\u5de5\u7a0b\u5e08\n")),(0,r.kt)("h3",{id:"step-3-\u63d0\u4ea4-pr"},"Step 3. \u63d0\u4ea4 PR"),(0,r.kt)("p",null,"\u5b8c\u6210\u4e86 Step 1 \u548c Step 2 \u540e\uff0c\u60a8\u5c31\u53ef\u4ee5\u72ec\u7acb\u7684\u5b9e\u73b0\u67d0\u4e2a\u4efb\u52a1\u4e86\uff0c\u8bb0\u4f4f\uff0c\u60a8\u662f\u72ec\u7acb\u7684\uff0c\u4f46\u662f\u5e76\u4e0d\u5b64\u72ec\uff0c\u9700\u8981\u5e2e\u52a9\u7684\u65f6\u5019\uff0c\u968f\u65f6\u5411\u793e\u533a\u63d0\u51fa\uff01"),(0,r.kt)("p",null,"\u5f53\u60a8\u63d0\u4ea4\u4e86\u7b2c\u4e00\u4e2a\u548c\u5f00\u53d1\u4efb\u52a1\u76f8\u5173\u7684 PR\uff0c\u8be5 PR \u8fdb\u5165 Code Review \u72b6\u6001\uff0c\u60a8\u5c31\u5b8c\u6210\u4e86\u7b2c\u4e09\u6b65\u3002"),(0,r.kt)("p",null,"\u606d\u559c\u5e76\u611f\u8c22\u60a8\uff0c\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005\uff01"),(0,r.kt)("h2",{id:"\u6210\u4e3a\u6838\u5fc3\u5f00\u53d1\u8005"},"\u6210\u4e3a\u6838\u5fc3\u5f00\u53d1\u8005"),(0,r.kt)("p",null,"\u5728\u60a8\u5b8c\u6210 Dev Onboard \u6d41\u7a0b 1 \u4e2a\u6708\u540e\uff0c\u5373\u7b2c\u4e09\u6b65\u4e2d\u63d0\u4ea4\u7b2c\u4e00\u4e2a\u548c\u7b2c\u4e8c\u6b65\u5f00\u53d1\u4efb\u52a1\u76f8\u5173\u7684 PR \u540e\uff0c\u6625\u677e\u5ba2\u670d\u6280\u672f\u59d4\u5458\u4f1a\u8fdb\u884c\u6295\u7968\uff0c\u51b3\u5b9a\u662f\u5426\u63a5\u53d7\u60a8\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u6838\u5fc3\u5f00\u53d1\u8005\u3002\u5982\u679c\u8fd9\u6b21\u6295\u7968\u6ca1\u6709\u901a\u8fc7\uff0c\u90a3\u4e48\u60a8\u53ef\u4ee5\u7ee7\u7eed\u7684\u505a\u8d21\u732e\uff0c\u5c06\u6765\u8fd8\u6709\u7b2c\u4e8c\u6b21\u6295\u7968\u65f6\u673a\uff0c\u56e0\u4e3a\u6625\u677e\u5ba2\u670d\u9700\u8981\u5f88\u591a\u6838\u5fc3\u5f00\u53d1\u8005\uff0c\u6625\u677e\u5ba2\u670d\u6280\u672f\u59d4\u5458\u4f1a\u4f1a\u5c3d\u53ef\u80fd\u591a\u7684\u63d0\u540d\u6838\u5fc3\u5f00\u53d1\u8005\uff0c\u9ad8\u9891\u7387\u7684\u6295\u7968\uff08\u6bd4\u5982\u6bcf\u4e2a\u6708\u4e00\u6b21\uff09\u3002"),(0,r.kt)("h2",{id:"\u4eba\u5458\u8054\u7cfb\u65b9\u5f0f"},"\u4eba\u5458\u8054\u7cfb\u65b9\u5f0f"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null}),(0,r.kt)("th",{parentName:"tr",align:null}),(0,r.kt)("th",{parentName:"tr",align:null}),(0,r.kt)("th",{parentName:"tr",align:null}))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\u793e\u533a\u89d2\u8272"),(0,r.kt)("td",{parentName:"tr",align:null},"\u6635\u79f0"),(0,r.kt)("td",{parentName:"tr",align:null},"\u90ae\u7bb1"),(0,r.kt)("td",{parentName:"tr",align:null},"Profile")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\u4ea7\u54c1\u7ecf\u7406"),(0,r.kt)("td",{parentName:"tr",align:null},"Kaifuny"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"mailto:kaifanzhang@cskefu.com"},"kaifanzhang@cskefu.com")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://github.com/kaifuny"},"https://github.com/kaifuny"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\u6280\u672f\u4e13\u5bb6"),(0,r.kt)("td",{parentName:"tr",align:null},"\u5218\u52c7"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"mailto:ly@cskefu.com"},"ly@cskefu.com")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://github.com/lecjy"},"https://github.com/lecjy"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\u6625\u677e\u5ba2\u670d\u603b\u5de5\u7a0b\u5e08"),(0,r.kt)("td",{parentName:"tr",align:null},"Hai Liang W."),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"mailto:h@cskefu.com"},"h@cskefu.com")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://github.com/hailiang-wang"},"https://github.com/hailiang-wang"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\u6625\u677e\u5ba2\u670d\u6280\u672f\u59d4\u5458\u4f1a"),(0,r.kt)("td",{parentName:"tr",align:null},"N/A"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"mailto:tc@cskefu.com"},"tc@cskefu.com")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://www.cskefu.com/2023/09/13/tc-coord/"},"\u6625\u677e\u5ba2\u670d\u6280\u672f\u59d4\u5458\u4f1a\u534f\u4f5c\u4f53\u7cfb"))))))}u.isMDXComponent=!0},88638:(t,e,n)=>{n.d(e,{Z:()=>a});const a=n.p+"assets/images/Pasted image 20230913134502-44d5145a001aa48136c9cc30a617f888.png"},57873:(t,e,n)=>{n.d(e,{Z:()=>a});const a=n.p+"assets/images/Pasted image 20230913134529-f824d57d1f87b28a9ea7a8f7aea9fef7.png"}}]); \ No newline at end of file diff --git a/assets/js/72610070.390bfe2a.js b/assets/js/72610070.390bfe2a.js deleted file mode 100644 index 7b649e7a..00000000 --- a/assets/js/72610070.390bfe2a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcskefu_docs=self.webpackChunkcskefu_docs||[]).push([[8693],{3905:(t,e,n)=>{n.d(e,{Zo:()=>c,kt:()=>m});var a=n(67294);function r(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function l(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,a)}return n}function o(t){for(var e=1;e=0||(r[n]=t[n]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(r[n]=t[n])}return r}var p=a.createContext({}),s=function(t){var e=a.useContext(p),n=e;return t&&(n="function"==typeof t?t(e):o(o({},e),t)),n},c=function(t){var e=s(t.components);return a.createElement(p.Provider,{value:e},t.children)},u={inlineCode:"code",wrapper:function(t){var e=t.children;return a.createElement(a.Fragment,{},e)}},d=a.forwardRef((function(t,e){var n=t.components,r=t.mdxType,l=t.originalType,p=t.parentName,c=i(t,["components","mdxType","originalType","parentName"]),d=s(n),m=r,k=d["".concat(p,".").concat(m)]||d[m]||u[m]||l;return n?a.createElement(k,o(o({ref:e},c),{},{components:n})):a.createElement(k,o({ref:e},c))}));function m(t,e){var n=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var l=n.length,o=new Array(l);o[0]=d;var i={};for(var p in e)hasOwnProperty.call(e,p)&&(i[p]=e[p]);i.originalType=t,i.mdxType="string"==typeof t?t:r,o[1]=i;for(var s=2;s{n.r(e),n.d(e,{assets:()=>p,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var a=n(87462),r=(n(67294),n(3905));const l={sidebar_position:2},o="\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005",i={unversionedId:"osc/devonboard",id:"version-v8/osc/devonboard",title:"\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005",description:"\u5f53\u60a8\u6709\u8f6f\u4ef6\u5f00\u53d1\u6280\u80fd\uff0c\u5728\u60a8\u52a0\u5165\u6625\u677e\u5ba2\u670d\u98de\u4e66\u7fa4\u540e\uff0c\u63a5\u4e0b\u6765\u600e\u4e48\u53c2\u4e0e\u6625\u677e\u5ba2\u670d\u793e\u533a\u5efa\u8bbe\u5462\uff1f\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005\uff01",source:"@site/versioned_docs/version-v8/osc/devonboard.md",sourceDirName:"osc",slug:"/osc/devonboard",permalink:"/cskefu-docs/docs/osc/devonboard",draft:!1,editUrl:"https://github.com/cskefu/docs/tree/main/packages/create-docusaurus/templates/shared/versioned_docs/version-v8/osc/devonboard.md",tags:[],version:"v8",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"\u5f00\u6e90\u8bb8\u53ef\u534f\u8bae",permalink:"/cskefu-docs/docs/osc/license"},next:{title:"\u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802",permalink:"/cskefu-docs/docs/osc/training"}},p={},s=[{value:"\u6210\u4e3a\u5f00\u53d1\u8005\uff0c\u6211\u80fd\u5f97\u5230\u4ec0\u4e48",id:"\u6210\u4e3a\u5f00\u53d1\u8005\u6211\u80fd\u5f97\u5230\u4ec0\u4e48",level:2},{value:"\u5982\u4f55\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u7684\u5f00\u53d1\u8005\u5462\uff1f",id:"\u5982\u4f55\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u7684\u5f00\u53d1\u8005\u5462",level:2},{value:"Step 1. \u5b8c\u6210\u7b2c\u4e00\u4e2a PR",id:"step-1-\u5b8c\u6210\u7b2c\u4e00\u4e2a-pr",level:3},{value:"Step 2. \u9886\u53d6\u5f00\u53d1\u4efb\u52a1",id:"step-2-\u9886\u53d6\u5f00\u53d1\u4efb\u52a1",level:3},{value:"Step 3. \u63d0\u4ea4 PR",id:"step-3-\u63d0\u4ea4-pr",level:3},{value:"\u6210\u4e3a\u6838\u5fc3\u5f00\u53d1\u8005",id:"\u6210\u4e3a\u6838\u5fc3\u5f00\u53d1\u8005",level:2},{value:"\u4eba\u5458\u8054\u7cfb\u65b9\u5f0f",id:"\u4eba\u5458\u8054\u7cfb\u65b9\u5f0f",level:2}],c={toc:s};function u(t){let{components:e,...l}=t;return(0,r.kt)("wrapper",(0,a.Z)({},c,l,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005"},"\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005"),(0,r.kt)("p",null,"\u5f53\u60a8\u6709\u8f6f\u4ef6\u5f00\u53d1\u6280\u80fd\uff0c\u5728\u60a8\u52a0\u5165\u6625\u677e\u5ba2\u670d\u98de\u4e66\u7fa4\u540e\uff0c\u63a5\u4e0b\u6765\u600e\u4e48\u53c2\u4e0e\u6625\u677e\u5ba2\u670d\u793e\u533a\u5efa\u8bbe\u5462\uff1f\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005\uff01"),(0,r.kt)("h2",{id:"\u6210\u4e3a\u5f00\u53d1\u8005\u6211\u80fd\u5f97\u5230\u4ec0\u4e48"},"\u6210\u4e3a\u5f00\u53d1\u8005\uff0c\u6211\u80fd\u5f97\u5230\u4ec0\u4e48"),(0,r.kt)("p",null,"\u5f00\u53d1\u8f6f\u4ef6\u5e76\u6ee1\u8db3\u7528\u6237\u7684\u9700\u6c42\uff0c\u5bf9\u4e8e\u6625\u677e\u5ba2\u670d\u800c\u8a00\u662f\u4e00\u4ef6\u4e25\u8083\u7684\u4e8b\u60c5\uff0c\u56e0\u4e3a\u6625\u677e\u5ba2\u670d\u7684\u7528\u6237\u662f\u4f01\u4e1a\u7684\u5ba2\u670d\u90e8\u95e8\uff0c\u5ba2\u6237\u670d\u52a1\u5bf9\u4e8e\u4f01\u4e1a\u7684\u91cd\u8981\u6027\u6beb\u65e0\u7591\u95ee\uff1a\u975e\u5e38\u91cd\u8981\u3002\u6625\u677e\u5ba2\u670d\u627f\u8bfa\uff0c\u4e3a\u7528\u6237\u63d0\u4f9b\u9ad8\u54c1\u8d28\u7684\u5f00\u6e90\u5ba2\u670d\u7cfb\u7edf\uff01"),(0,r.kt)("p",null,"\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005\u540e\uff0c\u901a\u8fc7\u8d21\u732e\u4ee3\u7801\uff0c\u53d6\u5f97\u8ba4\u53ef\uff0c\u53ef\u8fdb\u4e00\u6b65\u7684\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u6838\u5fc3\u5f00\u53d1\u8005\u3002"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u5982\u4f55\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u6838\u5fc3\u5f00\u53d1\u8005\uff1a",(0,r.kt)("a",{parentName:"li",href:"https://www.cskefu.com/core-developers/"},"https://www.cskefu.com/core-developers/")),(0,r.kt)("li",{parentName:"ul"},"\u6210\u4e3a\u6838\u5fc3\u5f00\u53d1\u8005\uff0c\u53c2\u4e0e\u6625\u677e\u5ba2\u670d\u5546\u4e1a\u5316\u53d6\u5f97\u7684\u5229\u6da6\u5206\u914d\uff1a",(0,r.kt)("a",{parentName:"li",href:"https://www.cskefu.com/profit-sharing-plans/"},"https://www.cskefu.com/profit-sharing-plans/"))),(0,r.kt)("h2",{id:"\u5982\u4f55\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u7684\u5f00\u53d1\u8005\u5462"},"\u5982\u4f55\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u7684\u5f00\u53d1\u8005\u5462\uff1f"),(0,r.kt)("p",null,"\u867d\u7136\u60a8\u53ef\u80fd\u521a\u521a\u5de5\u4f5c\uff0c\u5bf9\u8f6f\u4ef6\u5f00\u53d1\u5de5\u4f5c\u8fd8\u4e0d\u719f\u6089\uff0c\u4f46\u662f\u5728\u6625\u677e\u5ba2\u670d\u793e\u533a\u7684\u5e2e\u52a9\u4e0b\uff0c\u60a8\u4e5f\u53ef\u4ee5\u5f88\u5feb\u7684\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005\uff0c\u8fd9\u662f\u56e0\u4e3a\u9762\u5bf9\u521a\u521a\u52a0\u5165\u7684\u5f00\u53d1\u8005\uff0c\u6211\u4eec\u63d0\u4f9b\u4e86\u5982\u4e0b\u7684\u652f\u6301\u5e2e\u52a9\u60a8\u5feb\u901f\u878d\u5165\u6625\u677e\u5ba2\u670d\u5f00\u6e90\u793e\u533a\uff1a\u6211\u4eec\u79f0\u8fd9\u4e2a\u6d41\u7a0b\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005 Onboard \u6d41\u7a0b\uff08\u7b80\u79f0 Dev Onboard\uff09\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(88638).Z,width:"794",height:"577"})),(0,r.kt)("h3",{id:"step-1-\u5b8c\u6210\u7b2c\u4e00\u4e2a-pr"},"Step 1. \u5b8c\u6210\u7b2c\u4e00\u4e2a PR"),(0,r.kt)("p",null,"\u6625\u677e\u5ba2\u670d\u793e\u533a\u5df2\u7ecf\u6709\u4e86\u975e\u5e38\u8be6\u7ec6\u7684\u63cf\u8ff0\u5982\u4f55\u63d0\u4ea4 PR \u5230\u6625\u677e\u5ba2\u670d\u7684\u6587\u6863\uff0c"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://docs.cskefu.com/docs/osc/contribution"},"https://docs.cskefu.com/docs/osc/contribution")),(0,r.kt)("p",null,"\u4f46\u662f\uff0c\u4f5c\u4e3a\u6bcf\u4e2a\u65b0\u52a0\u5165\u7684\u5f00\u53d1\u8005\u7684\u7b2c\u4e00\u4e2a PR\uff0c\u6211\u4eec\u4f1a\u5c3d\u53ef\u80fd\u7684\u4e13\u6ce8\u4e8e\u5e2e\u52a9\u60a8\u638c\u63e1\u3010\u63d0\u4ea4 PR \u7684\u5de5\u5177\u94fe\u3011\u7684\u4f7f\u7528\uff0c\u964d\u4f4e\u5177\u4f53\u7684\u6e90\u7801\u6539\u52a8\u7684\u96be\u5ea6\u3002\u540c\u65f6\uff0c\u8fd9\u4e00\u6b65\u9aa4\uff0c\u4f1a\u7531\u6625\u677e\u5ba2\u670d\u6280\u672f\u4e13\u5bb6\uff08\u8054\u7cfb\u65b9\u5f0f\u89c1\u540e\u6587\uff1a\u4eba\u5458\u8054\u7cfb\u65b9\u5f0f\uff09\u534f\u52a9\u60a8\u5b8c\u6210\u3002\u7b2c\u4e00\u4e2a PR \u7684\u5177\u4f53\u5de5\u4f5c\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u9996\u5148\uff0c\u6625\u677e\u5ba2\u670d\u6280\u672f\u4e13\u5bb6\u4f1a\u521b\u5efa\u4e00\u4e2a Issue\uff0c\u6807\u9898\uff1a\u67d0\u67d0\u67d0\u7684\u7b2c\u4e00\u4e2a PR\uff1b\u5185\u5bb9\uff1a\u4fee\u6539\u6587\u4ef6 ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/cskefu/cskefu/blob/develop/public/pr1st.md"},"pr1st.md"),"\uff0c\u6dfb\u52a0\u4e00\u884c ",(0,r.kt)("inlineCode",{parentName:"li"},"\u67d0\u67d0\u67d0 @ \u65e5\u671f"),"\u3002\u5e76\u59d4\u6d3e\u7ed9\u60a8\uff0c\u8fd9\u9700\u8981\u60a8\u4e8b\u5148\u51c6\u5907 GitHub \u8d26\u53f7\uff0c\u6b64\u65f6\u60a8\u5f97\u5230\u4e86\u4e00\u4e2a Issue \u53ca\u5176 Issue \u53f7\u3002\n"),(0,r.kt)("li",{parentName:"ul"},"\u7136\u540e\uff0c\u6839\u636e\u6587\u6863",(0,r.kt)("a",{parentName:"li",href:"https://cskefu.gitee.io/cskefu-docs/docs/osc/contribution"},"\u300a\u5982\u4f55\u63d0\u4ea4 PR \u5230\u6625\u677e\u5ba2\u670d\u300b"),"\uff0c \u60a8\u63d0\u4ea4 PR\uff0c\u5728\u8fd9\u671f\u95f4\u9047\u5230\u4efb\u4f55\u56f0\u96be\uff0c\u4efb\u4f55\u56f0\u96be\uff0c\u8bf7\u627e\u6625\u677e\u5ba2\u670d\u6280\u672f\u4e13\u5bb6\u53d6\u5f97\u5e2e\u52a9\uff0c\u53ef\u4ee5\u5728 GitHub Issue\u3001\u98de\u4e66\u3001\u5fae\u4fe1\u7b49\u6e20\u9053\uff0c\u53d6\u5f97\u4e00\u5bf9\u4e00\u7684\u5e2e\u52a9\u3002\n"),(0,r.kt)("li",{parentName:"ul"},"\u8fd9\u4e00\u6b65\u7684\u5b8c\u6210\uff0c\u662f\u8be5\u8c03\u6574\u6700\u7ec8\u5408\u5e76\u5230\u4e86 github.com/cskefu/cskefu:develop \u5206\u652f\u4e0a\uff0c\u7136\u540e\u60a8\u5173\u95ed Issue\uff0c\u5173\u95ed\u6309\u94ae\u5982\u4e0b\u3002")),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(57873).Z,width:"1280",height:"699"})),(0,r.kt)("h3",{id:"step-2-\u9886\u53d6\u5f00\u53d1\u4efb\u52a1"},"Step 2. \u9886\u53d6\u5f00\u53d1\u4efb\u52a1"),(0,r.kt)("p",null,"\u5728 Step 1 \u4e2d\uff0c\u60a8\u8fd8\u6ca1\u6709\u5bf9\u6625\u677e\u5ba2\u670d\u4ea7\u54c1\u505a\u4efb\u4f55\u6539\u52a8\uff0c\u5728\u5b8c\u6210\u4e86 Step 1 \u540e\uff0c\u60a8\u548c\u6625\u677e\u5ba2\u670d\u4ea7\u54c1\u7ecf\u7406\u8054\u7cfb\uff08\u8054\u7cfb\u65b9\u5f0f\u89c1\u540e\u6587\uff1a\u4eba\u5458\u8054\u7cfb\u65b9\u5f0f\uff09\uff0c\u4f60\u4eec\u4e00\u8d77\u6765\u5546\u5b9a\u5177\u4f53\u7684\u5f00\u53d1\u4efb\u52a1\uff0c\u4e5f\u662f\u67d0\u4e2a Issue\u3002\u6625\u677e\u5ba2\u670d\u4ea7\u54c1\u7ecf\u7406\u6839\u636e\u7528\u6237\u9700\u6c42\u8bbe\u8ba1\u6625\u677e\u5ba2\u670d\u7684\u754c\u9762\u3001\u529f\u80fd\u548c\u63a5\u53e3\u5b9a\u4e49\u7b49\uff0c\u8fd9\u4e9b\u548c\u4e1a\u52a1\u5173\u7cfb\u7d27\u5bc6\u7684\u5de5\u4f5c\u7edf\u79f0\u4e3a\u8bbe\u8ba1\u5de5\u4f5c\uff0c\u60a8\u7684\u4efb\u52a1\u548c\u5177\u4f53\u7684\u6625\u677e\u5ba2\u670d\u529f\u80fd\u5bf9\u5e94\u65f6\uff0c\u7531\u4ea7\u54c1\u7ecf\u7406\u5e2e\u52a9\u60a8\u7406\u89e3\u8bbe\u8ba1\u548c\u80cc\u666f\uff0c\u53ef\u80fd\u67d0\u4e9b\u66f4\u7ec6\u8282\u7684\u8bbe\u8ba1\u4e5f\u9700\u8981\u5728\u5b9e\u73b0\u9636\u6bb5\u7ee7\u7eed\u7684\u63a2\u8ba8\u3002\u6240\u4ee5\uff0c\u6625\u677e\u5ba2\u670d\u7684\u7814\u53d1\u5de5\u4f5c\uff0c\u5c31\u662f\u3010\u8ba1\u5212-\u8bbe\u8ba1-\u5b9e\u73b0-\u6d4b\u8bd5-\u7528\u6237\u53cd\u9988-\u8ba1\u5212\u3011\u7684\u5faa\u73af\u7684\u6d41\u6c34\u7ebf\uff0c\u73b0\u5728\u60a8\u548c\u6625\u677e\u5ba2\u670d\u4ea7\u54c1\u7ecf\u7406\u7684\u534f\u4f5c\u5904\u4e8e\u8bbe\u8ba1\u9636\u6bb5\u3002"),(0,r.kt)("p",null,"\u7b49\u60a8\u6709\u4e86\u4e00\u4e2a\u5f00\u53d1\u4efb\u52a1\uff0c\u5c31\u8fdb\u5165\u5230\u4e86\u5b9e\u73b0\u9636\u6bb5\uff0c\u5728\u5b9e\u73b0\u9636\u6bb5\uff0c\u60a8\u4f1a\u7ee7\u7eed\u53d6\u5f97\u6765\u81ea\u793e\u533a\u7684\u652f\u6301\uff0c\u6211\u4eec\u90fd\u4e3b\u8981\u4ee5 GitHub Issue \u548c PR \u7684\u65b9\u5f0f\u8fdb\u884c\u534f\u4f5c\uff0c\u56e0\u4e3a\u516c\u5f00\u7684\u65b9\u5f0f\u53ef\u4ee5\u63d0\u5347\u96c6\u4f53\u534f\u4f5c\u7684\u6548\u7387\uff0c\u5f53\u60a8\u53d1\u5e03\u4e86\u95ee\u9898\u540e\uff0c\u60a8\u53ef\u4ee5\u4e3b\u52a8\u7684\u8054\u7cfb\u76f8\u5173\u7684\u4eba\uff0c\u5f53\u60a8\u4e0d\u77e5\u9053\u8054\u7cfb\u8c01\u7684\u65f6\u5019\uff0c\u60a8\u53ef\u4ee5\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u9700\u6c42\u3001\u8bbe\u8ba1\u3001\u91cc\u7a0b\u7891\u65b9\u9762\u7684\u95ee\u9898\uff0c\u627e\u6625\u677e\u5ba2\u670d\u4ea7\u54c1\u7ecf\u7406\n"),(0,r.kt)("li",{parentName:"ul"},"\u5b9e\u73b0\u3001\u6280\u672f\u95ee\u9898\u3001\u5f00\u53d1\u73af\u5883\u642d\u5efa\u3001PR Review \u7b49\uff0c\u627e\u6625\u677e\u5ba2\u670d\u6280\u672f\u4e13\u5bb6\n"),(0,r.kt)("li",{parentName:"ul"},"\u5176\u5b83\u95ee\u9898\uff0c\u627e\u6625\u677e\u5ba2\u670d\u603b\u5de5\u7a0b\u5e08\n")),(0,r.kt)("h3",{id:"step-3-\u63d0\u4ea4-pr"},"Step 3. \u63d0\u4ea4 PR"),(0,r.kt)("p",null,"\u5b8c\u6210\u4e86 Step 1 \u548c Step 2 \u540e\uff0c\u60a8\u5c31\u53ef\u4ee5\u72ec\u7acb\u7684\u5b9e\u73b0\u67d0\u4e2a\u4efb\u52a1\u4e86\uff0c\u8bb0\u4f4f\uff0c\u60a8\u662f\u72ec\u7acb\u7684\uff0c\u4f46\u662f\u5e76\u4e0d\u5b64\u72ec\uff0c\u9700\u8981\u5e2e\u52a9\u7684\u65f6\u5019\uff0c\u968f\u65f6\u5411\u793e\u533a\u63d0\u51fa\uff01"),(0,r.kt)("p",null,"\u5f53\u60a8\u63d0\u4ea4\u4e86\u7b2c\u4e00\u4e2a\u548c\u5f00\u53d1\u4efb\u52a1\u76f8\u5173\u7684 PR\uff0c\u8be5 PR \u8fdb\u5165 Code Review \u72b6\u6001\uff0c\u60a8\u5c31\u5b8c\u6210\u4e86\u7b2c\u4e09\u6b65\u3002"),(0,r.kt)("p",null,"\u606d\u559c\u5e76\u611f\u8c22\u60a8\uff0c\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005\uff01"),(0,r.kt)("h2",{id:"\u6210\u4e3a\u6838\u5fc3\u5f00\u53d1\u8005"},"\u6210\u4e3a\u6838\u5fc3\u5f00\u53d1\u8005"),(0,r.kt)("p",null,"\u5728\u60a8\u5b8c\u6210 Dev Onboard \u6d41\u7a0b 1 \u4e2a\u6708\u540e\uff0c\u5373\u7b2c\u4e09\u6b65\u4e2d\u63d0\u4ea4\u7b2c\u4e00\u4e2a\u548c\u7b2c\u4e8c\u6b65\u5f00\u53d1\u4efb\u52a1\u76f8\u5173\u7684 PR \u540e\uff0c\u6625\u677e\u5ba2\u670d\u6280\u672f\u59d4\u5458\u4f1a\u8fdb\u884c\u6295\u7968\uff0c\u51b3\u5b9a\u662f\u5426\u63a5\u53d7\u60a8\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u6838\u5fc3\u5f00\u53d1\u8005\u3002\u5982\u679c\u8fd9\u6b21\u6295\u7968\u6ca1\u6709\u901a\u8fc7\uff0c\u90a3\u4e48\u60a8\u53ef\u4ee5\u7ee7\u7eed\u7684\u505a\u8d21\u732e\uff0c\u5c06\u6765\u8fd8\u6709\u7b2c\u4e8c\u6b21\u6295\u7968\u65f6\u673a\uff0c\u56e0\u4e3a\u6625\u677e\u5ba2\u670d\u9700\u8981\u5f88\u591a\u6838\u5fc3\u5f00\u53d1\u8005\uff0c\u6625\u677e\u5ba2\u670d\u6280\u672f\u59d4\u5458\u4f1a\u4f1a\u5c3d\u53ef\u80fd\u591a\u7684\u63d0\u540d\u6838\u5fc3\u5f00\u53d1\u8005\uff0c\u9ad8\u9891\u7387\u7684\u6295\u7968\uff08\u6bd4\u5982\u6bcf\u4e2a\u6708\u4e00\u6b21\uff09\u3002"),(0,r.kt)("h2",{id:"\u4eba\u5458\u8054\u7cfb\u65b9\u5f0f"},"\u4eba\u5458\u8054\u7cfb\u65b9\u5f0f"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null}),(0,r.kt)("th",{parentName:"tr",align:null}),(0,r.kt)("th",{parentName:"tr",align:null}),(0,r.kt)("th",{parentName:"tr",align:null}))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\u793e\u533a\u89d2\u8272"),(0,r.kt)("td",{parentName:"tr",align:null},"\u6635\u79f0"),(0,r.kt)("td",{parentName:"tr",align:null},"\u90ae\u7bb1"),(0,r.kt)("td",{parentName:"tr",align:null},"Profile")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\u4ea7\u54c1\u7ecf\u7406"),(0,r.kt)("td",{parentName:"tr",align:null},"Kaifuny"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"mailto:kaifanzhang@cskefu.com"},"kaifanzhang@cskefu.com")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://github.com/kaifuny"},"https://github.com/kaifuny"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\u6280\u672f\u4e13\u5bb6"),(0,r.kt)("td",{parentName:"tr",align:null},"\u5218\u52c7"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"mailto:ly@cskefu.com"},"ly@cskefu.com")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://github.com/lecjy"},"https://github.com/lecjy"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\u6625\u677e\u5ba2\u670d\u603b\u5de5\u7a0b\u5e08"),(0,r.kt)("td",{parentName:"tr",align:null},"Hai Liang W."),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"mailto:h@cskefu.com"},"h@cskefu.com")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://github.com/hailiang-wang"},"https://github.com/hailiang-wang"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\u6625\u677e\u5ba2\u670d\u6280\u672f\u59d4\u5458\u4f1a"),(0,r.kt)("td",{parentName:"tr",align:null},"N/A"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"mailto:tc@cskefu.com"},"tc@cskefu.com")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://www.cskefu.com/2023/09/13/tc-coord/"},"\u6625\u677e\u5ba2\u670d\u6280\u672f\u59d4\u5458\u4f1a\u534f\u4f5c\u4f53\u7cfb"))))))}u.isMDXComponent=!0},88638:(t,e,n)=>{n.d(e,{Z:()=>a});const a=n.p+"assets/images/Pasted image 20230913134502-44d5145a001aa48136c9cc30a617f888.png"},57873:(t,e,n)=>{n.d(e,{Z:()=>a});const a=n.p+"assets/images/Pasted image 20230913134529-f824d57d1f87b28a9ea7a8f7aea9fef7.png"}}]); \ No newline at end of file diff --git a/assets/js/d193fcd8.088485fd.js b/assets/js/d193fcd8.088485fd.js deleted file mode 100644 index 0138ac7e..00000000 --- a/assets/js/d193fcd8.088485fd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcskefu_docs=self.webpackChunkcskefu_docs||[]).push([[9682],{67816:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"v8","label":"v8","banner":null,"badge":true,"noIndex":false,"className":"docs-version-v8","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"\u6625\u677e\u5ba2\u670d","href":"/cskefu-docs/docs/","docId":"index"},{"type":"link","label":"\u5e94\u7528\u90e8\u7f72","href":"/cskefu-docs/docs/deploy","docId":"deploy"},{"type":"link","label":"\u7cfb\u7edf\u521d\u59cb\u5316","href":"/cskefu-docs/docs/initialization","docId":"initialization"},{"type":"link","label":"\u4f7f\u7528\u6388\u6743","href":"/cskefu-docs/docs/licenses","docId":"licenses"},{"type":"category","label":"\u5f00\u6e90\u793e\u533a","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u5f00\u6e90\u8bb8\u53ef\u534f\u8bae","href":"/cskefu-docs/docs/osc/license","docId":"osc/license"},{"type":"link","label":"\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005","href":"/cskefu-docs/docs/osc/devonboard","docId":"osc/devonboard"},{"type":"link","label":"\u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802","href":"/cskefu-docs/docs/osc/training","docId":"osc/training"},{"type":"link","label":"\u63d0\u4ea4\u4ee3\u7801","href":"/cskefu-docs/docs/osc/contribution","docId":"osc/contribution"},{"type":"link","label":"\u5f00\u53d1\u73af\u5883\u642d\u5efa","href":"/cskefu-docs/docs/osc/engineering","docId":"osc/engineering"},{"type":"link","label":"IDE \u4f7f\u7528\u4e4b Eclipse IDE","href":"/cskefu-docs/docs/osc/ide_eclipse","docId":"osc/ide_eclipse"},{"type":"link","label":"IDE \u4f7f\u7528\u4e4b IntelliJ IDEA","href":"/cskefu-docs/docs/osc/ide_intelij_idea","docId":"osc/ide_intelij_idea"},{"type":"link","label":"IDE \u4f7f\u7528\u4e4b Visual Studio Code","href":"/cskefu-docs/docs/osc/ide_vscode","docId":"osc/ide_vscode"},{"type":"link","label":"\u7cfb\u7edf\u7ef4\u62a4","href":"/cskefu-docs/docs/osc/maintainence","docId":"osc/maintainence"},{"type":"link","label":"REST APIs","href":"/cskefu-docs/docs/osc/restapi","docId":"osc/restapi"}],"href":"/cskefu-docs/docs/osc/"},{"type":"link","label":"\u8d26\u53f7\u548c\u6743\u9650","href":"/cskefu-docs/docs/accounting","docId":"accounting"},{"type":"link","label":"\u5750\u5e2d\u5de5\u4f5c\u53f0","href":"/cskefu-docs/docs/work","docId":"work"},{"type":"category","label":"\u6e20\u9053\u7ba1\u7406","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Messenger \u6e20\u9053","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Messenger \u6e20\u9053\u914d\u7f6e","href":"/cskefu-docs/docs/channels/messenger/install","docId":"channels/messenger/install"},{"type":"link","label":"Facebook OTN \u4e3b\u52a8\u63a8\u9001\u6307\u5357","href":"/cskefu-docs/docs/channels/messenger/facebook-otn","docId":"channels/messenger/facebook-otn"},{"type":"link","label":"Messenger \u6e20\u9053\u914d\u7f6e\u673a\u5668\u4eba\u5ba2\u670d","href":"/cskefu-docs/docs/channels/messenger/messenger-chatbot","docId":"channels/messenger/messenger-chatbot"},{"type":"link","label":"Messenger \u7ba1\u7406\u673a\u5668\u4eba\u5ba2\u670d\u5bf9\u8bdd","href":"/cskefu-docs/docs/channels/messenger/message-types","docId":"channels/messenger/message-types"}],"href":"/cskefu-docs/docs/channels/messenger/"},{"type":"link","label":"\u7f51\u9875\u6e20\u9053","href":"/cskefu-docs/docs/channels/webim","docId":"channels/webim"}],"href":"/cskefu-docs/docs/channels/"},{"type":"link","label":"\u5ba2\u6237\u5173\u7cfb\u7ba1\u7406","href":"/cskefu-docs/docs/crm","docId":"crm"},{"type":"link","label":"\u5750\u5e2d\u76d1\u63a7","href":"/cskefu-docs/docs/monitoring","docId":"monitoring"},{"type":"category","label":"\u673a\u5668\u4eba\u5ba2\u670d","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u5b89\u88c5\u914d\u7f6e","href":"/cskefu-docs/docs/work-chatbot/install","docId":"work-chatbot/install"},{"type":"link","label":"\u96c6\u6210\u673a\u5668\u4eba\u5ba2\u670d","href":"/cskefu-docs/docs/work-chatbot/bot-agent","docId":"work-chatbot/bot-agent"},{"type":"link","label":"\u6d88\u606f\u7c7b\u578b","href":"/cskefu-docs/docs/work-chatbot/message-types","docId":"work-chatbot/message-types"}],"href":"/cskefu-docs/docs/work-chatbot/"},{"type":"link","label":"\u4f1a\u8bdd\u5386\u53f2","href":"/cskefu-docs/docs/reports","docId":"reports"},{"type":"link","label":"\u8bbf\u95ee\u7edf\u8ba1","href":"/cskefu-docs/docs/usage","docId":"usage"},{"type":"link","label":"\u670d\u52a1\u6c34\u5e73\u534f\u8bae","href":"/cskefu-docs/docs/sla","docId":"sla"},{"type":"link","label":"FAQ","href":"/cskefu-docs/docs/faq","docId":"faq"}]},"docs":{"accounting":{"id":"accounting","title":"\u8d26\u53f7\u548c\u6743\u9650","description":"\u7cfb\u7edf\u7ba1\u7406\u5458","sidebar":"tutorialSidebar"},"channels/index":{"id":"channels/index","title":"\u6e20\u9053\u7ba1\u7406","description":"\u6982\u8ff0","sidebar":"tutorialSidebar"},"channels/messenger/facebook-otn":{"id":"channels/messenger/facebook-otn","title":"Facebook OTN \u4e3b\u52a8\u63a8\u9001\u6307\u5357","description":"\u4ec0\u4e48\u662f OTN \u6d88\u606f","sidebar":"tutorialSidebar"},"channels/messenger/index":{"id":"channels/messenger/index","title":"Messenger \u6e20\u9053","description":"Facebook Messenger","sidebar":"tutorialSidebar"},"channels/messenger/install":{"id":"channels/messenger/install","title":"Messenger \u6e20\u9053\u914d\u7f6e","description":"\u524d\u63d0\u51c6\u5907","sidebar":"tutorialSidebar"},"channels/messenger/message-types":{"id":"channels/messenger/message-types","title":"Messenger \u7ba1\u7406\u673a\u5668\u4eba\u5ba2\u670d\u5bf9\u8bdd","description":"\u6982\u8ff0","sidebar":"tutorialSidebar"},"channels/messenger/messenger-chatbot":{"id":"channels/messenger/messenger-chatbot","title":"Messenger \u6e20\u9053\u914d\u7f6e\u673a\u5668\u4eba\u5ba2\u670d","description":"\u6982\u8ff0","sidebar":"tutorialSidebar"},"channels/webim":{"id":"channels/webim","title":"\u7f51\u9875\u6e20\u9053","description":"\u6982\u8ff0","sidebar":"tutorialSidebar"},"crm":{"id":"crm","title":"\u5ba2\u6237\u5173\u7cfb\u7ba1\u7406","description":"\u65b0\u5efa\u5ba2\u6237","sidebar":"tutorialSidebar"},"deploy":{"id":"deploy","title":"\u5e94\u7528\u90e8\u7f72","description":"\u6625\u677e\u5ba2\u670d\u9002\u5e94\u5404\u79cd\u90e8\u7f72\u65b9\u5f0f\uff0c\u672c\u6587\u4f7f\u7528 Docker \u548c Docker compose \u7684\u65b9\u5f0f\uff0c\u9002\u5408\u4f53\u9a8c\u3001\u5f00\u53d1\u3001\u6d4b\u8bd5\u548c\u4e0a\u7ebf\u6625\u677e\u5ba2\u670d\uff0c\u6b64\u79cd\u65b9\u5f0f\u7b80\u5355\u5feb\u6377\u3002","sidebar":"tutorialSidebar"},"faq":{"id":"faq","title":"FAQ","description":"\u4ee5\u4e0b\u603b\u7ed3\u6625\u677e\u5ba2\u670d\u7684\u5927\u5bb6\u5173\u5fc3\u7684\u5e38\u95ee\u95ee\u9898\uff0c\u662f\u57fa\u4e8e\u4f01\u4e1a\u5ba2\u6237/\u5f00\u53d1\u8005\u7684\u54a8\u8be2\u6574\u7406\u800c\u6765\u3002","sidebar":"tutorialSidebar"},"index":{"id":"index","title":"\u6625\u677e\u5ba2\u670d","description":"https://www.cskefu.com","sidebar":"tutorialSidebar"},"initialization":{"id":"initialization","title":"\u7cfb\u7edf\u521d\u59cb\u5316","description":"\u5b8c\u6210\u90e8\u7f72\u6625\u677e\u5ba2\u670d\u5b9e\u4f8b\u540e\uff0c\u8fd8\u9700\u8981\u9488\u5bf9\u4f01\u4e1a\u7684\u7ec4\u7ec7\u67b6\u6784\u548c\u5ba2\u670d\u5750\u5e2d\u8fdb\u884c\u914d\u7f6e\u624d\u80fd\u4f7f\u7528\u3002\u8bf7\u8ba4\u771f\u9605\u8bfb\u672c\u9875\u5185\u7684\u5185\u5bb9\uff0c\u5c24\u5176\u662f\u3010\u5e38\u89c1\u95ee\u9898\u3011\u4e00\u8282\u3002 \u8fd9\u6837\u53ef\u4ee5\u8282\u7ea6\u60a8\u7684\u5b9d\u8d35\u65f6\u95f4\uff01","sidebar":"tutorialSidebar"},"licenses":{"id":"licenses","title":"\u4f7f\u7528\u6388\u6743","description":"\u6625\u677e\u5ba2\u670d\u4ee5\u3010\u4f7f\u7528\u6388\u6743\u8bc1\u4e66\u3011\u7684\u5f62\u5f0f\u6536\u53d6\u670d\u52a1\u8d39\u7528\u3002\u6625\u677e\u5ba2\u670d\u5185\u7f6e\u514d\u8d39\u7684\u53ef\u7528\u7684\u8d44\u6e90\uff0c\u8d60\u9001\u8fd9\u4e9b\u8d44\u6e90\u662f\u4e3a\u4e86\u5e2e\u52a9\u4f01\u4e1a\u7528\u6237\u4f53\u9a8c\u6625\u677e\u5ba2\u670d\u3002","sidebar":"tutorialSidebar"},"monitoring":{"id":"monitoring","title":"\u5750\u5e2d\u76d1\u63a7","description":"\u67e5\u770b\u5386\u53f2\u4f1a\u8bdd","sidebar":"tutorialSidebar"},"osc/contribution":{"id":"osc/contribution","title":"\u63d0\u4ea4\u4ee3\u7801","description":"\u672c\u6587\u6863\u7684\u4f5c\u7528\uff1a\u8be6\u7ec6\u7684\u8bf4\u660e\u5982\u4f55\u63d0\u4ea4\u4ee3\u7801\u5230\u6625\u677e\u5ba2\u670d\u3002","sidebar":"tutorialSidebar"},"osc/devonboard":{"id":"osc/devonboard","title":"\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005","description":"\u5f53\u60a8\u6709\u8f6f\u4ef6\u5f00\u53d1\u6280\u80fd\uff0c\u5728\u60a8\u52a0\u5165\u6625\u677e\u5ba2\u670d\u98de\u4e66\u7fa4\u540e\uff0c\u63a5\u4e0b\u6765\u600e\u4e48\u53c2\u4e0e\u6625\u677e\u5ba2\u670d\u793e\u533a\u5efa\u8bbe\u5462\uff1f\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005\uff01","sidebar":"tutorialSidebar"},"osc/engineering":{"id":"osc/engineering","title":"\u5f00\u53d1\u73af\u5883\u642d\u5efa","description":"\u672c\u6587\u4ecb\u7ecd\u5982\u4f55\u5b8c\u6210\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u73af\u5883\u7684\u642d\u5efa\uff0c\u9762\u5411\u4f01\u4e1a/\u5f00\u53d1\u8005\u63d0\u4f9b\u5173\u4e8e\u6625\u677e\u5ba2\u670d\u4e8c\u6b21\u5f00\u53d1\u7684\u76f8\u5173\u77e5\u8bc6\uff0c\u4ece\u5165\u95e8\u5230\u638c\u63e1\u5168\u90e8\u5f00\u53d1\u6280\u80fd\u8bf7\u5b66\u4e60\u300a\u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802\u300b\u3002","sidebar":"tutorialSidebar"},"osc/ide_eclipse":{"id":"osc/ide_eclipse","title":"IDE \u4f7f\u7528\u4e4b Eclipse IDE","description":"\u5b89\u88c5\u548c\u4e0b\u8f7d Eclipse","sidebar":"tutorialSidebar"},"osc/ide_intelij_idea":{"id":"osc/ide_intelij_idea","title":"IDE \u4f7f\u7528\u4e4b IntelliJ IDEA","description":"\u6625\u677e\u5ba2\u670d\u56e2\u961f\u4f7f\u7528 IntelliJ IDEA \u4f5c\u4e3a\u96c6\u6210\u5f00\u53d1\u73af\u5883\uff0c\u5b83\u56e0\u4e3a\u66f4\u52a0\u667a\u80fd\u800c\u5927\u5e45\u63d0\u5347\u4e86\u5f00\u53d1\u8005\u7684\u5de5\u4f5c\u6548\u7387\uff0c\u6211\u4eec\u4e5f\u5f3a\u70c8\u63a8\u8350 Java \u5f00\u53d1\u8005\u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u3002\u672c\u6587\u4f7f\u7528IntelliJ IDEA\u4ecb\u7ecd\u642d\u5efa\u8fc7\u7a0b\u3002","sidebar":"tutorialSidebar"},"osc/ide_vscode":{"id":"osc/ide_vscode","title":"IDE \u4f7f\u7528\u4e4b Visual Studio Code","description":"\u6625\u677e\u5ba2\u670d\u56e2\u961f\u4f7f\u7528 Visual Studio Code \u4f5c\u4e3a\u96c6\u6210\u5f00\u53d1\u73af\u5883\uff0c\u5b83\u56e0\u4e3a\u66f4\u52a0\u667a\u80fd\u800c\u5927\u5e45\u63d0\u5347\u4e86\u5f00\u53d1\u8005\u7684\u5de5\u4f5c\u6548\u7387\uff0c\u76f8\u6bd4\u4e8e IntelliJ IDEA, VSCode \u514d\u8d39\u5e76\u4e14\u6709\u5927\u91cf\u63d2\u4ef6\u652f\u6301\u3002\u672c\u6587\u4f7f\u7528 Visual Studio Code \u4ecb\u7ecd\u642d\u5efa\u8fc7\u7a0b\u3002","sidebar":"tutorialSidebar"},"osc/index":{"id":"osc/index","title":"\u5f00\u6e90\u793e\u533a","description":"GitHub Stargazers GitHub Forks License GitHub Issues GitHub Issues Closed docker","sidebar":"tutorialSidebar"},"osc/license":{"id":"osc/license","title":"\u5f00\u6e90\u8bb8\u53ef\u534f\u8bae","description":"\u6625\u677e\u5ba2\u670d\u4f7f\u7528\u300a\u6625\u677e\u8bb8\u53ef\u8bc1 v1.0 \u300b","sidebar":"tutorialSidebar"},"osc/maintainence":{"id":"osc/maintainence","title":"\u7cfb\u7edf\u7ef4\u62a4","description":"\u4ee5\u4e0b\u6587\u6863\u57fa\u4e8e\u300a\u6625\u677e\u5ba2\u670d\u79c1\u6709\u90e8\u7f72\u300b\u6587\u6863\u90e8\u7f72\u7684\u6848\u4f8b\uff0c\u8fdb\u884c\u8fd0\u7ef4\u7ba1\u7406\u3002","sidebar":"tutorialSidebar"},"osc/restapi":{"id":"osc/restapi","title":"REST APIs","description":"\u6625\u677e\u5ba2\u670d\u76ee\u524d\u5177\u5907 30 \u4f59\u4e2a RESTful API \u63a5\u53e3\uff0c\u5305\u62ec\u8054\u7cfb\u4eba\u7ba1\u7406\uff0c\u6388\u6743\uff0c\u83b7\u5f97\u8bbf\u5ba2\u4f1a\u8bdd\u5217\u8868\u7b49\uff0c\u65b9\u4fbf\u4f01\u4e1a/\u5f00\u53d1\u8005\u4ece\u4e0d\u540c\u7cfb\u7edf\u4e2d\u96c6\u6210\u6625\u677e\u5ba2\u670d\u3002","sidebar":"tutorialSidebar"},"osc/training":{"id":"osc/training","title":"\u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802","description":"\ud83d\ude09 \u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802\uff0c\u9762\u5411\u5f00\u53d1\u8005\u3001\u8f6f\u4ef6\u5de5\u7a0b\u5e08\u53ca\u8fd0\u7ef4\u4eba\u5458\u7684\u5728\u7ebf\u8bfe\u7a0b\uff08\u89c6\u9891\u53ca\u8bfe\u4ef6\uff09\u3002","sidebar":"tutorialSidebar"},"reports":{"id":"reports","title":"\u4f1a\u8bdd\u5386\u53f2","description":"\u4f1a\u8bdd\u5386\u53f2\u4f5c\u4e3a\u5ba2\u670d\u4e3b\u7ba1\u7684\u8fd0\u8425\u5de5\u5177\uff0c\u4e3b\u8981\u5c55\u793a\u5ba2\u670d\u4e1a\u52a1\u7684\u6570\u636e\u548c\u62a5\u8868\uff0c\u540c\u65f6\u4e5f\u6709\u4e00\u4e9b\u6570\u636e\u662f\u5b9e\u65f6\u7684\uff0c\u6216\u901a\u8fc7\u65f6\u95f4\u9009\u62e9\u5668\u81ea\u5b9a\u4e49\u65f6\u95f4\u6bb5\uff0c\u5f62\u6210\u6570\u636e\u5206\u6790\u548c\u6c47\u603b\u3002\u5728\u89d2\u8272\u4e2d\uff0c\u53ef\u4ee5\u914d\u7f6e\u6743\u9650\uff0c\u6307\u5b9a\u767b\u5f55\u7528\u6237\u7684\u8bbf\u95ee\u3010\u4f1a\u8bdd\u5386\u53f2\u3011\u7684\u6743\u9650\u3002","sidebar":"tutorialSidebar"},"sla":{"id":"sla","title":"\u670d\u52a1\u6c34\u5e73\u534f\u8bae","description":"\u5317\u4eac\u534e\u590f\u6625\u677e\u79d1\u6280\u6709\u9650\u516c\u53f8\uff08\u4ee5\u4e0b\u7b80\u79f0\u2018\u534e\u590f\u6625\u677e\u2019\uff09\u63d0\u4f9b\u56f4\u7ed5\u6625\u677e\u5ba2\u670d\u7684\u5546\u4e1a\u5316\u670d\u52a1\uff0c\u5305\u62ec\u7cfb\u7edf\u7ef4\u62a4\u3001\u90e8\u7f72\u3001\u5b9a\u5236\u5316\u5f00\u53d1\u3001\u9ad8\u7ea7\u63d2\u4ef6\u548c\u4e91\u670d\u52a1\u7b49\u3002","sidebar":"tutorialSidebar"},"usage":{"id":"usage","title":"\u8bbf\u95ee\u7edf\u8ba1","description":"\u9875\u9762\u7edf\u8ba1\u662f\u9488\u5bf9\u5750\u5e2d\u63a7\u5236\u53f0\u7684 Web \u9875\u9762\u7684\u4f7f\u7528\u60c5\u51b5\u8fdb\u884c\u7edf\u8ba1\uff0c\u6309\u7167\u9875\u9762\u6253\u5f00\u6b21\u6570\u3001\u767b\u5f55\u5730\u5740\u548c\u5165\u53e3\u9875\u9762\u7b49\u5185\u5bb9\u8fdb\u884c\u8ba1\u6570\u3002\u76ee\u524d\u53ea\u652f\u6301\u63a5\u5165\u767e\u5ea6\u7edf\u8ba1\uff0c\u8bf7\u6ce8\u518c\u767e\u5ea6\u7edf\u8ba1\u5e10\u53f7\u3010\u767e\u5ea6\u7edf\u8ba1-\u7ad9\u957f\u7248\u3011\u4f7f\u7528\u3002","sidebar":"tutorialSidebar"},"work":{"id":"work","title":"\u5750\u5e2d\u5de5\u4f5c\u53f0","description":"\u5750\u5e2d\u5de5\u4f5c\u53f0\uff0c\u662f\u5750\u5e2d\u4eba\u5458\u670d\u52a1\u8bbf\u5ba2\u7684\u4e3b\u8981\u5de5\u5177\uff0c\u5728\u5de6\u4fa7\u5bfc\u822a\u83dc\u5355\u53ef\u8fdb\u5165\u5750\u5e2d\u5de5\u4f5c\u53f0\u9875\u9762\u3002\u8fdb\u5165\u5750\u5e2d\u5de5\u4f5c\u53f0\u540e\uff0c\u5ba2\u670d\u4eba\u5458\u53ef\u67e5\u770b\u670d\u52a1\u4e2d\u3001\u6392\u961f\u7684\u8bbf\u5ba2\uff0c\u548c\u8bbf\u5ba2\u4ea4\u8c08\u7b49\u3002","sidebar":"tutorialSidebar"},"work-chatbot/bot-agent":{"id":"work-chatbot/bot-agent","title":"\u96c6\u6210\u673a\u5668\u4eba\u5ba2\u670d","description":"\u521b\u5efa\u804a\u5929\u673a\u5668\u4eba","sidebar":"tutorialSidebar"},"work-chatbot/index":{"id":"work-chatbot/index","title":"\u673a\u5668\u4eba\u5ba2\u670d","description":"\u75db\u70b9","sidebar":"tutorialSidebar"},"work-chatbot/install":{"id":"work-chatbot/install","title":"\u5b89\u88c5\u914d\u7f6e","description":"\u673a\u5668\u4eba\u5ba2\u670d","sidebar":"tutorialSidebar"},"work-chatbot/message-types":{"id":"work-chatbot/message-types","title":"\u6d88\u606f\u7c7b\u578b","description":"\u4e0d\u540c\u6d88\u606f\u7c7b\u578b\uff0c\u589e\u5f3a\u4e86\u7528\u6237\u4f53\u9a8c\u3002","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/d193fcd8.bce27abf.js b/assets/js/d193fcd8.bce27abf.js new file mode 100644 index 00000000..f7bfbf7e --- /dev/null +++ b/assets/js/d193fcd8.bce27abf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcskefu_docs=self.webpackChunkcskefu_docs||[]).push([[9682],{67816:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"v8","label":"v8","banner":null,"badge":true,"noIndex":false,"className":"docs-version-v8","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"\u6625\u677e\u5ba2\u670d","href":"/cskefu-docs/docs/","docId":"index"},{"type":"link","label":"\u5e94\u7528\u90e8\u7f72","href":"/cskefu-docs/docs/deploy","docId":"deploy"},{"type":"link","label":"\u7cfb\u7edf\u521d\u59cb\u5316","href":"/cskefu-docs/docs/initialization","docId":"initialization"},{"type":"link","label":"\u4f7f\u7528\u6388\u6743","href":"/cskefu-docs/docs/licenses","docId":"licenses"},{"type":"category","label":"\u5f00\u6e90\u793e\u533a","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u5f00\u6e90\u8bb8\u53ef\u534f\u8bae","href":"/cskefu-docs/docs/osc/license","docId":"osc/license"},{"type":"link","label":"\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005","href":"/cskefu-docs/docs/osc/devonboard","docId":"osc/devonboard"},{"type":"link","label":"\u5b9a\u5236\u5f00\u53d1\u6559\u7a0b","href":"/cskefu-docs/docs/osc/training","docId":"osc/training"},{"type":"link","label":"\u63d0\u4ea4\u4ee3\u7801","href":"/cskefu-docs/docs/osc/contribution","docId":"osc/contribution"},{"type":"link","label":"\u5f00\u53d1\u73af\u5883\u642d\u5efa","href":"/cskefu-docs/docs/osc/engineering","docId":"osc/engineering"},{"type":"link","label":"IDE \u4f7f\u7528\u4e4b Eclipse IDE","href":"/cskefu-docs/docs/osc/ide_eclipse","docId":"osc/ide_eclipse"},{"type":"link","label":"IDE \u4f7f\u7528\u4e4b IntelliJ IDEA","href":"/cskefu-docs/docs/osc/ide_intelij_idea","docId":"osc/ide_intelij_idea"},{"type":"link","label":"IDE \u4f7f\u7528\u4e4b Visual Studio Code","href":"/cskefu-docs/docs/osc/ide_vscode","docId":"osc/ide_vscode"},{"type":"link","label":"\u7cfb\u7edf\u7ef4\u62a4","href":"/cskefu-docs/docs/osc/maintainence","docId":"osc/maintainence"},{"type":"link","label":"REST APIs","href":"/cskefu-docs/docs/osc/restapi","docId":"osc/restapi"}],"href":"/cskefu-docs/docs/osc/"},{"type":"link","label":"\u8d26\u53f7\u548c\u6743\u9650","href":"/cskefu-docs/docs/accounting","docId":"accounting"},{"type":"link","label":"\u5750\u5e2d\u5de5\u4f5c\u53f0","href":"/cskefu-docs/docs/work","docId":"work"},{"type":"category","label":"\u6e20\u9053\u7ba1\u7406","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Messenger \u6e20\u9053","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Messenger \u6e20\u9053\u914d\u7f6e","href":"/cskefu-docs/docs/channels/messenger/install","docId":"channels/messenger/install"},{"type":"link","label":"Facebook OTN \u4e3b\u52a8\u63a8\u9001\u6307\u5357","href":"/cskefu-docs/docs/channels/messenger/facebook-otn","docId":"channels/messenger/facebook-otn"},{"type":"link","label":"Messenger \u6e20\u9053\u914d\u7f6e\u673a\u5668\u4eba\u5ba2\u670d","href":"/cskefu-docs/docs/channels/messenger/messenger-chatbot","docId":"channels/messenger/messenger-chatbot"},{"type":"link","label":"Messenger \u7ba1\u7406\u673a\u5668\u4eba\u5ba2\u670d\u5bf9\u8bdd","href":"/cskefu-docs/docs/channels/messenger/message-types","docId":"channels/messenger/message-types"}],"href":"/cskefu-docs/docs/channels/messenger/"},{"type":"link","label":"\u7f51\u9875\u6e20\u9053","href":"/cskefu-docs/docs/channels/webim","docId":"channels/webim"}],"href":"/cskefu-docs/docs/channels/"},{"type":"link","label":"\u5ba2\u6237\u5173\u7cfb\u7ba1\u7406","href":"/cskefu-docs/docs/crm","docId":"crm"},{"type":"link","label":"\u5750\u5e2d\u76d1\u63a7","href":"/cskefu-docs/docs/monitoring","docId":"monitoring"},{"type":"category","label":"\u673a\u5668\u4eba\u5ba2\u670d","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u5b89\u88c5\u914d\u7f6e","href":"/cskefu-docs/docs/work-chatbot/install","docId":"work-chatbot/install"},{"type":"link","label":"\u96c6\u6210\u673a\u5668\u4eba\u5ba2\u670d","href":"/cskefu-docs/docs/work-chatbot/bot-agent","docId":"work-chatbot/bot-agent"},{"type":"link","label":"\u6d88\u606f\u7c7b\u578b","href":"/cskefu-docs/docs/work-chatbot/message-types","docId":"work-chatbot/message-types"}],"href":"/cskefu-docs/docs/work-chatbot/"},{"type":"link","label":"\u4f1a\u8bdd\u5386\u53f2","href":"/cskefu-docs/docs/reports","docId":"reports"},{"type":"link","label":"\u8bbf\u95ee\u7edf\u8ba1","href":"/cskefu-docs/docs/usage","docId":"usage"},{"type":"link","label":"\u670d\u52a1\u6c34\u5e73\u534f\u8bae","href":"/cskefu-docs/docs/sla","docId":"sla"},{"type":"link","label":"FAQ","href":"/cskefu-docs/docs/faq","docId":"faq"}]},"docs":{"accounting":{"id":"accounting","title":"\u8d26\u53f7\u548c\u6743\u9650","description":"\u7cfb\u7edf\u7ba1\u7406\u5458","sidebar":"tutorialSidebar"},"channels/index":{"id":"channels/index","title":"\u6e20\u9053\u7ba1\u7406","description":"\u6982\u8ff0","sidebar":"tutorialSidebar"},"channels/messenger/facebook-otn":{"id":"channels/messenger/facebook-otn","title":"Facebook OTN \u4e3b\u52a8\u63a8\u9001\u6307\u5357","description":"\u4ec0\u4e48\u662f OTN \u6d88\u606f","sidebar":"tutorialSidebar"},"channels/messenger/index":{"id":"channels/messenger/index","title":"Messenger \u6e20\u9053","description":"Facebook Messenger","sidebar":"tutorialSidebar"},"channels/messenger/install":{"id":"channels/messenger/install","title":"Messenger \u6e20\u9053\u914d\u7f6e","description":"\u524d\u63d0\u51c6\u5907","sidebar":"tutorialSidebar"},"channels/messenger/message-types":{"id":"channels/messenger/message-types","title":"Messenger \u7ba1\u7406\u673a\u5668\u4eba\u5ba2\u670d\u5bf9\u8bdd","description":"\u6982\u8ff0","sidebar":"tutorialSidebar"},"channels/messenger/messenger-chatbot":{"id":"channels/messenger/messenger-chatbot","title":"Messenger \u6e20\u9053\u914d\u7f6e\u673a\u5668\u4eba\u5ba2\u670d","description":"\u6982\u8ff0","sidebar":"tutorialSidebar"},"channels/webim":{"id":"channels/webim","title":"\u7f51\u9875\u6e20\u9053","description":"\u6982\u8ff0","sidebar":"tutorialSidebar"},"crm":{"id":"crm","title":"\u5ba2\u6237\u5173\u7cfb\u7ba1\u7406","description":"\u65b0\u5efa\u5ba2\u6237","sidebar":"tutorialSidebar"},"deploy":{"id":"deploy","title":"\u5e94\u7528\u90e8\u7f72","description":"\u6625\u677e\u5ba2\u670d\u9002\u5e94\u5404\u79cd\u90e8\u7f72\u65b9\u5f0f\uff0c\u672c\u6587\u4f7f\u7528 Docker \u548c Docker compose \u7684\u65b9\u5f0f\uff0c\u9002\u5408\u4f53\u9a8c\u3001\u5f00\u53d1\u3001\u6d4b\u8bd5\u548c\u4e0a\u7ebf\u6625\u677e\u5ba2\u670d\uff0c\u6b64\u79cd\u65b9\u5f0f\u7b80\u5355\u5feb\u6377\u3002","sidebar":"tutorialSidebar"},"faq":{"id":"faq","title":"FAQ","description":"\u4ee5\u4e0b\u603b\u7ed3\u6625\u677e\u5ba2\u670d\u7684\u5927\u5bb6\u5173\u5fc3\u7684\u5e38\u95ee\u95ee\u9898\uff0c\u662f\u57fa\u4e8e\u4f01\u4e1a\u5ba2\u6237/\u5f00\u53d1\u8005\u7684\u54a8\u8be2\u6574\u7406\u800c\u6765\u3002","sidebar":"tutorialSidebar"},"index":{"id":"index","title":"\u6625\u677e\u5ba2\u670d","description":"https://www.cskefu.com","sidebar":"tutorialSidebar"},"initialization":{"id":"initialization","title":"\u7cfb\u7edf\u521d\u59cb\u5316","description":"\u5b8c\u6210\u90e8\u7f72\u6625\u677e\u5ba2\u670d\u5b9e\u4f8b\u540e\uff0c\u8fd8\u9700\u8981\u9488\u5bf9\u4f01\u4e1a\u7684\u7ec4\u7ec7\u67b6\u6784\u548c\u5ba2\u670d\u5750\u5e2d\u8fdb\u884c\u914d\u7f6e\u624d\u80fd\u4f7f\u7528\u3002\u8bf7\u8ba4\u771f\u9605\u8bfb\u672c\u9875\u5185\u7684\u5185\u5bb9\uff0c\u5c24\u5176\u662f\u3010\u5e38\u89c1\u95ee\u9898\u3011\u4e00\u8282\u3002 \u8fd9\u6837\u53ef\u4ee5\u8282\u7ea6\u60a8\u7684\u5b9d\u8d35\u65f6\u95f4\uff01","sidebar":"tutorialSidebar"},"licenses":{"id":"licenses","title":"\u4f7f\u7528\u6388\u6743","description":"\u6625\u677e\u5ba2\u670d\u4ee5\u3010\u4f7f\u7528\u6388\u6743\u8bc1\u4e66\u3011\u7684\u5f62\u5f0f\u6536\u53d6\u670d\u52a1\u8d39\u7528\u3002\u6625\u677e\u5ba2\u670d\u5185\u7f6e\u514d\u8d39\u7684\u53ef\u7528\u7684\u8d44\u6e90\uff0c\u8d60\u9001\u8fd9\u4e9b\u8d44\u6e90\u662f\u4e3a\u4e86\u5e2e\u52a9\u4f01\u4e1a\u7528\u6237\u4f53\u9a8c\u6625\u677e\u5ba2\u670d\u3002","sidebar":"tutorialSidebar"},"monitoring":{"id":"monitoring","title":"\u5750\u5e2d\u76d1\u63a7","description":"\u67e5\u770b\u5386\u53f2\u4f1a\u8bdd","sidebar":"tutorialSidebar"},"osc/contribution":{"id":"osc/contribution","title":"\u63d0\u4ea4\u4ee3\u7801","description":"\u672c\u6587\u6863\u7684\u4f5c\u7528\uff1a\u8be6\u7ec6\u7684\u8bf4\u660e\u5982\u4f55\u63d0\u4ea4\u4ee3\u7801\u5230\u6625\u677e\u5ba2\u670d\u3002","sidebar":"tutorialSidebar"},"osc/devonboard":{"id":"osc/devonboard","title":"\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005","description":"\u5f53\u60a8\u6709\u8f6f\u4ef6\u5f00\u53d1\u6280\u80fd\uff0c\u5728\u60a8\u52a0\u5165\u6625\u677e\u5ba2\u670d\u98de\u4e66\u7fa4\u540e\uff0c\u63a5\u4e0b\u6765\u600e\u4e48\u53c2\u4e0e\u6625\u677e\u5ba2\u670d\u793e\u533a\u5efa\u8bbe\u5462\uff1f\u6210\u4e3a\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u8005\uff01","sidebar":"tutorialSidebar"},"osc/engineering":{"id":"osc/engineering","title":"\u5f00\u53d1\u73af\u5883\u642d\u5efa","description":"\u672c\u6587\u4ecb\u7ecd\u5982\u4f55\u5b8c\u6210\u6625\u677e\u5ba2\u670d\u5f00\u53d1\u73af\u5883\u7684\u642d\u5efa\uff0c\u9762\u5411\u4f01\u4e1a/\u5f00\u53d1\u8005\u63d0\u4f9b\u5173\u4e8e\u6625\u677e\u5ba2\u670d\u4e8c\u6b21\u5f00\u53d1\u7684\u76f8\u5173\u77e5\u8bc6\uff0c\u4ece\u5165\u95e8\u5230\u638c\u63e1\u5168\u90e8\u5f00\u53d1\u6280\u80fd\u8bf7\u5b66\u4e60\u300a\u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802\u300b\u3002","sidebar":"tutorialSidebar"},"osc/ide_eclipse":{"id":"osc/ide_eclipse","title":"IDE \u4f7f\u7528\u4e4b Eclipse IDE","description":"\u5b89\u88c5\u548c\u4e0b\u8f7d Eclipse","sidebar":"tutorialSidebar"},"osc/ide_intelij_idea":{"id":"osc/ide_intelij_idea","title":"IDE \u4f7f\u7528\u4e4b IntelliJ IDEA","description":"\u6625\u677e\u5ba2\u670d\u56e2\u961f\u4f7f\u7528 IntelliJ IDEA \u4f5c\u4e3a\u96c6\u6210\u5f00\u53d1\u73af\u5883\uff0c\u5b83\u56e0\u4e3a\u66f4\u52a0\u667a\u80fd\u800c\u5927\u5e45\u63d0\u5347\u4e86\u5f00\u53d1\u8005\u7684\u5de5\u4f5c\u6548\u7387\uff0c\u6211\u4eec\u4e5f\u5f3a\u70c8\u63a8\u8350 Java \u5f00\u53d1\u8005\u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u3002\u672c\u6587\u4f7f\u7528IntelliJ IDEA\u4ecb\u7ecd\u642d\u5efa\u8fc7\u7a0b\u3002","sidebar":"tutorialSidebar"},"osc/ide_vscode":{"id":"osc/ide_vscode","title":"IDE \u4f7f\u7528\u4e4b Visual Studio Code","description":"\u6625\u677e\u5ba2\u670d\u56e2\u961f\u4f7f\u7528 Visual Studio Code \u4f5c\u4e3a\u96c6\u6210\u5f00\u53d1\u73af\u5883\uff0c\u5b83\u56e0\u4e3a\u66f4\u52a0\u667a\u80fd\u800c\u5927\u5e45\u63d0\u5347\u4e86\u5f00\u53d1\u8005\u7684\u5de5\u4f5c\u6548\u7387\uff0c\u76f8\u6bd4\u4e8e IntelliJ IDEA, VSCode \u514d\u8d39\u5e76\u4e14\u6709\u5927\u91cf\u63d2\u4ef6\u652f\u6301\u3002\u672c\u6587\u4f7f\u7528 Visual Studio Code \u4ecb\u7ecd\u642d\u5efa\u8fc7\u7a0b\u3002","sidebar":"tutorialSidebar"},"osc/index":{"id":"osc/index","title":"\u5f00\u6e90\u793e\u533a","description":"GitHub Stargazers GitHub Forks License GitHub Issues GitHub Issues Closed docker","sidebar":"tutorialSidebar"},"osc/license":{"id":"osc/license","title":"\u5f00\u6e90\u8bb8\u53ef\u534f\u8bae","description":"\u6625\u677e\u5ba2\u670d\u4f7f\u7528\u300a\u6625\u677e\u8bb8\u53ef\u8bc1 v1.0 \u300b","sidebar":"tutorialSidebar"},"osc/maintainence":{"id":"osc/maintainence","title":"\u7cfb\u7edf\u7ef4\u62a4","description":"\u4ee5\u4e0b\u6587\u6863\u57fa\u4e8e\u300a\u6625\u677e\u5ba2\u670d\u79c1\u6709\u90e8\u7f72\u300b\u6587\u6863\u90e8\u7f72\u7684\u6848\u4f8b\uff0c\u8fdb\u884c\u8fd0\u7ef4\u7ba1\u7406\u3002","sidebar":"tutorialSidebar"},"osc/restapi":{"id":"osc/restapi","title":"REST APIs","description":"\u6625\u677e\u5ba2\u670d\u76ee\u524d\u5177\u5907 30 \u4f59\u4e2a RESTful API \u63a5\u53e3\uff0c\u5305\u62ec\u8054\u7cfb\u4eba\u7ba1\u7406\uff0c\u6388\u6743\uff0c\u83b7\u5f97\u8bbf\u5ba2\u4f1a\u8bdd\u5217\u8868\u7b49\uff0c\u65b9\u4fbf\u4f01\u4e1a/\u5f00\u53d1\u8005\u4ece\u4e0d\u540c\u7cfb\u7edf\u4e2d\u96c6\u6210\u6625\u677e\u5ba2\u670d\u3002","sidebar":"tutorialSidebar"},"osc/training":{"id":"osc/training","title":"\u5b9a\u5236\u5f00\u53d1\u6559\u7a0b","description":"\ud83d\ude09 \u6625\u677e\u5ba2\u670d\u5927\u8bb2\u5802\uff0c\u9762\u5411\u5f00\u53d1\u8005\u3001\u8f6f\u4ef6\u5de5\u7a0b\u5e08\u53ca\u8fd0\u7ef4\u4eba\u5458\u7684\u5728\u7ebf\u8bfe\u7a0b\uff08\u89c6\u9891\u53ca\u8bfe\u4ef6\uff09\u3002","sidebar":"tutorialSidebar"},"reports":{"id":"reports","title":"\u4f1a\u8bdd\u5386\u53f2","description":"\u4f1a\u8bdd\u5386\u53f2\u4f5c\u4e3a\u5ba2\u670d\u4e3b\u7ba1\u7684\u8fd0\u8425\u5de5\u5177\uff0c\u4e3b\u8981\u5c55\u793a\u5ba2\u670d\u4e1a\u52a1\u7684\u6570\u636e\u548c\u62a5\u8868\uff0c\u540c\u65f6\u4e5f\u6709\u4e00\u4e9b\u6570\u636e\u662f\u5b9e\u65f6\u7684\uff0c\u6216\u901a\u8fc7\u65f6\u95f4\u9009\u62e9\u5668\u81ea\u5b9a\u4e49\u65f6\u95f4\u6bb5\uff0c\u5f62\u6210\u6570\u636e\u5206\u6790\u548c\u6c47\u603b\u3002\u5728\u89d2\u8272\u4e2d\uff0c\u53ef\u4ee5\u914d\u7f6e\u6743\u9650\uff0c\u6307\u5b9a\u767b\u5f55\u7528\u6237\u7684\u8bbf\u95ee\u3010\u4f1a\u8bdd\u5386\u53f2\u3011\u7684\u6743\u9650\u3002","sidebar":"tutorialSidebar"},"sla":{"id":"sla","title":"\u670d\u52a1\u6c34\u5e73\u534f\u8bae","description":"\u5317\u4eac\u534e\u590f\u6625\u677e\u79d1\u6280\u6709\u9650\u516c\u53f8\uff08\u4ee5\u4e0b\u7b80\u79f0\u2018\u534e\u590f\u6625\u677e\u2019\uff09\u63d0\u4f9b\u56f4\u7ed5\u6625\u677e\u5ba2\u670d\u7684\u5546\u4e1a\u5316\u670d\u52a1\uff0c\u5305\u62ec\u7cfb\u7edf\u7ef4\u62a4\u3001\u90e8\u7f72\u3001\u5b9a\u5236\u5316\u5f00\u53d1\u3001\u9ad8\u7ea7\u63d2\u4ef6\u548c\u4e91\u670d\u52a1\u7b49\u3002","sidebar":"tutorialSidebar"},"usage":{"id":"usage","title":"\u8bbf\u95ee\u7edf\u8ba1","description":"\u9875\u9762\u7edf\u8ba1\u662f\u9488\u5bf9\u5750\u5e2d\u63a7\u5236\u53f0\u7684 Web \u9875\u9762\u7684\u4f7f\u7528\u60c5\u51b5\u8fdb\u884c\u7edf\u8ba1\uff0c\u6309\u7167\u9875\u9762\u6253\u5f00\u6b21\u6570\u3001\u767b\u5f55\u5730\u5740\u548c\u5165\u53e3\u9875\u9762\u7b49\u5185\u5bb9\u8fdb\u884c\u8ba1\u6570\u3002\u76ee\u524d\u53ea\u652f\u6301\u63a5\u5165\u767e\u5ea6\u7edf\u8ba1\uff0c\u8bf7\u6ce8\u518c\u767e\u5ea6\u7edf\u8ba1\u5e10\u53f7\u3010\u767e\u5ea6\u7edf\u8ba1-\u7ad9\u957f\u7248\u3011\u4f7f\u7528\u3002","sidebar":"tutorialSidebar"},"work":{"id":"work","title":"\u5750\u5e2d\u5de5\u4f5c\u53f0","description":"\u5750\u5e2d\u5de5\u4f5c\u53f0\uff0c\u662f\u5750\u5e2d\u4eba\u5458\u670d\u52a1\u8bbf\u5ba2\u7684\u4e3b\u8981\u5de5\u5177\uff0c\u5728\u5de6\u4fa7\u5bfc\u822a\u83dc\u5355\u53ef\u8fdb\u5165\u5750\u5e2d\u5de5\u4f5c\u53f0\u9875\u9762\u3002\u8fdb\u5165\u5750\u5e2d\u5de5\u4f5c\u53f0\u540e\uff0c\u5ba2\u670d\u4eba\u5458\u53ef\u67e5\u770b\u670d\u52a1\u4e2d\u3001\u6392\u961f\u7684\u8bbf\u5ba2\uff0c\u548c\u8bbf\u5ba2\u4ea4\u8c08\u7b49\u3002","sidebar":"tutorialSidebar"},"work-chatbot/bot-agent":{"id":"work-chatbot/bot-agent","title":"\u96c6\u6210\u673a\u5668\u4eba\u5ba2\u670d","description":"\u521b\u5efa\u804a\u5929\u673a\u5668\u4eba","sidebar":"tutorialSidebar"},"work-chatbot/index":{"id":"work-chatbot/index","title":"\u673a\u5668\u4eba\u5ba2\u670d","description":"\u75db\u70b9","sidebar":"tutorialSidebar"},"work-chatbot/install":{"id":"work-chatbot/install","title":"\u5b89\u88c5\u914d\u7f6e","description":"\u673a\u5668\u4eba\u5ba2\u670d","sidebar":"tutorialSidebar"},"work-chatbot/message-types":{"id":"work-chatbot/message-types","title":"\u6d88\u606f\u7c7b\u578b","description":"\u4e0d\u540c\u6d88\u606f\u7c7b\u578b\uff0c\u589e\u5f3a\u4e86\u7528\u6237\u4f53\u9a8c\u3002","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.5ad47fa4.js b/assets/js/runtime~main.672e83a6.js similarity index 96% rename from assets/js/runtime~main.5ad47fa4.js rename to assets/js/runtime~main.672e83a6.js index a0d007ea..897ae00e 100644 --- a/assets/js/runtime~main.5ad47fa4.js +++ b/assets/js/runtime~main.672e83a6.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,f,d,c,t={},r={};function b(e){var a=r[e];if(void 0!==a)return a.exports;var f=r[e]={id:e,loaded:!1,exports:{}};return t[e].call(f.exports,f,f.exports,b),f.loaded=!0,f.exports}b.m=t,b.c=r,e=[],b.O=(a,f,d,c)=>{if(!f){var t=1/0;for(i=0;i=c)&&Object.keys(b.O).every((e=>b.O[e](f[o])))?f.splice(o--,1):(r=!1,c0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[f,d,c]},b.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return b.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,b.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var c=Object.create(null);b.r(c);var t={};a=a||[null,f({}),f([]),f(f)];for(var r=2&d&&e;"object"==typeof r&&!~a.indexOf(r);r=f(r))Object.getOwnPropertyNames(r).forEach((a=>t[a]=()=>e[a]));return t.default=()=>e,b.d(c,t),c},b.d=(e,a)=>{for(var f in a)b.o(a,f)&&!b.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},b.f={},b.e=e=>Promise.all(Object.keys(b.f).reduce(((a,f)=>(b.f[f](e,a),a)),[])),b.u=e=>"assets/js/"+({53:"935f2afb",216:"f2632f45",521:"dda9c7ef",628:"8353cdd5",731:"cf98d1ea",782:"299167b3",842:"3e54041a",1237:"d8344fa6",1242:"356310f5",1407:"976ffcd0",1566:"9e8be0e3",1576:"ab09ee64",2263:"b631a60c",2323:"b234e7ad",2346:"356b3536",2390:"915b4ee0",2534:"0f4e1e3f",2877:"116a8231",2919:"73e12729",2923:"c8615f33",2982:"19c56e27",3056:"db76f809",3067:"21393b29",3085:"1f391b9e",3174:"bb7ce65d",3415:"a777e927",3439:"d04fcd8e",3459:"f0116df7",3472:"abddfe80",3681:"715c4002",4067:"26213e90",4195:"c4f5d8e4",4285:"23660eff",4652:"f1ad6a2c",4692:"ccf656a6",4699:"82b4845f",4846:"18f08221",5067:"ad96de5e",5324:"7457187d",5341:"39fe4428",5362:"0a95bd6a",5428:"d970193f",5565:"da354283",5667:"6840706a",5942:"862a8961",5963:"c74ab4ce",6333:"406716ed",6339:"bae66565",6381:"f18f8de2",6741:"a7feef70",6896:"448b282d",6901:"1a4022fc",6971:"c377a04b",7214:"e9efd9dc",7414:"393be207",7544:"352782a1",7645:"a7434565",7763:"8a17a920",7918:"17896441",8360:"ab1a3060",8644:"266bd6da",8693:"72610070",8738:"4ed120f1",8772:"4ddfe649",8898:"731ef631",8922:"c86ec09f",8993:"c39e551a",9334:"247783bb",9393:"1de50a5b",9463:"49d0e196",9514:"1be78505",9668:"54aa54a0",9682:"d193fcd8",9753:"ec58048c",9892:"f275cf37",9973:"d78d00b2"}[e]||e)+"."+{53:"c10f1f42",216:"aefbb948",521:"15d314cd",628:"e429cb84",731:"896969e8",782:"6a5e239f",842:"9735587a",1237:"3dc34a54",1242:"de840253",1407:"4cffc50b",1566:"d68036d0",1576:"ebdf3724",2263:"30834e59",2323:"ed187d5a",2346:"2bb02fd6",2390:"dc8d12d0",2534:"7c652ddd",2877:"86d5a261",2919:"368f8e0b",2923:"2a4104f6",2982:"e5c58a23",3056:"495d1f6d",3067:"d53a3d28",3085:"2349095d",3174:"36694924",3415:"50724927",3439:"273a8b25",3459:"b5c92fcc",3472:"63ed825a",3681:"a534adde",4067:"53e34f0b",4195:"40eceaaa",4285:"31f0f6aa",4652:"d8871e75",4692:"b0b7e1ac",4699:"e6a3f07d",4846:"40cbae13",4972:"ba3f73f2",5067:"7a3d11c6",5324:"06150b69",5341:"f0c1fd1e",5362:"90ca60b3",5428:"3dc77dd4",5565:"121b03ab",5667:"23fc95ca",5942:"8dcce80b",5963:"2890f8ca",6333:"a17803a9",6339:"e6c97703",6381:"e6c1b43a",6741:"5e540c89",6896:"30fa9277",6901:"d4de9b70",6971:"82846cc6",7214:"c5912b92",7414:"98a02474",7544:"065e7f1f",7645:"fe0e80fd",7763:"4509a275",7918:"948e62c5",8360:"9192197f",8644:"3326b472",8693:"390bfe2a",8738:"a0f0167a",8772:"26add600",8898:"47391fc3",8922:"b9e0e589",8993:"39af372a",9334:"2fc84947",9393:"2bb589fd",9455:"9738f167",9463:"9ada19bc",9514:"6fdfb2a6",9668:"8a3bd746",9682:"088485fd",9753:"cdc5f502",9892:"641c624b",9973:"c91ee0c8"}[e]+".js",b.miniCssF=e=>{},b.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),b.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},c="cskefu-docs:",b.l=(e,a,f,t)=>{if(d[e])d[e].push(a);else{var r,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{r.onerror=r.onload=null,clearTimeout(s);var c=d[e];if(delete d[e],r.parentNode&&r.parentNode.removeChild(r),c&&c.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=l.bind(null,r.onerror),r.onload=l.bind(null,r.onload),o&&document.head.appendChild(r)}},b.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},b.p="/cskefu-docs/",b.gca=function(e){return e={17896441:"7918",72610070:"8693","935f2afb":"53",f2632f45:"216",dda9c7ef:"521","8353cdd5":"628",cf98d1ea:"731","299167b3":"782","3e54041a":"842",d8344fa6:"1237","356310f5":"1242","976ffcd0":"1407","9e8be0e3":"1566",ab09ee64:"1576",b631a60c:"2263",b234e7ad:"2323","356b3536":"2346","915b4ee0":"2390","0f4e1e3f":"2534","116a8231":"2877","73e12729":"2919",c8615f33:"2923","19c56e27":"2982",db76f809:"3056","21393b29":"3067","1f391b9e":"3085",bb7ce65d:"3174",a777e927:"3415",d04fcd8e:"3439",f0116df7:"3459",abddfe80:"3472","715c4002":"3681","26213e90":"4067",c4f5d8e4:"4195","23660eff":"4285",f1ad6a2c:"4652",ccf656a6:"4692","82b4845f":"4699","18f08221":"4846",ad96de5e:"5067","7457187d":"5324","39fe4428":"5341","0a95bd6a":"5362",d970193f:"5428",da354283:"5565","6840706a":"5667","862a8961":"5942",c74ab4ce:"5963","406716ed":"6333",bae66565:"6339",f18f8de2:"6381",a7feef70:"6741","448b282d":"6896","1a4022fc":"6901",c377a04b:"6971",e9efd9dc:"7214","393be207":"7414","352782a1":"7544",a7434565:"7645","8a17a920":"7763",ab1a3060:"8360","266bd6da":"8644","4ed120f1":"8738","4ddfe649":"8772","731ef631":"8898",c86ec09f:"8922",c39e551a:"8993","247783bb":"9334","1de50a5b":"9393","49d0e196":"9463","1be78505":"9514","54aa54a0":"9668",d193fcd8:"9682",ec58048c:"9753",f275cf37:"9892",d78d00b2:"9973"}[e]||e,b.p+b.u(e)},(()=>{var e={1303:0,532:0};b.f.j=(a,f)=>{var d=b.o(e,a)?e[a]:void 0;if(0!==d)if(d)f.push(d[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var c=new Promise(((f,c)=>d=e[a]=[f,c]));f.push(d[2]=c);var t=b.p+b.u(a),r=new Error;b.l(t,(f=>{if(b.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var c=f&&("load"===f.type?"missing":f.type),t=f&&f.target&&f.target.src;r.message="Loading chunk "+a+" failed.\n("+c+": "+t+")",r.name="ChunkLoadError",r.type=c,r.request=t,d[1](r)}}),"chunk-"+a,a)}},b.O.j=a=>0===e[a];var a=(a,f)=>{var d,c,t=f[0],r=f[1],o=f[2],n=0;if(t.some((a=>0!==e[a]))){for(d in r)b.o(r,d)&&(b.m[d]=r[d]);if(o)var i=o(b)}for(a&&a(f);n{"use strict";var e,a,f,d,c,t={},r={};function b(e){var a=r[e];if(void 0!==a)return a.exports;var f=r[e]={id:e,loaded:!1,exports:{}};return t[e].call(f.exports,f,f.exports,b),f.loaded=!0,f.exports}b.m=t,b.c=r,e=[],b.O=(a,f,d,c)=>{if(!f){var t=1/0;for(i=0;i=c)&&Object.keys(b.O).every((e=>b.O[e](f[o])))?f.splice(o--,1):(r=!1,c0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[f,d,c]},b.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return b.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,b.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var c=Object.create(null);b.r(c);var t={};a=a||[null,f({}),f([]),f(f)];for(var r=2&d&&e;"object"==typeof r&&!~a.indexOf(r);r=f(r))Object.getOwnPropertyNames(r).forEach((a=>t[a]=()=>e[a]));return t.default=()=>e,b.d(c,t),c},b.d=(e,a)=>{for(var f in a)b.o(a,f)&&!b.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},b.f={},b.e=e=>Promise.all(Object.keys(b.f).reduce(((a,f)=>(b.f[f](e,a),a)),[])),b.u=e=>"assets/js/"+({53:"935f2afb",216:"f2632f45",521:"dda9c7ef",628:"8353cdd5",731:"cf98d1ea",782:"299167b3",842:"3e54041a",1237:"d8344fa6",1242:"356310f5",1407:"976ffcd0",1566:"9e8be0e3",1576:"ab09ee64",2263:"b631a60c",2323:"b234e7ad",2346:"356b3536",2390:"915b4ee0",2534:"0f4e1e3f",2877:"116a8231",2919:"73e12729",2923:"c8615f33",2982:"19c56e27",3056:"db76f809",3067:"21393b29",3085:"1f391b9e",3174:"bb7ce65d",3415:"a777e927",3439:"d04fcd8e",3459:"f0116df7",3472:"abddfe80",3681:"715c4002",4067:"26213e90",4195:"c4f5d8e4",4285:"23660eff",4652:"f1ad6a2c",4692:"ccf656a6",4699:"82b4845f",4846:"18f08221",5067:"ad96de5e",5324:"7457187d",5341:"39fe4428",5362:"0a95bd6a",5428:"d970193f",5565:"da354283",5667:"6840706a",5942:"862a8961",5963:"c74ab4ce",6333:"406716ed",6339:"bae66565",6381:"f18f8de2",6741:"a7feef70",6896:"448b282d",6901:"1a4022fc",6971:"c377a04b",7214:"e9efd9dc",7414:"393be207",7544:"352782a1",7645:"a7434565",7763:"8a17a920",7918:"17896441",8360:"ab1a3060",8644:"266bd6da",8693:"72610070",8738:"4ed120f1",8772:"4ddfe649",8898:"731ef631",8922:"c86ec09f",8993:"c39e551a",9334:"247783bb",9393:"1de50a5b",9463:"49d0e196",9514:"1be78505",9668:"54aa54a0",9682:"d193fcd8",9753:"ec58048c",9892:"f275cf37",9973:"d78d00b2"}[e]||e)+"."+{53:"c10f1f42",216:"aefbb948",521:"15d314cd",628:"e429cb84",731:"896969e8",782:"6a5e239f",842:"9735587a",1237:"3dc34a54",1242:"de840253",1407:"4cffc50b",1566:"d68036d0",1576:"ebdf3724",2263:"30834e59",2323:"ed187d5a",2346:"66551306",2390:"dc8d12d0",2534:"7c652ddd",2877:"86d5a261",2919:"368f8e0b",2923:"2a4104f6",2982:"e5c58a23",3056:"495d1f6d",3067:"d53a3d28",3085:"2349095d",3174:"36694924",3415:"50724927",3439:"273a8b25",3459:"b5c92fcc",3472:"63ed825a",3681:"6f616fc8",4067:"53e34f0b",4195:"40eceaaa",4285:"31f0f6aa",4652:"d8871e75",4692:"b0b7e1ac",4699:"e6a3f07d",4846:"40cbae13",4972:"ba3f73f2",5067:"7a3d11c6",5324:"06150b69",5341:"f0c1fd1e",5362:"90ca60b3",5428:"3dc77dd4",5565:"121b03ab",5667:"23fc95ca",5942:"8dcce80b",5963:"2890f8ca",6333:"a17803a9",6339:"e6c97703",6381:"e6c1b43a",6741:"5e540c89",6896:"30fa9277",6901:"d4de9b70",6971:"82846cc6",7214:"c5912b92",7414:"98a02474",7544:"065e7f1f",7645:"fe0e80fd",7763:"4509a275",7918:"948e62c5",8360:"9192197f",8644:"3326b472",8693:"17ddde7f",8738:"a0f0167a",8772:"26add600",8898:"47391fc3",8922:"b9e0e589",8993:"39af372a",9334:"2fc84947",9393:"2bb589fd",9455:"9738f167",9463:"9ada19bc",9514:"6fdfb2a6",9668:"8a3bd746",9682:"bce27abf",9753:"cdc5f502",9892:"641c624b",9973:"c91ee0c8"}[e]+".js",b.miniCssF=e=>{},b.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),b.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},c="cskefu-docs:",b.l=(e,a,f,t)=>{if(d[e])d[e].push(a);else{var r,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{r.onerror=r.onload=null,clearTimeout(s);var c=d[e];if(delete d[e],r.parentNode&&r.parentNode.removeChild(r),c&&c.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=l.bind(null,r.onerror),r.onload=l.bind(null,r.onload),o&&document.head.appendChild(r)}},b.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},b.p="/cskefu-docs/",b.gca=function(e){return e={17896441:"7918",72610070:"8693","935f2afb":"53",f2632f45:"216",dda9c7ef:"521","8353cdd5":"628",cf98d1ea:"731","299167b3":"782","3e54041a":"842",d8344fa6:"1237","356310f5":"1242","976ffcd0":"1407","9e8be0e3":"1566",ab09ee64:"1576",b631a60c:"2263",b234e7ad:"2323","356b3536":"2346","915b4ee0":"2390","0f4e1e3f":"2534","116a8231":"2877","73e12729":"2919",c8615f33:"2923","19c56e27":"2982",db76f809:"3056","21393b29":"3067","1f391b9e":"3085",bb7ce65d:"3174",a777e927:"3415",d04fcd8e:"3439",f0116df7:"3459",abddfe80:"3472","715c4002":"3681","26213e90":"4067",c4f5d8e4:"4195","23660eff":"4285",f1ad6a2c:"4652",ccf656a6:"4692","82b4845f":"4699","18f08221":"4846",ad96de5e:"5067","7457187d":"5324","39fe4428":"5341","0a95bd6a":"5362",d970193f:"5428",da354283:"5565","6840706a":"5667","862a8961":"5942",c74ab4ce:"5963","406716ed":"6333",bae66565:"6339",f18f8de2:"6381",a7feef70:"6741","448b282d":"6896","1a4022fc":"6901",c377a04b:"6971",e9efd9dc:"7214","393be207":"7414","352782a1":"7544",a7434565:"7645","8a17a920":"7763",ab1a3060:"8360","266bd6da":"8644","4ed120f1":"8738","4ddfe649":"8772","731ef631":"8898",c86ec09f:"8922",c39e551a:"8993","247783bb":"9334","1de50a5b":"9393","49d0e196":"9463","1be78505":"9514","54aa54a0":"9668",d193fcd8:"9682",ec58048c:"9753",f275cf37:"9892",d78d00b2:"9973"}[e]||e,b.p+b.u(e)},(()=>{var e={1303:0,532:0};b.f.j=(a,f)=>{var d=b.o(e,a)?e[a]:void 0;if(0!==d)if(d)f.push(d[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var c=new Promise(((f,c)=>d=e[a]=[f,c]));f.push(d[2]=c);var t=b.p+b.u(a),r=new Error;b.l(t,(f=>{if(b.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var c=f&&("load"===f.type?"missing":f.type),t=f&&f.target&&f.target.src;r.message="Loading chunk "+a+" failed.\n("+c+": "+t+")",r.name="ChunkLoadError",r.type=c,r.request=t,d[1](r)}}),"chunk-"+a,a)}},b.O.j=a=>0===e[a];var a=(a,f)=>{var d,c,t=f[0],r=f[1],o=f[2],n=0;if(t.some((a=>0!==e[a]))){for(d in r)b.o(r,d)&&(b.m[d]=r[d]);if(o)var i=o(b)}for(a&&a(f);n 账号和权限 | 春松客服 - +
版本:v8

账号和权限

系统管理员

在春松客服里,系统管理员是具备管理所辖组织内坐席、权限、角色、联系人和坐席监控等资源的管理员,系统管理员分为两种类型:超级管理员普通管理员,普通管理员也简称“管理员”。

超级管理员为春松客服系统设置的,初始化一个春松客服实例后,默认超级管理员用户名为 admin,密码为 admin1234,并且有且只有一个,IT 人员在初始化搭建的春松客服实例的第一件事就是更改超级管理员账号的密码,以确保系统安全。超级管理员具备更新系统所有属性的能力,读写数据,是春松客服内权限最大的用户。

安装启动系统,进入春松客服后台界面,输入初始化的超级管理员账号密码(用户名: admin, 密码: admin1234),点击立即登录。

登录界面

超级管理员同时维护者春松客服的组织机构的高层级,组织机构是树形结构,默认情况下没有组织机构信息,春松客服搭建完成后,由超级管理员设定根节点,比如总公司、总公司下属子公司,维护这样的一个层级结构,再创建其他管理员账号,普通管理员账号可以创建多个,不同管理员隶属于不同组织机构,该管理员只有管理其所在组织机构及该组织机构附属组织机构的权限。

系统管理员切换不同的组织机构,可以查看不同组织机构的数据。

权限设计

春松客服权限体系包括:组织机构,角色,账号。

权限的管理

角色可以自定义,设置对一系列资源的读写。角色的创建和删除,修改资源授权,只有超级管理员可以操作,,普通【管理员】只具备角色的使用权:添加或删除权限里的系统账号。

系统账号读写资源与角色的关系

将账号添加到角色后,因为账号也同时隶属于不同的组织机构,那么账号所具有的权限就是其所在组织机构以及附属组织机构的角色对应的资源的读写。

根据角色和坐席所在组织机构进行权限检查:

  • 超级管理员可以管理系统所有资源
  • 管理员可以创建部门人员
  • 组织机构支持层级的树状结构
  • 角色包含对不同资源的读写权限
  • 资源如联系人,客户等是根据组织机构进行隔离的
  • 网站渠道必须启用技能组,不同网站渠道接入的访客根据网站渠道设置分配给不同的技能组
  • 系统数据根据坐席当前所在的组织机构进行展示
  • 坐席可以看到自己所在组织机构以及附属组织机构的数据

假设组织机构如下:

组织机构示意图

  • 李四所能看到的联系人全集是 A 部门及其附属部门所创建的全部联系人
  • 李四看不到 B 部门的联系人,张三看不到 A 部门的联系人
  • 李四能看到刘一创建的联系人,刘一看不到李四创建的联系人

组织机构管理

创建部门

系统 -> 系统概况 -> 用户和组 -> 组织机构 -> 创建部门,并且可以启用或关闭技能组

创建部门

  • 名词解释:

部门 需要创建的部门名称

上级机构 选择上级部门

启用技能组 这里启用与否,技能是接待同一个渠道的坐席人员群组,春松客服支持配置自动分配策略,连接访客与坐席,简称 ACD 模块

更新、删除部门

进入部门列表

系统 -> 系统概况 -> 用户和组 -> 组织机构

编辑(修改)部门

系统 -> 系统概况 -> 用户和组 -> 组织机构 -> 修改部门

修改部门

删除部门

系统 -> 系统概况 -> 用户和组 -> 组织机构 -> 删除部门

设置部门地区

系统 -> 系统概况 -> 用户和组 -> 组织结构 -> 选中一个部门 -> 地区设置

设置部门地区

角色管理

创建角色

系统 -> 系统概况 -> 用户和组 -> 系统角色 -> 新建角色

只有【系统超级管理员】可以创建角色。

创建角色

名词解释:

角色 系统中用户的操作权限是通过角色来控制,角色可以理解为具备一定操作权限的用户组;

可以把一个或者更多的用户添加到一个角色下;

可以给一个角色设置一定的系统权限,相当于这个角色下面的用户有了这些系统权限;

角色创建好了以后,在所有组织机构中共享。不同组织机构的管理员,只能管理其所在组织机构和下属组织机构里的账号的角色。

编辑(修改)角色

系统 -> 系统概况 -> 用户和组 -> 系统角色 -> 修改角色

只有【系统超级管理员】可以编辑角色。

修改角色

删除角色

系统->系统概况->用户和组->系统角色>删除角色

只有【系统超级管理员】可以删除角色。

删除角色

账号管理

创建用户账号:系统 -> 系统概况 -> 用户和组 -> 用户账号 -> 创建新用户

提示:

电子邮件: 需要有效的格式
密码: 字母数字最少8位,手动录入
手机号: 全系统唯一
  • 用户分为管理员和普通用户

  • 坐席分为一般坐席和 SIP 坐席,普通用户与管理用户都可以成为坐席,SIP 坐席是在多媒体坐席的基础上

  • 每个账号必须分配到一个部门下,以及关联到一个角色上,才可以查看或管理资源,请详细阅读【组织机构】和【角色】管理

  • 创建普通用户

创建普通用户

  • 创建多媒体坐席

创建多媒体坐席

  • 创建管理员

创建管理员

查看账号信息

系统 -> 系统概况 -> 用户和组 -> 用户账号

查看账户信息

点击操作一栏中的“编辑”“删除”,可以对当前用户列表中的所有用户的信息进行编辑或者删除

添加账号到部门

系统 -> 系统概况 -> 用户和组 -> 组织结构 -> 选中一个部门 -> 添加用户到当前部门

  • 可以把已经存在的 用户账号 添加到一个特定的部门中

  • 一个用户账号只能隶属于一个部门

部门中添加账号

添加账号到角色

系统->系统概况->用户和组->系统角色>添加用户到角色

角色中添加账号

- + \ No newline at end of file diff --git a/docs/channels/index.html b/docs/channels/index.html index 81843378..0cf7f050 100644 --- a/docs/channels/index.html +++ b/docs/channels/index.html @@ -4,13 +4,13 @@ 渠道管理 | 春松客服 - +
版本:v8

渠道管理

概述

春松客服支持多种渠道,访客的来源可能是多渠道的,这也是目前联络中心发展的趋势,以及对智能客服系统的一个挑战,一方面随着信息技术和互联网通信、聊天工具的演变,企业的客户逐渐分散,尤其是营销平台多元化。

多渠道的适应能力,是春松客服的重要特色。在【渠道管理】的子菜单中,查看支持的不同类型的渠道。

渠道支持

渠道名称简介获得
网页渠道通过在网页中注入春松客服网页渠道 HTML,实现聊天控件,访客与客服建立实时通信连接,支持坐席邀请访客对话等功能开源,免费,随基础代码发布
Facebook Messenger 渠道简称“Messenger插件”或“ME”插件, Messenger 是 Facebook 旗下的最主要的即时通信软件,支持多种平台,因其创新的理念、优秀的用户体验和全球最大的社交网络,而广泛应用。春松客服 Messenger 插件帮助企业在 Facebook 平台上实现营销和客户服务开源,免费,随基础代码发布
- + \ No newline at end of file diff --git a/docs/channels/messenger/facebook-otn/index.html b/docs/channels/messenger/facebook-otn/index.html index 2f355766..9280d39b 100644 --- a/docs/channels/messenger/facebook-otn/index.html +++ b/docs/channels/messenger/facebook-otn/index.html @@ -4,14 +4,14 @@ Facebook OTN 主动推送指南 | 春松客服 - +
版本:v8

Facebook OTN 主动推送指南

什么是 OTN 消息

OTN 消息是 Facebook 平台提供的 Facebook 主页可以向粉丝主动推送消息的工具。粉丝有权利订阅,订阅后 Facebook 主页管理员推送通知消息时,不受24小时规则限制,可以是营销或非营销消息。

OTN 是 One-time Notification 的缩写。

OTN

整个 OTN 使用流程可分为四步:

1、管理员在春松客服“营销中心”创建 OTN 记录,生成分享链接

2、运营人员发布分享链接到 Facebook Page 页面或其它渠道;

3、消费者或访客点击分享链接后订阅 OTN 通知,即分享链接页面的“通知我”按钮;

4、管理员可以通过手动触发或自动发送的方式,向订阅的访客发送 OTN 通知,即创建 OTN 记录时表单的内容。

使用 OTN 的关键在于掌握:OTN 创建表单,在推广活动时使用分享链接发送 OTN 通知

下图为 Facebook 官方给出的一个 OTN 通知在访客端的样例:

案例

开通 Facebook Page 的 OTN 权限

根据 Facebook 的规定,您首先需要为您的 Page 开通 OTN 权限。如下图所示,在 Page 中按照:设定→ 进阶信息→ 要求的功能→ 一次性通知 的路径为您的 Page 申请 OTN 权限。

开通权限

OTN 管理

营销人员可以在营销中心对 OTN 进行管理。在营销中心可以看到 OTN 的详细信息以及订阅人数和状态等。

创建 OTN

步骤:营销中心 → 创建 OTN

创建 OTN

OTN 表单内容。

自定义内容

  • OTN支持文本和图片两种消息类型
  • 请选择渠道是指messenger渠道
  • 订阅前邀请消息支持文本和图片,可以根据需要自定义
  • 订阅邀请文本
  • 成功订阅提醒是用户订阅消息后,收到的消息
  • OTN 内容指用户收到的营销人员发送的OTN消息详情
  • 推送时间可以预设,到达预设的时间,系统自动发送 OTN 消息

获得分享链接

创建 OTN 后,可以在 OTN 管理列表中,找到对应项的【分享链接】,点击【复制】。

那么,接下来,您就可以发布推文(Post),并且在推文中增加该链接,Facebook 用户在浏览推文,如果感兴趣就点击该链接,完成订阅!

编辑 OTN

步骤:Messenger OTN 列表页→ 操作栏→ 编辑 在推送内容前,管理员可以继续编辑 OTN 表单内容。

删除 OTN

步骤:Messenger OTN列表页→ 操作栏→ 删除

删除

发送 OTN 推送

活动的时间到了,是推送优惠券或者重要更新的时候了,之前点击了订阅的链接的用户,给 TA 们推送消息吧!

有两种发送 OTN 推送方式:定时发送手动发送

定时发送:在 OTN 的表单中,指定时间,在当前设定未到达前,您可以随时调整该时间。

定时发送

手动发送步骤:Messenger OTN列表页→ 操作栏→ 发送

手动发送

营销人员发布分享链接到 Facebook 主页

第一步:营销人员复制 Messenger OTN 列表中的分享链接

复制链接

第二步:进入 Facebook 主页页面,建立贴文;帖文中加上分享链接,然后发布

分享链接

Facebook 渠道用户订阅 OTN 消息

用户在 Facebook page 页面,点击分享链接,进入对话窗口后点击:通知我/Notify Me

订阅消息

Facebook 渠道用户接收 OTN 消息

用户订阅 OTN 消息后,营销人员在营销中心发送 OTN,用户就可以收到消息了

通知消息

查看 OTN 发送效果

OTN 列表页“订阅”一列显示此 OTN 订阅人数,订阅的用户都能接收到 OTN 推送,接收人数和订阅人数相同。

查看 OTN 数据

在 Facebook 主页上,作为管理员,从右侧管理面板进入公共主页成效分析,包含最近丰富的粉丝增长数据,页面访问情况数据,指导企业计算 RoI 等指标。

查看 Facebook 统计数据

OTN 注意事项

根据 Facebook 官方对于 OTN 的限制说明,需要注意:不能在短时间内多次向用户发送获得 OTN 许可的请求,即不能短时间内重复多次发送 OTN、请求用户点击“通知我/Notify Me”。这样的行为会被 Facebook 监控,如果 Facebook 算法检测到短时间内发送的 OTN 请求数量异常,您将面临失去访问 OTN 功能的风险。

- + \ No newline at end of file diff --git a/docs/channels/messenger/index.html b/docs/channels/messenger/index.html index 51075626..18553190 100644 --- a/docs/channels/messenger/index.html +++ b/docs/channels/messenger/index.html @@ -4,13 +4,13 @@ Messenger 渠道 | 春松客服 - +
版本:v8

Messenger 渠道

Facebook Messenger

概述

Messenger 是 Facebook 旗下的最主要的即时通信软件,支持多种平台,因其创新的理念、优秀的用户体验和全球最大的社交网络,而广泛应用。通过 Facebook Messenger 的官方链接,可以了解更多。

https://www.messenger.com/

春松客服 Messenger 插件帮助企业在 Facebook 平台上实现营销和客户服务。

连接客户

  • 集成 Facebook 粉丝页,使用 OTN 推送营销活动信息,吸引新粉丝和激活老客户
  • 集成 Chatopera 机器人客服,自动回答常见问题,提升客户体验
  • 支持机器人客服转人工坐席,解决客户的复杂问题
  • 产品迭代一年,提供多个最佳实践,帮助企业高效率运营
  • 春松客服运营分析和 Chatopera 机器人客服运营分析生成报表,洞察业务指标

了解 Messenger 的强大功能

首先,出海企业要获客,或者通过互联网方式提供服务,那么 Facebook 上的广告和 Messenger 服务,是您无论如何都要使用的,因为你可以从这里找到您的目标客户、潜在客户。但是,如果 Facebook 平台的商业化程度过高,将影响社交网络内用户的体验,比如用户收到和自己不相关、不感兴趣的、大量的广告。为此 Facebook 在广告和 Messenger 上,有很多设计、一些限制,达到了商业化和人们社交需求的平衡,这是 Facebook 能成为今天世界上最大的社交网络的关键原因之一。

其次,您需要了解 Messenger 的一些应用场景,比如 Chatopera 为九九互动提供的智能客服和 OTN 服务的案例chatopera-me-jiujiu2020

在正式介绍春松客服 Messenger 插件的使用之前,需要说明 Chatopera 提供该插件是通过 Facebook Messenger 平台的开发者 APIs 实现,因此,该插件的功能安全可靠、稳定强大并且会不断更新。

https://developers.facebook.com/docs/messenger-platform

使用指南


  1. 春松客服为出海企业提供智能客服,https://www.chatopera.com/solutions/overseas.html
- + \ No newline at end of file diff --git a/docs/channels/messenger/install/index.html b/docs/channels/messenger/install/index.html index 1fcbaa6c..9bec9db4 100644 --- a/docs/channels/messenger/install/index.html +++ b/docs/channels/messenger/install/index.html @@ -4,14 +4,14 @@ Messenger 渠道配置 | 春松客服 - +
版本:v8

Messenger 渠道配置

前提准备

在使用春松客服集成 Messenger 前,您需要做如下准备工作。

准备工作描述网址
注册 Facebook 账号创建 Messenger 应用,Facebook Page 页,测试 BOT 等需要准备 Facebook 账号link
注册 Chatopera 云服务账号创建机器人客服需要使用 Chatopera 云服务link
部署春松客服实例春松客服实例需要安装有 Messenger 插件link
初始化春松客服使用超级管理员创建组织机构,技能组,坐席角色和一个坐席账号,将账号绑定到坐席角色和技能组link

在配置的过程中,还需要开通额外的账号或资源,是以以上为基础的。

集成 Messenger 渠道

安装好春松客服 Messenger 插件后,系统管理员登录,只有系统管理员或超级系统管理员【admin】可以维护 Facebook Messenger 渠道。

Messenger 渠道管理

在右上角组织机构,选择一个技能组,然后进入【系统管理】,打开 【Messenger】页面。

打开 Messenger 渠道管理

注意:此处要先切换到技能组,因为创建 Messenger 渠道必须绑定一个技能组。

点击【创建渠道】。

创建渠道

如图,创建 Messenger 表单有几个信息,接下来,我们将介绍如何获得这些信息。

创建 Facebook Page

Facebook Page,也称为 Facebook 粉丝页、Facebook 页面、Facebook 主页,是 Facebook 为机构、企业、非营利性组织等各种类型的组织提供的站点,在该站点组织发布消息,和 Facebook 平台的用户互动。在粉丝页,Facebook 提供了广告、推文、点评、小组、数据分析等工具,帮助企业充分的利用社交网络实现营销、品牌建设。

粉丝页

在上图,我们注意到,访客可以看到“发消息”按钮,那么点击发消息按钮就可以唤起 Messenger 聊天控件和企业互动,完成反馈、咨询等。服务访客的,可能是人工坐席,也可以能是机器人客服,此外,企业可以主动联系访客,并进而通过 Messenger 进行实时对话。稍后,我们将介绍如何集成配置春松客服连接一个 Facebook 页面,然后进行更多最佳实践的介绍,敬请继续阅读。

在熟悉了 Facebook Page 的定位以后,当您有了 Facebook 账号,您可以通过下面链接快速的创建一个 Facebook Page。

https://www.facebook.com/pages/creation/?ref_type=comet_home

快速创建

在此,我们创建一个示例页面,在演示如何在春松客服集成 Messenger 时使用,注意:企业创建 Messenger 应用以后,可以将 Messenger 应用集成到 Facebook Page 上,Facebook Page 是企业的一个对外的主页,而并不是唯一的,Messenger 应用同时支持多种渠道,比如网页聊天、Whatsapp等。Messenger 应用的介绍是在下一环节。

假设我们创建的 Facebook Page 名称:春松客服 DEMO。创建完成后,进入 春松客服 DEMO 地址,这时,我们是管理员视图,点击“访客视图”,就是普通访客看到的页面。

访客视图

注意:此时,Facebook Page 刚刚创建,对于 Facebook 普通用户而言,这个页面还是不可见的,作为管理员,在 Facebook Page 设置页面,进行可见度设置,调整为 Public 才是公开的。设置界面,后面我们还会使用到。

管理员界面

添加联系我按钮

此时,我们有了一个 Facebook Page,默认情况下,没有联系我按钮,我们需要手动的添加。

在 Facebook Page 页面,以管理员视图查看,找到“添加按钮”,点击这个按钮。

添加按钮

这时,我们在很多弹出的选项中,选择“发消息”。

发消息

提交后,在您的页面上,便有了“发消息”按钮。作为管理员,您可以设置或测试它。

测试对话

当我们再以访客视图查看,就会发现唤起 Messenger 聊天控件的发消息按钮。

访客视图

作为 Facebook Page 的管理员,我如何回复消息呢?

有两个方案:

普通模式

在默认情况下,用户浏览会以通知的形式发送给您登录的浏览器,您可以进行回复。并进入设置→消息,进行一些个性化的设置。

回复消息

此种方式下,访客的信息并没有和您的 CRM 系统联通,信息分散了;此外,您的访客可能来自不同渠道,Facebook Messenger 只是其中之一,渠道不能统一到一个系统,您的组织的客户服务工作效率降低,客户体验差。还有很多问题,这就是为什么 Facebook 提供了第二种模式 - 高级模式。

高级模式

在高级模式下,Facebook 将访客在您的 Facebook Page 上唤起的 Messenger 对话控件的消息,转发给了兼容 Facebook Messenger 平台的软件服务,比如一个春松客服实例,春松客服和 Facebook Messenger 平台之间进行通信,并且以约定的形式,企业可以主动发起会话、发布营销通知、回复访客会话等,Facebook 平台同时有丰富的接口,春松客服可以获得访客的 ID、语言、所在地区、邮箱、电话号码等信息,从而满足客户关系管理、营销和客服等诉求。下文,我们就详细介绍如何使用春松客服 Messenger 插件,通过高级模式,支持 Messenger 的对话。

创建 Messenger 应用 在高级模式下,企业可以选择:

  • 1)企业自行开通 Facebook 开发者平台账号,创建 Messenger 应用,并绑定 Facebook Page;
  • 2)和支持 Facebook Messenger 平台的服务商合作,获得技术支持,比如春松客服官方团队,该技术支持是付费服务项。

我们推荐企业使用第一种方式,即自行开通,该过程会多花一点时间,但是相对也简单,这种方式,完全由企业在 Facebook 平台上操作,不涉及任何春松客服官方的接口、云服务。

在以上两种方式中,您的春松客服实例都需要配置 HTTPs 协议,这部分后续会详细介绍。接下来,我们就以自行开通 Facebook 开发者平台进行讲解。

打开 Facebook Developer Portal, 使用 Facebook 账号开通

https://developers.facebook.com/apps

开通后登入,点击创建应用,一个应用可以关联多种 Facebook 产品,Messenger 是产品之一,因为本文我们将用该应用关联 Messenger 产品,因此,我们简称此种应用为 Messenger 应用。

Facebook 应用

在弹出的表单中,选择“更多选项”。

更多选项

接着填写应用的名称,联系邮箱。

联系邮箱

这里,我们假设名字填写了【春松001】,作为示例程序名字。如果您有开通 Facebook 商务账号,也可以在这里关联,该项为非必填。

Facebook 商户账号( https://business.facebook.com/ )是管理企业的组织人员、广告等资产的平台。

当应用创建成功,自动跳转到应用详情页面,如下。

详情页面

在添加产品卡片上,点击 Messenger 的【设置】按钮,进入 Messenger 产品设置页面,该页面有较多内容,我们将着重介绍有关和春松客服集成到 Facebook Page 相关的内容。

页面滑动至【访问口令】,点击【添加或移除主页】。

访问口令

此时,将弹出对话框,提示授权登录 Facebook,登录成功后,将展示您的 Facebook Page 列表,此时,我们可以看到【春松客服 DEMO】,勾选并选择提交。

绑定页面

如果该绑定失败,可能会提示原因,并且提示您进行变更,如下所示,点击【完成】。

完成绑定

此时,代表着【春松客服001】Messenger 应用正式接管了 Facebook Page 【春松客服 DEMO】的消息管理。回到应用详情页面,此时 Messenger 设置中,就出现了【春松客服 DEMO】。

完成接入

获得 Messenger 配置信息

还记得之前在春松客服内,创建 Messenger 渠道的表单吗?现在,对于表单里的内容,就可以获得了。

配置项描述示例
名称渠道名称,可使用 Facebook Page 名字春松客服 DEMO
Page IDFacebook Page 的唯一标识。在 Messenger 应用的设置的访问口令列表中,Page ID 就是主页名称下的数字字符串159955055741
Access Token访问 Facebook Page 的口令,每个 Facebook Page 使用不同口令。在 Messenger 应用的设置的访问口令列表中,点击【生成口令】xxxx
Verify Token该值为随机字符串,由企业用户自定义foobar20

渠道表单

创建 Messenger 渠道

回到春松客服 Messenger 渠道创建表单,填写对应值,点击【提交】。

提交表单

此时,渠道创建成功。但是,还需要一些配置,使得春松客服实例与 Facebook Messenger 平台服务连接起来。

配置 HTTPS

处于安全的考虑,Facebook 要求 Messenger 应用对接的软件服务使用 HTTPS 加密协议,春松客服企业用户有多种方案完成这一目的,针对生产环境,推荐您使用文档《春松客服配置 CDN和HTTPS》进行配置。出于本文是演示使用的目的,我们使用更为简单的方案,但是企业客户不要在生产环境用这种方式,避免因连接不稳定给您带来的损失。

在下文,我们使用 ngrok 为春松客服实例实现 HTTPS 协议的访问地址,ngrok 是可以免费使用的,但是需要您先注册,注册好了使用 ngrok 的命令行客户端绑定 localhost 的春松客服端口,ngrok 就提供一个 https 地址作为代理。

执行命令:

ngrok http 8035

此处,8035 即春松客服实例运行端口。

HTTPS 代理

在以上 ngrok 运营的结果,就是 https://efdbe3894f65.ngrok.io -> http://localhost:8035

此时,我们就得到了春松客服的HTTPS服务的地址 https://efdbe3894f65.ngrok.io

激活渠道连接

进入 Messenger 应用设置页面,滑动至【Webhook】区域,点击【添加回调网址】。

回调信息

在弹出的对话框内,填写回调地址和验证口令。

地址和验证

回调地址:https://your_domain/facebook/webhook/{{PAGE_ID}} ,将 {{PAGE_ID}} 替换为Page ID。

验证口令:即之前设定的 Verify Token。

点击【验证并保存】,此时,Facebook 会请求春松客服实例,保证服务连接状态正常,回到设置页面;若连接不成功,将会进行提示。

注意:第一次配置回调地址成功后,回调地址栏内将有值。一个 Messenger 应用可以集成多个 Facebook Page,这些 Facebook Page 是共享一个回调地址和验证口令的,那么您在这个 Messenger 应用上添加第二个 Facebook Page 并且都是连接到同一个春松客服实例时,是不需要再次设置 Webhook 信息的,所有的 Facebook Page 对话将一起被发送给这个回调地址处理。

配置 Webhook

至此,配置 Webhook 成功。

Webhook 添加订阅

完成添加 Webhook 信息,还需要在 Webhook 栏内选择【添加订阅】。

设置订阅内容

Facebook 将该主页发生的【发消息】相关的事件分为很多种类型,现在我们勾选 messages 和 messaging_postbacks。如果需要了解其他的事件类型可以参考 Facebook Messenger 平台文档

检查订阅内容

保存,回到 messenger 设置页面后,可见 Webhooks 多了两个字段。

完成订阅

此时,渠道就连接上了,春松客服经由 Facebook 开发者平台对接上了 Facebook Page 上的 Messenger 对话控件。

做一个测试

在集成 messenger 渠道的准备工作里,提到前提条件包括创建技能组、创建坐席人员的角色和创建至少一个账号关联角色和技能组。假设这个坐席人员名字是张三,现在,我们作为技能组的张三登录系统。同时,进入春松客服 DEMO 的 Facebook 主页,点击【发消息】,开始对话。

发送测试消息

访客发送的消息会自动在张三的网页上弹屏,二者进入对话。

正式上线

之前,在 Facebook 主页内的操作,我们都是使用管理员账号,此时,Facebook 普通用户作为访客登录,发起 Messenger 对话,是不会被 Facebook 转发到春松客服的,为了达成这个目标,我们需要提交上线,此过程需要在 Facebook 开发者平台,应用详情页面,编辑申请权限。

编辑权限

找到 pages_messaging,点击申请。

申请

提示申请需要大约 5 天,根据经验,三天内就可以完成。

提交状态

提交申请后,同时我们丰富一下 Facebook 应用的介绍信息,这是可能被数十亿人浏览和使用的!

比如应用的 Icon, 服务条款网址等。

审核内容

当权限申请完成,应用信息填写完成,正式提交审核,在侧边栏,点击【应用审核->申请】。

处理申请

注意:以上图片因为没有完成权限申请,没有提交上线的审核按钮。

上线审核通过后,在应用设置页面的上方,将【开发中】开关拨动到另一侧,此时,Facebook Page 和春松客服的集成大功告成。

上线

这时,您的主页就可以通过购买 Facebook 广告、发布文章等方法运营、转化客户了。

进一步学习最佳实践

接下来,您可以阅读下面的最佳实践系列文章,了解如何一步一步的打造良好的用户体验。

最佳实践主要是针对 Facebook 主页与春松客服之间的使用经验,如何获得高效的运营体验和客服服务体验,完成营销和客服工作。

此外,春松客服的基本功能如报表和坐席监控等,请参考春松客服文档中心的其它部分。

最佳实践

- + \ No newline at end of file diff --git a/docs/channels/messenger/message-types/index.html b/docs/channels/messenger/message-types/index.html index 934facc2..a380332a 100644 --- a/docs/channels/messenger/message-types/index.html +++ b/docs/channels/messenger/message-types/index.html @@ -4,13 +4,13 @@ Messenger 管理机器人客服对话 | 春松客服 - +
版本:v8

Messenger 管理机器人客服对话

概述

本文演示ME渠道机器人可以实现的一些基本功能。

阅读本文前需了解:

关系图

开始按钮

用户首次打开该 Facebook 主页的 Messenger 对话窗口时,主页显示【Get Started】,引导用户开始和机器人对话。

点击按钮后,机器人发送自定义欢迎信息。

欢迎语

实现原理:

通过 Messenger Profile API 设置 Page 欢迎屏幕会显示“开始”按钮,payload 设置为 __get_start

户轻触此按钮后,Messenger 平台会向您的 Webhook 发送一个 messaging_postbacks 事件, 发送 __get_start 到机器人,开启机器人对话。

延申阅读Facebook Messenger 消息格式Get Started 文档

在多轮对话设计器中,处理__get_start事件,定制机器人回复:

欢迎事件

比如下面技能代码,实现响应 __get_start 事件,推送欢迎语和导航菜单。

技能函数:

// Get Started
+ __get_start
- ^get_start()

技能函数:

exports.get_start = async () => {
return {
text: '#in params',
params: [{ // 文本消息
text: '欢迎使用ME机器人客服'
}, {
attachment: { // 导航菜单
type: 'template',
payload: {
template_type: 'button',
text: 'Hi,你想查看什么?',
buttons: [{
type: "phone_number",
title: "商务洽谈",
payload: "+8613691490568",
},
{
type: "postback",
payload: "__body_feeling",
title: "查看城市体感",
},
{
type: "postback",
payload: "__start_ask",
title: "咨询问题",
}
],
},
},
}, ]
}
}

导航菜单

我们给用户推送一个导航菜单,引导用户使用我们的服务。

菜单按钮直接触发云平台对应机器人技能。

导航菜单

导航菜单使用 Buttons 实现,按钮类型同 Messenger Buttons

菜单 payload 在用户点击后推送给机器人。

快捷回复

现在用户想查看城市体感信息,我们通过快捷回复,给用户几个热门城市选择,点击直接回复机器人。

快捷回复

用户选择 “查看城市体感” , __body_feeling 技能被处理,返回推荐选项给用户选择。

技能脚本:

// 显示推荐城市
+ __body_feeling
- ^queryFeeling()

// 查询城市数据
+ __query_city (*)
- ^getWeatherByCity(<cap1>)

技能函数

exports.queryFeeling = async () => {
return {
text: '#in params',
params: {
text: '请选择需要查询体感的城市',
// 快捷回复选项
quick_replies: [{
content_type: 'text',
title: '北京',
payload: '__query_city 北京',
},
{
content_type: 'text',
title: '上海',
payload: '__query_city 上海'
},
],
},
};
}

// 此处简化处理,技能函数有访问REST API的能力
exports.getWeatherByCity = function(city, cb) {
debug("getWeatherByCity: %s", city);
let data = {
'北京': '舒适',
'上海': '闷热'
}

cb(null, city + '体感' + data[city]);
}

知识库查询

在输入框直接回复完整问题查询知识库,回答已有的知识点。

知识库

在 Chatopera 云平台,设置常见问答对。用户问答和知识库数据匹配度超过指定阈值时,直接回复该条目答案。

知识库回复

知识库反馈

针对知识库的问答对,可以请用户进行反馈,提高知识库准确定。

知识库反馈

数据统计展示在云平台ROI数据中。使用 Chatopera 云服务 聚类分析 ,选择性优化知识库,提升机器人服务效果。

知识库聚类

知识库推荐

当问题没有匹配,有相关问题时,系统会推荐给用户,供用户快速选择。

知识库推荐

人工服务

用户问题机器人无法解决时,可在适当时机转人工处理。

转人工

系统会根据ACD策略接入合适的客服,进行处理。客服可以看到用户的历史对话,并使用 知识库快捷,知识库联想、转接其他专业客服等功能更好的服务访客。

小结

基于以上介绍,企业用户在春松客服和 Chatopera 机器人平台基础上,可以无代码的方式提供基于知识库的 FAQ Bot 和 低代码的方式实现多轮对话 Bot。

强大的定制化开发能力,满足企业客户的各种需求,提升企业的智能化和自动化,在规模化的同时,消费者获得个性化服务,自助式服务。

- + \ No newline at end of file diff --git a/docs/channels/messenger/messenger-chatbot/index.html b/docs/channels/messenger/messenger-chatbot/index.html index adbe7dfb..400e990a 100644 --- a/docs/channels/messenger/messenger-chatbot/index.html +++ b/docs/channels/messenger/messenger-chatbot/index.html @@ -4,13 +4,13 @@ Messenger 渠道配置机器人客服 | 春松客服 - +
版本:v8

Messenger 渠道配置机器人客服

概述

在春松客服中集成了 Messenger 渠道后,您可以通过配置机器人客服实现更加高效,方便,快捷的服务方式。机器人客服可以帮助您回答简单问题,提供轻松的娱乐,预先过滤访客数据,收集信息等,大大减少了人工客服的工作量。

配置机器人客服

春松客服实例需要安装有 Messenger 插件和智能机器人插件。只有超级管理员「admin」可以维护智能机器人插件。

创建机器人

步骤:系统→系统设置→智能机器人→新建

新建机器人

点击新建之后,弹出集成智能机器人对话框。渠道类型默认的是网站渠道,需要选择 Messenger 渠道。

选择 Messenger 渠道

根据提示填写对应信息,其中 ClientId 和 Secret 需要在 Chatopera 云服务中机器人的设置页面获取。

填写密钥

点击保存之后,创建智能机器人成功。

编辑机器人

步骤:智能机器人页面→操作栏→绑定

绑定

设置机器人

步骤:智能机器人列表选择需要设置的机器人→根据需求进行设置

设置

删除机器人

步骤:智能机器人页面→操作栏→删除

删除

机器人不同工作模式

模式描述是否可以转接不同工作模式
机器人客服优先当有新的访客接入会话时,机器人客服优先服务。访客可以选择转人工服务。
人工客服优先当有新的访客接入会话时,人工客服优先服务。
仅机器人客服当有新的访客接入会话时,机器人客服优先服务。访客不可以选择转人工服务。

访客和机器人对话

访客在 Facebook page 页面点击「发消息」进入对话窗口,访客在对话窗口中发消息可以收到机器人回复,并且可以评价机器人的回复是否有帮助。

评价机器人

访客反馈问题是否有帮助后,数据会记录到 Chatopera 云服务中,登录 https://bot.chatopera.com/ 进入机器人「统计」页面可以查看数据。

查看统计数据

访客如何选择转人工服务

访客和机器人对话触发到兜底回复时,兜底回复下带有「转人工」的按钮,访客点击「转人工」收到提示消息后就可以发送消息和人工客服对话。

转人工

人工客服如何结束对话

Facebook 渠道的访客不能主动结束对话,需要人工坐席在坐席工作台主动结束对话。

结束对话

- + \ No newline at end of file diff --git a/docs/channels/webim/index.html b/docs/channels/webim/index.html index 7564fda3..e9fc42aa 100644 --- a/docs/channels/webim/index.html +++ b/docs/channels/webim/index.html @@ -4,13 +4,13 @@ 网页渠道 | 春松客服 - +
版本:v8

网页渠道

概述

网页聊天支持可以适配移动设备浏览器,桌面浏览器。可以在电脑,手机,微信等渠道接入网页聊天控件。

安装

获取网页脚本,系统 -> 系统管理 -> 客服接入 -> 网站列表 -> 点击“Chatopera 官网” -> 基本设置 -> 接入;

接入网站

将图中的代码复制到一个 Web 项目的页面中,例如下图的。

粘贴聊天控件代码

使用

使用浏览器打开该 Web 页面。

聊天控件

【提示】该网页需要使用 http(s)打开,不支持使用浏览器打开本地 HTML 页面。

点击该网页中出现的“在线客服”按钮,出现聊天窗口,可以作为访客,与客服聊天了。

与在线客服对话

【提示】春松客服提供一个测试网页客户端的例子,可以使用 http://{{春松春松客服IP:[PORT]}}/testclient.html 进行访问。

- + \ No newline at end of file diff --git a/docs/crm/index.html b/docs/crm/index.html index d3f53ebc..46259e23 100644 --- a/docs/crm/index.html +++ b/docs/crm/index.html @@ -4,7 +4,7 @@ 客户关系管理 | 春松客服 - + @@ -13,7 +13,7 @@ 其中“联系人信息”,会同步到 左侧菜单->全部联系人;

新建联系人

编辑客户

左侧菜单 -> 全部客户 -> 客户列表 -> 选中一个客户 -> 点击“编辑”按钮

只能更新“基本信息”,“企业信息”; 需要更新 “联系人信息”,请移步到 左侧菜单->全部联系人;

联系人笔记

进入联系人列表,选择一个联系人,点击联系人姓名,进入详情页面。 在详情页面,编辑联系人笔记,记录来往历史。

编辑联系人笔记

删除客

左侧菜单 -> 全部客户 -> 客户列表 -> 选中一个客户 -> 点击“删除”按钮

- + \ No newline at end of file diff --git a/docs/deploy/index.html b/docs/deploy/index.html index 4bc8c104..9f89591c 100644 --- a/docs/deploy/index.html +++ b/docs/deploy/index.html @@ -4,7 +4,7 @@ 应用部署 | 春松客服 - + @@ -15,7 +15,7 @@ docker pull cskefu/contact-center:develop

春松客服包含多个 image。

导出镜像

下载好 image 后,导出 image,将所有 image 使用下面命令导出为 tgz 文件

docker save cskefu/contact-center:develop > cc.docker.tgz

上传镜像

将所有导出的 image tgz 文件上传到目标部署的服务器 即网络条件不好的机器,比如用 FTP 工具或 SCP 命令。

安装镜像

上传到目标机器后,安装镜像 docker load < cc.docker.tgz

安装成功后,会提示。

启动服务

启动春松客服,参考本章以上内容。

cd cskefu # 源文件下载地址
docker-compose up -d contact-center

下一步

配置 HTTPS

系统初始化

系统维护

- + \ No newline at end of file diff --git a/docs/faq/index.html b/docs/faq/index.html index 5fa4003a..80e23c7d 100644 --- a/docs/faq/index.html +++ b/docs/faq/index.html @@ -4,7 +4,7 @@ FAQ | 春松客服 - + @@ -14,7 +14,7 @@ 适用场景包括售前、对话营销。

问:多轮对话设计器、智能问答引擎,这两个集成后是开源的吗,还是付费使用?

多轮对话设计器可以免费下载使用, 智能问答引擎还没有开源。参考Chatopera 云服务

问:请问客户怎么接入?

部署安装,配置使用。创建网站渠道,查看网站渠道详情有集成指南。

问:软件怎么收费?

基础模块不收费,商业插件和服务收费。参考开源项目地址主页介绍

问:春松客服支持哪些渠道?

免费模块目前支持 PC,Mobile 浏览器,开源版本就可以。APP 需要对接 SDK,这个有额外的开发工作,我们可以定制开发。

付费模块支持安装 Facebook Messenger 渠道插件。

问:如果我们也需要给商家开坐席,也是能支持的吗?

支持,春松客服内置的权限,组织机构管理使用参考账号和权限

问:那怎么能互相交流?后台看到坐席了,前端是不是还要在跑一个程序?

访客可以用网页客户端插件,参考文档

问:有没有 java 项目可以直接导入 idea?

开发环境搭建

问:为啥我这里客服没有管理员权限就看不到对话?

权限由“人员-角色-资源”确定。资源又通过部门隔离,参考[cc] resource 根据角色和部门进行权限检查 #61 然后,具体到坐席管理,需要新建一个角色。之后赋予坐席的权限。再加“人员”到这个角色。

问:我的服务器已经部署过 redis mysql 等服务,对这个项目部署有问题吗?

那可以直接用,设置环境变量就行。修改一下 docker-compose.yml。

问:有本地部署的教程文档吗?

参考春松客服部署方案

问:我想改成异步触发对话,后台重新输出了一下页面作用域里面的值,发现参数太多,web 通信时候调用得 socket.io.js 有没有相关的文档和参数解释?

[cc] 提供启动客服会话的 RestAPI #97

问:由于使用了 netty-socketio,所以 Web 端、android、ios 端都需要使用 socketio 的客户端吧,比如不能说 Android 直接写原生 netty 客户端 或者 web 直接写 websocket 客户端去连服务器,对吧?

socketio 是对 websocket 进行封装,是 websocket 协议的一种实现,在客户端通过 websocket 连接应该是没问题的。这块我还没有试过,不过肯定能 google 到。

问:微信功能接进去了吗?

现在还不支持微信公众号。

问:机器人自动回复模块在哪?

机器人客服参考文档

问:多轮对话,看上去就是在编辑脚本,有对分支逻辑的支持吗?

支持分支编辑,参考 https://github.com/chatopera/chatbot-samples

问:多轮语言的编辑的 开源的也有么

我们做的不开源。

问:就是客服开源对吧

Chatopera 全部开源项目查看 https://github.com/chatopera

问:春松的访客,有匿名用户和注册用户的概念吗

没有,访客并不注册账号,客服端可以关联联系人。

问:没有多租户也就是你们没有考虑搞 saas 云喽?要用只能做独立部署?

春松客服 SaaS 版暂时没有上线时间计划,主要是企业私有部署或部署在 IaaS 云服务内。

问:现在的最新开源代码,已经完成集群改造了?

集群还需要调整一点代码,因为目前单机版性能轻松支持 200 位坐席人员同时使用,集群部署还未提上日程。

问:常用浏览器兼容到的最低版本多少?

有条件就用最新的,安全性有保证。 特殊说明微软浏览器:暂时不支持IE,请推荐用户使用 Edge 浏览器。

问:这个项目要怎么启动呢

- + \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 5dd72890..7448849d 100644 --- a/docs/index.html +++ b/docs/index.html @@ -4,13 +4,13 @@ 春松客服 | 春松客服 - +
版本:v8

春松客服

https://www.cskefu.com

春松客服是拥有坐席管理、渠道管理、机器人客服、数据分析、CRM 等功能于一身的新一代客服系统。将智能机器人与人工客服完美融合,同时整合了多种渠道,结合 CRM 系统,为客户打标签,建立客户的人群画像等,帮助企业向客户提供更加专业客服服务。

目前,春松客服发行的稳定版本为 v8.x。

产品定义

客服系统是企业的重要工具,尤其是移动互联网时代,微信公众号、移动电话或是 Facebook Messenger 等渠道分散了企业的服务渠道,企业需要响应来自任何地点任何时间的客户。同时,企业的口碑至关重要,企业服务需要在客户获得、客户激活、客户留存等阶段无懈可击。

客服的重要性

春松客服有下面的亮点:

模块化设计

将功能以插件形式模块化,适合企业长期使用,尤其是中小型企业,灵活购买高级插件。

插件机制

部署方便

以容器化基础,安装使用 Docker 编排,卸载等非常简单。

机器人客服

强大的机器人客服解决方案,与 Chatopera 机器人平台等产品集成。

全周期解决方案

使用场景角色

客户

需要智能客服系统的企业。

客服人员

指代客户的客服团队的工作人员。

访客/消费者

指代甲方的客户,是需要通过联系客服人员咨询问题的人。

开发人员

指代智能客服系统的开发者,开发人员应该是有权限修改智能客服系统代码的人,包括 Chatopera 工程师和春松客服开源社区开发者。

业务专家

指代熟悉客户业务的人员,业务专家可以提供产品设计的意见,可以参与智能问答的质量评定,也可以作为管理员登录智能客服系统,配置系统,管理智能对话和训练。

关注春松客服公众号

及时获得产品更新、活动分享等信息。

春松客服公众号

- + \ No newline at end of file diff --git a/docs/initialization/index.html b/docs/initialization/index.html index bc17b3b3..86314822 100644 --- a/docs/initialization/index.html +++ b/docs/initialization/index.html @@ -4,13 +4,13 @@ 系统初始化 | 春松客服 - +
版本:v8

系统初始化

完成部署春松客服实例后,还需要针对企业的组织架构和客服坐席进行配置才能使用。请认真阅读本页内的内容,尤其是【常见问题】一节。 这样可以节约您的宝贵时间!

默认的账号 admin 是超级管理员,该账号做了特殊处理:可以使用坐席工作台,但是不具备接待访客会话的能力。

只有对系统进行初始化,才能开始处理客户咨询,所以初始化主要是针对坐席管理的,也请先详细阅读 权限设计

在您了解了组织机构角色账号网页渠道的概念后,继续阅读一下内容。

春松客服刚搭建好后,合理的初始化顺序是:1)创建组织机构;2)创建角色;3)创建账号;4)账号添加到组织机构;5)账号添加到角色。 在使用过程中,也可以灵活调整。

默认的账号信息

在系统部署后,得到默认的:

登录账号密码角色
adminadmin1234系统超级管理员
zhangsanagent1234客服坐席人员
  • 系统超级管理员【admin】, 密码:admin1234

  • 角色【管理员】【高级坐席】【初级坐席】

    • 初级坐席:仅具备坐席服务的基本资源读写权限
    • 高级坐席:在初级坐席基础上,支持【坐席监控】等高级功能
    • 管理员:可以查看【系统管理】并对管理员所在的组织机构和附属组织机构进行人员、设置等
  • 组织机构【售前坐席A组】, 及其从属

    • 角色【普通坐席】
    • 坐席账号【zhangsan】,属于角色【普通坐席】, 密码:agent1234
    • 网站渠道【localhost】, 该聊天控件可以在 http(s)://CSKEFU_IP:CSKEFU_PORT/testclient.html 体验

需要强调的是,为了系统安全起见,您可以按照一下顺序删除网站渠道【localhost】【zhangsan】【普通坐席】【售前坐席A组】

修改默认账号密码

为了安全起见,在系统部署后,完成密码修改并妥善保管密码。

修改【admin】账号

使用系统超级管理员 admin,点击右上角【个人资料】。

个人资料

设置新密码并保存。

设置

修改【zhangsan】账号

使用系统超级管理员 admin 进入【售前坐席 A 组】,再进入系统管理,账号管理,找到zhangsan,点击编辑进行修改。

修改账号

创建组织机构

参考组织机构管理,为企业建设一个树形的组织架构。针对坐席小组,设定为 技能组

创建角色

参考角色管理,创建角色并授予相应的权限,客服人员主要需要的资源就是坐席对话全部客户全部联系人,此处全部客户全部联系人是限定在该坐席所在的组织机构和下属组织机构而言的。

创建角色

若果该角色需要能干预其他坐席人员的会话,则可授予会话监控,此处也是监控该坐席所在的组织机构和下属组织机构的。

一个春松客服登陆用户,具体有什么资源的访问,看到哪些数据,是通过其所在的组织机构及其下属组织机构,和该登陆用户的角色授予情况来判断的,因为一个资源,即有资源名称,又属于一个组织机构。

创建账号

参考账号管理创建账号后,将账号添加到组织机构和角色

下一步

坐席工作台的使用注意事项

创建网页聊天控件

配置机器人客服

春松客服系统维护:升级、备份、回退等

常见问题

#463

https://github.com/chatopera/cskefu/issues/463

问题:客户端点开客服每次都进入的排队 ,发现只有刷新后台的页面才会正常接入客服


解决:进入【系统设置-网页渠道-接入】,在【客服信息】中绑定单一技能组。

#378

https://github.com/chatopera/cskefu/issues/378

问题:访客打开网页聊天控件,提示等待


解决:没有坐席在线,需要按照上述建立有效的坐席人员,并有坐席人员登陆。春松客服部署好以后,默认只有`超级管理员`,这时直接建立网页渠道访问,超级管理员在线,就会出现提示等待。
- + \ No newline at end of file diff --git a/docs/licenses/index.html b/docs/licenses/index.html index 1a3115cd..dee78d0d 100644 --- a/docs/licenses/index.html +++ b/docs/licenses/index.html @@ -4,13 +4,13 @@ 使用授权 | 春松客服 - +
版本:v8

使用授权

春松客服以【使用授权证书】的形式收取服务费用。春松客服内置免费的可用的资源,赠送这些资源是为了帮助企业用户体验春松客服。

证书商店

春松客服使用授权证书是通过 Chatopera 证书商店( https://store.chatopera.com )分发的对【春松客服计费资源】进行管理的凭证,在使用春松客服的过程中,春松客服与 Chatopera 证书商店集成,完成证书购买、证书绑定、配额扣除、配额同步和开具发票等。

春松客服 v8 配额套餐包

春松客服 v8 使用授权证书导入分为三个步骤:

  • 购买使用授权证书
  • 复制使用授权证书标识
  • 导入春松客服 v8

购买使用授权证书

购买,使用说明等详细介绍,打开证书商店:

https://store.chatopera.com/product/cskefu001

复制使用授权证书标识

进入证书商店【证书】列表:

https://store.chatopera.com/store/license

找到刚刚购买的证书,进入详情页面。

点击【复制证书标识】,这是证书标识被复制到了系统粘贴板。

导入春松客服 v8

以超级管理员 【admin】的身份登录春松客服,导航至【系统管理-使用授权-授权证书列表】。

在弹出的表单中,粘贴【证书标识】,点击【立即提交】。

导入完成。

- + \ No newline at end of file diff --git a/docs/monitoring/index.html b/docs/monitoring/index.html index 3d5b646f..c4726383 100644 --- a/docs/monitoring/index.html +++ b/docs/monitoring/index.html @@ -4,13 +4,13 @@ 坐席监控 | 春松客服 - +
版本:v8

坐席监控

查看历史会话

左侧菜单 -> 会话历史 -> 历史会话

查看历史会话

查看当前会话

左侧菜单 -> 会话历史 -> 当前会话

查看排队队列

左侧菜单 -> 会话历史 -> 排队队列

查看访客留言

左侧菜单 -> 会话历史 -> 访客留言

查看满意度统计

左侧菜单 -> 统计功能 -> 满意度统计

查看满意度

查看全部坐席

左侧菜单 -> 会话历史 -> 坐席信息 -> 全部坐席

坐席监控

左侧菜单 -> 坐席监控

查看坐席监控

- + \ No newline at end of file diff --git a/docs/next/index.html b/docs/next/index.html index c15cdf7c..c330aef9 100644 --- a/docs/next/index.html +++ b/docs/next/index.html @@ -4,13 +4,13 @@ 春松客服 | 春松客服 - +
版本:Next

春松客服

Next 版本尚未进入研发。

请使用:

v8: 最新发行版本,积极维护中

v7: 上一个发行版本,已经不再积极维护

- + \ No newline at end of file diff --git a/docs/osc/contribution/index.html b/docs/osc/contribution/index.html index 8640f13c..90d8f0b4 100644 --- a/docs/osc/contribution/index.html +++ b/docs/osc/contribution/index.html @@ -4,14 +4,14 @@ 提交代码 | 春松客服 - +
-
版本:v8

提交代码

本文档的作用:详细的说明如何提交代码到春松客服。

成为开发者我得到什么

手里没有几百万,作为开发者,您如何拥有一个软件产品呢?参与开源项目协作。参与迭代春松客服,成为春松客服开发者,就是和众多有才华的人一道,做好开源客服系统,让您的潜能自由的发挥,在春松客服社区,您可以获得成就、朋友等很多财富。

作为一个开发者,加入春松客服开源社区就是和很多热爱软件研发的人一起做有经济价值的作品,春松客服是开放型组织,春松客服技术委员会主导社区发展,并以分润的形式合作共赢!通过社区高效率的协作体系,让您在工作之余,利用空闲时间产生更大的价值 - 提交 PR 到春松客服,在开源社区扮演关键角色!

本文撰写的主要目的,就是帮助您快速的掌握如何提交 PRwhat-is-pr 到春松客服。

视频教程

以下内容已经发布视频,观看地址:

视频和以下文档结合,可以更快的掌握提交代码的过程,建议先看视频后看文档。

前提准备

按照以下顺序安装依赖工具,这些操作过程中,Git Flow 的安装稍显麻烦,但是 Git Flow 是必要的,当您遇到问题,可以创建 Issue 来取得帮助

Bash 命令行终端

命令行终端推荐安装如下:

  • Windows: Git Bash
  • Mac: iTerm2
  • Linux: 不同 Linux 发布的默认的控制台工具即可

不同操作系统的 Bash 终端其命令行工具都是类似的,下文使用的命令也是通用的,下文以 Windows Git Bash 为例。

Git

完成以上工作,您就可以打开命令行终端,并执行命令:

Git Flow

Git Flow 是使用 Git 做研发软件协作的补充工具集,提供在 Git 命令基础上的最佳实践。下文将使用 Git Flow 简单高效的完成 PR 提交的流程。

安装好 Git Flow 后,通过命令行 git flow 来使用,不影响其它的 git 命令。

SSH Keys

生成 SSH 密钥文件,用于加密认证,使用 git 下载上传代码。如果您已经有了 SSH Keys 本步骤可以跳过,即:

$HOME/.ssh/id_rsa $HOME/.ssh/id_rsa.pub

其中,$HOME/.ssh/id_rsa 是私钥文件,您自己保留,不要公开共享;$HOME/.ssh/id_rsa.pub 是公钥,可以公开共享。

生成 SSH Keys 执行命令:

ssh-keygen -t rsa # 弹出选项都按 Enter

确认,系统路径存在 $HOME/.ssh/id_rsa.pub,执行命令:

cat $HOME/.ssh/id_rsa.pub

GitHub

  • 添加 Title 和 Key,即 SSH 公钥。

快速掌握

流程概述

整个提交 PR 的过程可以用以下时序图说明,我们将这个过程细化为十五步,实际上很简单,只需要按照描述完成一次,就可以掌握,而且除了第一个 PR,后面的 PR 只需要重复第 3-15 步。

提交 PR 流程概述

上图中,有三个仓库地址:

  • GitHub Upstream, 即仓库 https://github.com/cskefu/cskefu ,简称 Upstream Repo
  • GitHub Origin, 即 https://github.com/${个人 forked repo}$/cskefu,简称 Origin Repo
  • Localhost Repo,即您使用 git clone git@github.com:${个人 forked repo}/cskefu.git, 简称 Local Repo

以上三个仓库在下面有详细介绍,主要原则:

  • 工作前先有 Issue 号,比如 https://github.com/cskefu/cskefu/issues/897 的 Issue 号就是 879,以下也使用 #879 指代 Issue 879;
  • 代码最终进入 Upstream/develop 分支即属于进入春松客服,不要直接更改Local/develop 和 Origin/develop 分支,这两个 Repo 的 develop 分支的更新是通过 git pull upstream develop 来完成的。
  • 代码是由春松客服的 CodeOwners 合并进入 Upstream/develop 分支的。

1/15 Fork code repo

首先,打开 Upstream 网址 https://github.com/cskefu/cskefu,点击右侧的 Fork

选择克隆到空间,取消Copy the develop branch only 选择。

点击 Create fork,这时浏览器会跳转到 Origin Repo, 即您刚刚选择的空间下的 Repo 地址。

2/15 Clone code repo

使用 Bash 命令行终端,创建 Local repo,首先在浏览器中,获得 Origin Repo 的地址

执行命令如下:

mkdir ~/cskefu
cd ~/cskefu
git clone git@github.com:${个人 forked repo}/cskefu.git # 从浏览器中复制的地址

然后,进入春松客服 Local Repo,设置 Sign-off。

cd ~/cskefu/cskefu # 以下称此路径为 CSKEFU_ROOT
git config alias.ci "commit -s"
git config user.name "您的名字"
git config user.email "您的邮箱"

该命令的作用是,在 CSKEFU_ROOT 下执行 git ci -m "xxx" 以完成签署 DCOwhat-is-dco

接下来,配置 upstream。

cd ~/cskefu/cskefu
git remote add upstream https://github.com/cskefu/cskefu.git

最后,初始化 Git Flow,执行

cd ~/cskefu/cskefu
git flow init

该命令会启动一个交互问答,按照如下设置,使用 Enter 进入下一个直至完成。

修改,如果设置错误,可以在运行了上述命令后,编辑 .git/config 文件。上面的主要步骤,围绕 CSKEFU_ROOT/.git/config 文件,执行后看起来如下:

[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
ignorecase = true
[remote "origin"]
url = git@github.com:${个人 forked repo}/cskefu.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "develop"]
remote = origin
merge = refs/heads/develop
[remote "upstream"]
url = https://github.com/cskefu/cskefu.git
fetch = +refs/heads/*:refs/remotes/upstream/*
[branch "master"]
remote = origin
merge = refs/heads/master
[gitflow "branch"]
master = master
develop = develop
[gitflow "prefix"]
feature = feature/
bugfix = bugfix/
release = release/
hotfix = hotfix/
support = support/
versiontag =
[gitflow "path"]
hooks = C:/Users/Administrator/git/cskefu/.git/hooks
[alias]
ci = commit -s
[user]
name = Zhang San
email = zhangsan@xyz.com

3/15 New local branch

对于提交的代码,是以 Git Commits 为单位的,每个 Git Commit 需要关联一个 GitHub Isssue 号,所以,先找到工作的 Issues:

https://github.com/cskefu/cskefu/issues

假设,我们有了一个 GitHub Issue #NUMBER,比如 #879,这个 Issue 是一个新功能,那么,我们这样开始工作:

# 建立新的分支
cd ~/cskefu/cskefu
git flow feature start 879 # 执行,然后得到下面的提示信息
Switched to a new branch 'feature/879'

Summary of actions:
- A new branch 'feature/879' was created, based on 'develop'
- You are now on branch 'feature/879'

Now, start committing on your feature. When done, use:

git flow feature finish 879

如上介绍,现在 Git 自动切换了新的分支,我们就在这个分支下调整代码。 -显示了工作中的分支,您可以用命令 git branch 查看:

4/15 Commit sign-off codes

假设,我们已经调整完成了代码,通过 git status 查看变更的状态:

现在我们就可以提交代码了,执行以下的命令:

cd ~/cskefu/cskefu
git add --all
git ci -m "#879 调整了 XXX" # 简要描述

注意,此处使用了 git ci,即是前文介绍的 DCO 签名,没有签名的 commit 的 PR 是不被接受的。

5/15 Git flow publish

下一步,将 Local Repo 的 Commit 发布到 Origin Repo 中,使用如下命令:

cd ~/cskefu/cskefu
git flow feature publish

在执行了上述命令后,得到提示:

透露的信息是:1)Origin repo 的 'feature/879' 分支被新建或更新了,2)Local repo 的 'feature/879' 分支用来跟踪 Origin/feature/879 的变化。

6/15 Open new PR

需要注意的是,上一步的提示消息中,有一个 URL 地址:

https://github.com/${个人 forked repo}/cskefu/pull/new/feature/879

复制这个地址,并在浏览器中打开:

这个就是创建 PR 的界面,通过调整标题,正文,更好的描述本次变更的原因。然后点击右下角的 【Create pull request】。

7/15 Set PR settings

提交后,浏览器自动跳转到新建立的 PR 页面,比如 https://github.com/cskefu/cskefu/pull/900

在这个页面,可以得到和添加更多的信息,比如查看审核者(Reviewers),只有达到:

  • Code 审核通过的人数超过设定(目前为 1 人),目前,审核者是自动设置的,详细的规则查看:春松客服的 CodeOwners
  • Code Review 没有讨论中的会话
  • PR 的自动检查通过

PR 才可以由 CodeOwners 进行合并,分别对应 PR 页面中的下图部分的状态:

8/15 Checks on PR

在 PR 页面,您会看到类似的信息:

代表当前的 PR 自动检查通过,但是也可能发生不通过的情况,此时进入第 10/15 步解决。

9/15 Code reviews

在 PR 页面,您会看到类似的信息:

代表当前还需要完成 Code Review 工作,该 PR 才能被合并。

此时,Code Reviewer 会收到通知,Code Reviewer 会在 PR 的下面页面给与反馈:1)Comment/Request Changes - 代码还需要做一些调整,进入 10/15 步;2) Approve - 通过。

通过 Checks 和 Review,代码会自动进入 upstream/develop 分支。

10/15 Modify codes

由于 PR Checks 或 Review 没有通过,那么根据反馈需要更改代码,进行如下操作。

  • cd ~/cskefu/cskefu
  • 确认 Local repo 所在分支为 feature/879;如果当前不在这个分支,使用 git checkout feature/879 切换回这个分支
  • 调整代码,直到可以再次提交

11/15 Re-push codes

执行命令:

cd ~/cskefu/cskefu
git add --all
git ci -m "#879 再次调整 XXX"
git push origin feature/879

12/15 Checks on PR

回到前次创建的 PR 页面,在 Commits 页面,我们看到,已经有了第二次的提交。

此时,再次执行了 Checks。

13/15 Code reviews again

这时候,Code Reviewer 再次收到提示,进行代码 Reviews。您也可以在 PR 上与 Reviewers 交互,如下图。

14/15 PR merged

假设,这次 Checks 和 Reviews 通过,满足了合并的需求,因为前文我们设置了【Auto-merge】,现在代码就会直接进入 upstream/develop 分支。

您也可以在 develop 分支确认:

点击 commits

15/15 Pull to local

现在,您的 PR 提交完成了,但是您的 Origin 和 Local Repo 的 develop 分支,还和 Upstream develop 不同步,继续执行以下操作:

cd ~/cskefu/cskefu
git checkout develop
git pull upstream develop
git push origin develop

作为候选,您可以删除本地的 feature 分支:

git branch -d feature/879

春松客服是最流行的开源客服系统,现在已经在企业部署超过 19,000 次,为数百政府机构、事业单位和企业上线智能客服系统,现在您是春松客服的开发者一员了!

春松客服会尽快的将您添加到贡献者列表!

常见问题

如何确定工作的 Issue

Issue 即工作的内容,记录在春松客服的工单(Issue)中,可以创建根据您自己的需要创建工单,或者选择一个已有的工单。

如何搭建开发环境

开发环境搭建,包括下载源码、安装 IDE、启动数据库和配置项目等。

详细内容,参考文档开发环境搭建

如何快速入门定制春松客服

春松客服社区发布了《春松客服大讲堂》,快速的入门以及熟悉开发技能。

在《春松客服大讲堂》中,有很多知识内容,而单元测试、AOP 变成、自动化测试等也涉及,内容丰富。

如何快速掌握 Git

Git 用于版本管理,使用 Git 时,一个文件有三个可能存在的地方:indexed(索引区),staged(暂存区) 和 workarea(工作区)。indexed 文件就是被索引了(提交了);staged 就是被临时的保存了(暂未提交,保护一下);workarea,在编辑器中打开的这份。

Git 使用概述

上图中 master 所在区就是 indexed。

Git 的版本管理,就是指这三个层面同一个文件的差异。

Git add: 从 workarea 添加到 staged

Git commit: 从 staged 到 indexed

当然还有不同的方向,这构成了 git checkout, git stash, git restore, git reset, git clean 等命令。

当本地的 Git 库和它的远程的 Git 库同步时,就涉及使用 git push 和 git pull。

以上是对 Git 的简要介绍,快速入门 Git,首先熟悉它的远离,比如以上;其次,做一些练习,比如使用 practice-git

如何成为一个优秀的开发者

要从工作中获得更多快乐,同时也为了不断涨薪,就需要不断的前进,依赖于心态。

这是一个比提升技能更需要时间和重视的部分,一个好的开发者的心态,可以和一个觉悟者相提并论了,那些个看不到、摸不着的字节,完成你的复杂的逻辑,需要你保持稳定和理性的状态。

这方面有很多好的读物,比如《程序员修炼之道:从小工到专家》《冥想》《程序员的自我修养——链接、装载与库》。这几本书,值得常看,常看可以常新。尤其是《冥想》,每天早晚各十分钟冥想,坚持 90 天,保证你成为程序员中的大师!


  1. 什么是 PR?即 PullRequest,是合并代码的申请,春松客服的 PR 列表见 https://github.com/cskefu/cskefu/pulls
  2. 什么是 DCO?DCO 是一种贡献者协议,代表您有权力将代码贡献至开源社区,春松客服合并的代码必须有 DCO 或 CLA 协议,详细介绍 https://www.cskefu.com/2022/10/19/vote-cla-dco-result/
- +
版本:v8

提交代码

本文档的作用:详细的说明如何提交代码到春松客服。

成为开发者我得到什么

手里没有几百万,作为开发者,您如何拥有一个软件产品呢?参与开源项目协作。参与迭代春松客服,成为春松客服开发者,就是和众多有才华的人一道,做好开源客服系统,让您的潜能自由的发挥,在春松客服社区,您可以获得成就、朋友等很多财富。

作为一个开发者,加入春松客服开源社区就是和很多热爱软件研发的人一起做有经济价值的作品,春松客服是开放型组织,春松客服技术委员会主导社区发展,并以分润的形式合作共赢!通过社区高效率的协作体系,让您在工作之余,利用空闲时间产生更大的价值 - 提交 PR 到春松客服,在开源社区扮演关键角色!

本文撰写的主要目的,就是帮助您快速的掌握如何提交 PRwhat-is-pr 到春松客服。

视频教程

以下内容已经发布视频,观看地址:

视频和以下文档结合,可以更快的掌握提交代码的过程,建议先看视频后看文档。

前提准备

按照以下顺序安装依赖工具,这些操作过程中,Git Flow 的安装稍显麻烦,但是 Git Flow 是必要的,当您遇到问题,可以创建 Issue 来取得帮助

Bash 命令行终端

命令行终端推荐安装如下:

  • Windows: Git Bash
  • Mac: iTerm2
  • Linux: 不同 Linux 发布的默认的控制台工具即可

不同操作系统的 Bash 终端其命令行工具都是类似的,下文使用的命令也是通用的,下文以 Windows Git Bash 为例。

Git

完成以上工作,您就可以打开命令行终端,并执行命令:

Git Flow

Git Flow 是使用 Git 做研发软件协作的补充工具集,提供在 Git 命令基础上的最佳实践。下文将使用 Git Flow 简单高效的完成 PR 提交的流程。

安装好 Git Flow 后,通过命令行 git flow 来使用,不影响其它的 git 命令。

SSH Keys

生成 SSH 密钥文件,用于加密认证,使用 git 下载上传代码。如果您已经有了 SSH Keys 本步骤可以跳过,即:

$HOME/.ssh/id_rsa $HOME/.ssh/id_rsa.pub

其中,$HOME/.ssh/id_rsa 是私钥文件,您自己保留,不要公开共享;$HOME/.ssh/id_rsa.pub 是公钥,可以公开共享。

生成 SSH Keys 执行命令:

ssh-keygen -t rsa # 弹出选项都按 Enter

确认,系统路径存在 $HOME/.ssh/id_rsa.pub,执行命令:

cat $HOME/.ssh/id_rsa.pub

GitHub

  • 添加 Title 和 Key,即 SSH 公钥。

快速掌握

流程概述

整个提交 PR 的过程可以用以下时序图说明,我们将这个过程细化为十五步,实际上很简单,只需要按照描述完成一次,就可以掌握,而且除了第一个 PR,后面的 PR 只需要重复第 3-15 步。

提交 PR 流程概述

上图中,有三个仓库地址:

  • GitHub Upstream, 即仓库 https://github.com/cskefu/cskefu ,简称 Upstream Repo
  • GitHub Origin, 即 https://github.com/${个人 forked repo}$/cskefu,简称 Origin Repo
  • Localhost Repo,即您使用 git clone git@github.com:${个人 forked repo}/cskefu.git, 简称 Local Repo

以上三个仓库在下面有详细介绍,主要原则:

  • 工作前先有 Issue 号,比如 https://github.com/cskefu/cskefu/issues/897 的 Issue 号就是 879,以下也使用 #879 指代 Issue 879;
  • 代码最终进入 Upstream/develop 分支即属于进入春松客服,不要直接更改Local/develop 和 Origin/develop 分支,这两个 Repo 的 develop 分支的更新是通过 git pull upstream develop 来完成的。
  • 代码是由春松客服的 CodeOwners 合并进入 Upstream/develop 分支的。

1/15 Fork code repo

首先,打开 Upstream 网址 https://github.com/cskefu/cskefu,点击右侧的 Fork

选择克隆到空间,取消Copy the develop branch only 选择。

点击 Create fork,这时浏览器会跳转到 Origin Repo, 即您刚刚选择的空间下的 Repo 地址。

2/15 Clone code repo

使用 Bash 命令行终端,创建 Local repo,首先在浏览器中,获得 Origin Repo 的地址

执行命令如下:

mkdir ~/cskefu
cd ~/cskefu
git clone git@github.com:${个人 forked repo}/cskefu.git # 从浏览器中复制的地址

然后,进入春松客服 Local Repo,设置 Sign-off。

cd ~/cskefu/cskefu # 以下称此路径为 CSKEFU_ROOT
git config alias.ci "commit -s"
git config user.name "您的名字"
git config user.email "您的邮箱"

该命令的作用是,在 CSKEFU_ROOT 下执行 git ci -m "xxx" 以完成签署 DCOwhat-is-dco

接下来,配置 upstream。

cd ~/cskefu/cskefu
git remote add upstream https://github.com/cskefu/cskefu.git

最后,初始化 Git Flow,执行

cd ~/cskefu/cskefu
git flow init

该命令会启动一个交互问答,按照如下设置,使用 Enter 进入下一个直至完成。

修改,如果设置错误,可以在运行了上述命令后,编辑 .git/config 文件。上面的主要步骤,围绕 CSKEFU_ROOT/.git/config 文件,执行后看起来如下:

[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
ignorecase = true
[remote "origin"]
url = git@github.com:${个人 forked repo}/cskefu.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "develop"]
remote = origin
merge = refs/heads/develop
[remote "upstream"]
url = https://github.com/cskefu/cskefu.git
fetch = +refs/heads/*:refs/remotes/upstream/*
[branch "master"]
remote = origin
merge = refs/heads/master
[gitflow "branch"]
master = master
develop = develop
[gitflow "prefix"]
feature = feature/
bugfix = bugfix/
release = release/
hotfix = hotfix/
support = support/
versiontag =
[gitflow "path"]
hooks = C:/Users/Administrator/git/cskefu/.git/hooks
[alias]
ci = commit -s
[user]
name = Zhang San
email = zhangsan@xyz.com

3/15 New local branch

对于提交的代码,是以 Git Commits 为单位的,每个 Git Commit 需要关联一个 GitHub Isssue 号,所以,先找到工作的 Issues:

https://github.com/cskefu/cskefu/issues

假设,我们有了一个 GitHub Issue #NUMBER,比如 #879,这个 Issue 是一个新功能,那么,我们这样开始工作:

# 建立新的分支
cd ~/cskefu/cskefu
git flow feature start 879 # 执行,然后得到下面的提示信息
Switched to a new branch 'feature/879'

Summary of actions:
- A new branch 'feature/879' was created, based on 'develop'
- You are now on branch 'feature/879'

Now, start committing on your feature. When done, use:

git flow feature finish 879

如上介绍,现在 Git 自动切换了新的分支,我们就在这个分支下调整代码。 +显示了工作中的分支,您可以用命令 git branch 查看:

4/15 Commit sign-off codes

假设,我们已经调整完成了代码,通过 git status 查看变更的状态:

现在我们就可以提交代码了,执行以下的命令:

cd ~/cskefu/cskefu
git add --all
git ci -m "#879 调整了 XXX" # 简要描述

注意,此处使用了 git ci,即是前文介绍的 DCO 签名,没有签名的 commit 的 PR 是不被接受的。

5/15 Git flow publish

下一步,将 Local Repo 的 Commit 发布到 Origin Repo 中,使用如下命令:

cd ~/cskefu/cskefu
git flow feature publish

在执行了上述命令后,得到提示:

透露的信息是:1)Origin repo 的 'feature/879' 分支被新建或更新了,2)Local repo 的 'feature/879' 分支用来跟踪 Origin/feature/879 的变化。

6/15 Open new PR

需要注意的是,上一步的提示消息中,有一个 URL 地址:

https://github.com/${个人 forked repo}/cskefu/pull/new/feature/879

复制这个地址,并在浏览器中打开:

这个就是创建 PR 的界面,通过调整标题,正文,更好的描述本次变更的原因。然后点击右下角的 【Create pull request】。

7/15 Set PR settings

提交后,浏览器自动跳转到新建立的 PR 页面,比如 https://github.com/cskefu/cskefu/pull/900

在这个页面,可以得到和添加更多的信息,比如查看审核者(Reviewers),只有达到:

  • Code 审核通过的人数超过设定(目前为 1 人),目前,审核者是自动设置的,详细的规则查看:春松客服的 CodeOwners
  • Code Review 没有讨论中的会话
  • PR 的自动检查通过

PR 才可以由 CodeOwners 进行合并,分别对应 PR 页面中的下图部分的状态:

8/15 Checks on PR

在 PR 页面,您会看到类似的信息:

代表当前的 PR 自动检查通过,但是也可能发生不通过的情况,此时进入第 10/15 步解决。

9/15 Code reviews

在 PR 页面,您会看到类似的信息:

代表当前还需要完成 Code Review 工作,该 PR 才能被合并。

此时,Code Reviewer 会收到通知,Code Reviewer 会在 PR 的下面页面给与反馈:1)Comment/Request Changes - 代码还需要做一些调整,进入 10/15 步;2) Approve - 通过。

通过 Checks 和 Review,代码会自动进入 upstream/develop 分支。

10/15 Modify codes

由于 PR Checks 或 Review 没有通过,那么根据反馈需要更改代码,进行如下操作。

  • cd ~/cskefu/cskefu
  • 确认 Local repo 所在分支为 feature/879;如果当前不在这个分支,使用 git checkout feature/879 切换回这个分支
  • 调整代码,直到可以再次提交

11/15 Re-push codes

执行命令:

cd ~/cskefu/cskefu
git add --all
git ci -m "#879 再次调整 XXX"
git push origin feature/879

12/15 Checks on PR

回到前次创建的 PR 页面,在 Commits 页面,我们看到,已经有了第二次的提交。

此时,再次执行了 Checks。

13/15 Code reviews again

这时候,Code Reviewer 再次收到提示,进行代码 Reviews。您也可以在 PR 上与 Reviewers 交互,如下图。

14/15 PR merged

假设,这次 Checks 和 Reviews 通过,满足了合并的需求,因为前文我们设置了【Auto-merge】,现在代码就会直接进入 upstream/develop 分支。

您也可以在 develop 分支确认:

点击 commits

15/15 Pull to local

现在,您的 PR 提交完成了,但是您的 Origin 和 Local Repo 的 develop 分支,还和 Upstream develop 不同步,继续执行以下操作:

cd ~/cskefu/cskefu
git checkout develop
git pull upstream develop
git push origin develop

作为候选,您可以删除本地的 feature 分支:

git branch -d feature/879

春松客服是最流行的开源客服系统,现在已经在企业部署超过 19,000 次,为数百政府机构、事业单位和企业上线智能客服系统,现在您是春松客服的开发者一员了!

春松客服会尽快的将您添加到贡献者列表!

常见问题

如何确定工作的 Issue

Issue 即工作的内容,记录在春松客服的工单(Issue)中,可以创建根据您自己的需要创建工单,或者选择一个已有的工单。

如何搭建开发环境

开发环境搭建,包括下载源码、安装 IDE、启动数据库和配置项目等。

详细内容,参考文档开发环境搭建

如何快速入门定制春松客服

春松客服社区发布了《春松客服大讲堂》,快速的入门以及熟悉开发技能。

在《春松客服大讲堂》中,有很多知识内容,而单元测试、AOP 变成、自动化测试等也涉及,内容丰富。

如何快速掌握 Git

Git 用于版本管理,使用 Git 时,一个文件有三个可能存在的地方:indexed(索引区),staged(暂存区) 和 workarea(工作区)。indexed 文件就是被索引了(提交了);staged 就是被临时的保存了(暂未提交,保护一下);workarea,在编辑器中打开的这份。

Git 使用概述

上图中 master 所在区就是 indexed。

Git 的版本管理,就是指这三个层面同一个文件的差异。

Git add: 从 workarea 添加到 staged

Git commit: 从 staged 到 indexed

当然还有不同的方向,这构成了 git checkout, git stash, git restore, git reset, git clean 等命令。

当本地的 Git 库和它的远程的 Git 库同步时,就涉及使用 git push 和 git pull。

以上是对 Git 的简要介绍,快速入门 Git,首先熟悉它的远离,比如以上;其次,做一些练习,比如使用 practice-git

如何成为一个优秀的开发者

要从工作中获得更多快乐,同时也为了不断涨薪,就需要不断的前进,依赖于心态。

这是一个比提升技能更需要时间和重视的部分,一个好的开发者的心态,可以和一个觉悟者相提并论了,那些个看不到、摸不着的字节,完成你的复杂的逻辑,需要你保持稳定和理性的状态。

这方面有很多好的读物,比如《程序员修炼之道:从小工到专家》《冥想》《程序员的自我修养——链接、装载与库》。这几本书,值得常看,常看可以常新。尤其是《冥想》,每天早晚各十分钟冥想,坚持 90 天,保证你成为程序员中的大师!


  1. 什么是 PR?即 PullRequest,是合并代码的申请,春松客服的 PR 列表见 https://github.com/cskefu/cskefu/pulls
  2. 什么是 DCO?DCO 是一种贡献者协议,代表您有权力将代码贡献至开源社区,春松客服合并的代码必须有 DCO 或 CLA 协议,详细介绍 https://www.cskefu.com/2022/10/19/vote-cla-dco-result/
+ \ No newline at end of file diff --git a/docs/osc/devonboard/index.html b/docs/osc/devonboard/index.html index 0496e87c..6764c4b6 100644 --- a/docs/osc/devonboard/index.html +++ b/docs/osc/devonboard/index.html @@ -4,18 +4,18 @@ 成为春松客服开发者 | 春松客服 - +
-
版本:v8

成为春松客服开发者

当您有软件开发技能,在您加入春松客服飞书群后,接下来怎么参与春松客服社区建设呢?成为春松客服开发者!

成为开发者,我能得到什么

开发软件并满足用户的需求,对于春松客服而言是一件严肃的事情,因为春松客服的用户是企业的客服部门,客户服务对于企业的重要性毫无疑问:非常重要。春松客服承诺,为用户提供高品质的开源客服系统!

成为春松客服开发者后,通过贡献代码,取得认可,可进一步的成为春松客服核心开发者。

如何成为春松客服的开发者呢?

虽然您可能刚刚工作,对软件开发工作还不熟悉,但是在春松客服社区的帮助下,您也可以很快的成为春松客服开发者,这是因为面对刚刚加入的开发者,我们提供了如下的支持帮助您快速融入春松客服开源社区:我们称这个流程为春松客服开发者 Onboard 流程(简称 Dev Onboard)。

Step 1. 完成第一个 PR

春松客服社区已经有了非常详细的描述如何提交 PR 到春松客服的文档,

https://docs.cskefu.com/docs/osc/contribution

但是,作为每个新加入的开发者的第一个 PR,我们会尽可能的专注于帮助您掌握【提交 PR 的工具链】的使用,降低具体的源码改动的难度。同时,这一步骤,会由春松客服技术专家(联系方式见后文:人员联系方式)协助您完成。第一个 PR 的具体工作:

  • 首先,春松客服技术专家会创建一个 Issue,标题:某某某的第一个 PR;内容:修改文件 pr1st.md,添加一行 某某某 @ 日期。并委派给您,这需要您事先准备 GitHub 账号,此时您得到了一个 Issue 及其 Issue 号。 +
    版本:v8

    成为春松客服开发者

    当您有软件开发技能,在您加入春松客服飞书群后,接下来怎么参与春松客服社区建设呢?成为春松客服开发者!

    成为开发者,我能得到什么

    开发软件并满足用户的需求,对于春松客服而言是一件严肃的事情,因为春松客服的用户是企业的客服部门,客户服务对于企业的重要性毫无疑问:非常重要。春松客服承诺,为用户提供高品质的开源客服系统!

    成为春松客服开发者后,通过贡献代码,取得认可,可进一步的成为春松客服核心开发者。

    如何成为春松客服的开发者呢?

    虽然您可能刚刚工作,对软件开发工作还不熟悉,但是在春松客服社区的帮助下,您也可以很快的成为春松客服开发者,这是因为面对刚刚加入的开发者,我们提供了如下的支持帮助您快速融入春松客服开源社区:我们称这个流程为春松客服开发者 Onboard 流程(简称 Dev Onboard)。

    Step 1. 完成第一个 PR

    春松客服社区已经有了非常详细的描述如何提交 PR 到春松客服的文档,

    https://docs.cskefu.com/docs/osc/contribution

    但是,作为每个新加入的开发者的第一个 PR,我们会尽可能的专注于帮助您掌握【提交 PR 的工具链】的使用,降低具体的源码改动的难度。同时,这一步骤,会由春松客服技术专家(联系方式见后文:人员联系方式)协助您完成。第一个 PR 的具体工作:

    • 首先,春松客服技术专家会创建一个 Issue,标题:某某某的第一个 PR;内容:修改文件 pr1st.md,添加一行 某某某 @ 日期。并委派给您,这需要您事先准备 GitHub 账号,此时您得到了一个 Issue 及其 Issue 号。
    • 然后,根据文档《如何提交 PR 到春松客服》, 您提交 PR,在这期间遇到任何困难,任何困难,请找春松客服技术专家取得帮助,可以在 GitHub Issue、飞书、微信等渠道,取得一对一的帮助。
    • 这一步的完成,是该调整最终合并到了 github.com/cskefu/cskefu:develop 分支上,然后您关闭 Issue,关闭按钮如下。

    Step 2. 领取开发任务

    在 Step 1 中,您还没有对春松客服产品做任何改动,在完成了 Step 1 后,您和春松客服产品经理联系(联系方式见后文:人员联系方式),你们一起来商定具体的开发任务,也是某个 Issue。春松客服产品经理根据用户需求设计春松客服的界面、功能和接口定义等,这些和业务关系紧密的工作统称为设计工作,您的任务和具体的春松客服功能对应时,由产品经理帮助您理解设计和背景,可能某些更细节的设计也需要在实现阶段继续的探讨。所以,春松客服的研发工作,就是【计划-设计-实现-测试-用户反馈-计划】的循环的流水线,现在您和春松客服产品经理的协作处于设计阶段。

    等您有了一个开发任务,就进入到了实现阶段,在实现阶段,您会继续取得来自社区的支持,我们都主要以 GitHub Issue 和 PR 的方式进行协作,因为公开的方式可以提升集体协作的效率,当您发布了问题后,您可以主动的联系相关的人,当您不知道联系谁的时候,您可以:

    • 需求、设计、里程碑方面的问题,找春松客服产品经理
    • 实现、技术问题、开发环境搭建、PR Review 等,找春松客服技术专家
    • 其它问题,找春松客服总工程师 -

    Step 3. 提交 PR

    完成了 Step 1 和 Step 2 后,您就可以独立的实现某个任务了,记住,您是独立的,但是并不孤独,需要帮助的时候,随时向社区提出!

    当您提交了第一个和开发任务相关的 PR,该 PR 进入 Code Review 状态,您就完成了第三步。

    恭喜并感谢您,成为春松客服开发者!

    成为核心开发者

    在您完成 Dev Onboard 流程 1 个月后,即第三步中提交第一个和第二步开发任务相关的 PR 后,春松客服技术委员会进行投票,决定是否接受您成为春松客服核心开发者。如果这次投票没有通过,那么您可以继续的做贡献,将来还有第二次投票时机,因为春松客服需要很多核心开发者,春松客服技术委员会会尽可能多的提名核心开发者,高频率的投票(比如每个月一次)。

    人员联系方式

    社区角色昵称邮箱Profile
    产品经理Kaifunykaifanzhang@cskefu.comhttps://github.com/kaifuny
    技术专家刘勇ly@cskefu.comhttps://github.com/lecjy
    春松客服总工程师Hai Liang W.h@cskefu.comhttps://github.com/hailiang-wang
    春松客服技术委员会N/Atc@cskefu.com春松客服技术委员会协作体系
- +

Step 3. 提交 PR

完成了 Step 1 和 Step 2 后,您就可以独立的实现某个任务了,记住,您是独立的,但是并不孤独,需要帮助的时候,随时向社区提出!

当您提交了第一个和开发任务相关的 PR,该 PR 进入 Code Review 状态,您就完成了第三步。

恭喜并感谢您,成为春松客服开发者!

成为核心开发者

在您完成 Dev Onboard 流程 1 个月后,即第三步中提交第一个和第二步开发任务相关的 PR 后,春松客服技术委员会进行投票,决定是否接受您成为春松客服核心开发者。如果这次投票没有通过,那么您可以继续的做贡献,将来还有第二次投票时机,因为春松客服需要很多核心开发者,春松客服技术委员会会尽可能多的提名核心开发者,高频率的投票(比如每个月一次)。

人员联系方式

社区角色昵称邮箱Profile
产品经理Kaifunykaifanzhang@cskefu.comhttps://github.com/kaifuny
技术专家刘勇ly@cskefu.comhttps://github.com/lecjy
春松客服总工程师Hai Liang W.h@cskefu.comhttps://github.com/hailiang-wang
春松客服技术委员会N/Atc@cskefu.com春松客服技术委员会协作体系
+ \ No newline at end of file diff --git a/docs/osc/engineering/index.html b/docs/osc/engineering/index.html index 93c0111a..6831af19 100644 --- a/docs/osc/engineering/index.html +++ b/docs/osc/engineering/index.html @@ -4,13 +4,13 @@ 开发环境搭建 | 春松客服 - +
-
版本:v8

开发环境搭建

本文介绍如何完成春松客服开发环境的搭建,面向企业/开发者提供关于春松客服二次开发的相关知识,从入门到掌握全部开发技能请学习《春松客服大讲堂》

本文档针对春松客服 v8 版本,该版本对应的代码参考链接

依赖

开发环境依赖,提前准备好:

以上安装,也涉及环境变量 PATH 配置正确。在命令行终端中执行以下命令,能够正确输出对应的版本号。

java --version
mvn --version # eg. Apache Maven 3.9.2
git --version # eg. git version 2.39.2
提示

Docker 或 Docker compose 可以安装到 Linux/Windows/Mac 上,Docker 在开发阶段用来启动数据库、中间件。

1. 安装 Java SDK

春松客服使用 Amazon Corretto SDK 17,原因:

  • 兼容 OpenJDK 标准
  • 良好的开源社区,可长期商业友好的使用,Amazon 发布,James Gosling 领导
  • 适应不同操作系统
注意

春松客服不使用其它版本的 JDK,如有其它 JDK 诉求自行测试:理论上,所有 OpenJDK 17 的 JVM 都是可以运行春松客服的。

2. 配置 Maven

确保在 pom.xml 中存在如下的 maven 仓库配置。

Chatopera Nexus 是代理 Maven Central,Alibaba Maven Repo 等节点的混合 Maven Repository,使用 Chatopera Nexus 不会影响项目使用其它公共包(Artifacts)

<repositories><repository>内存在:

    <repositories>
<repository>
<id>chatopera</id>
<name>Chatopera Inc.</name>
<url>https://nexus.chatopera.com/repository/maven-public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>

配置文件的示例见 pom.xml

如配置后不能下载,请参考配置文件

克隆项目

1. 准备 GitHub 账号

  • 注册地址,该注册依赖于邮箱。注册完成后,进行登录。

  • 添加 SSH Key:

    • 在 Terminal 命令行终端(Git Bash, Windows)执行命令 ssh-keygen,得到文件 ~/.ssh/id_rsa.pub 并复制其文本内容到粘贴板。

    • 打开 SSH Keys 管理地址,点击【New SSH Key】,使用粘贴板内容创建一个 SSH KEY。

2. Fork 源码

打开 春松客服项目地址,点击右上角【Fork】按钮,根据提示选择空间。

Fork 源码

克隆后,该项目源码将被复制到该空间,新的项目地址类似如下:

https://github.com/${YOUR_SPACE}/cskefu  # ${YOUR_SPACE} 代表您的空间名称

3. 下载源码

克隆项目,就是将上面新建的项目的源码,下载到计算机,使用命令行终端执行:

git clone https://github.com/${YOUR_SPACE}/cskefu.git cskefu
# 默认为 develop 分支, develop 分支为当前发行版本的维护分支
# 以下,使用 cskefu 代表源码所在路径

4. 添加 Upstream

Upstream 指春松客服 GitHub Repo https://github.com/cskefu/cskefu,就是春松客服的项目库核心分支。添加 Upstream 的目的,是之后从春松客服项目拉取更新代码。

cd cskefu
git remote add upstream git@github.com:cskefu/cskefu.git

完成以上步骤,克隆项目完毕。


希望给春松客服点赞,点击【Fork】旁边的【Star】按钮。

给春松客服点赞

文件目录介绍

文件目录介绍

目录说明
_m2用于 Dockerfile 中,构建镜像
admin各种脚本
app源代码
config数据库文件
data数据库数据
logs日志

春松客服是基于 Java 开发到,使用 Maven 维护项目声明周期。使用 Maven 命令,生成项目,方便导入到 IDE 中。

配置启动参数

春松客服是基于 Spring Boot Release 3.x 开发,配置文件是

cskefu/contact-center/app/src/main/resources/application.properties

该文件配置数据库(后文介绍搭建数据库)连接等其他信息,参考该文件。

有以下两个方式进行参数配置:

  1. 使用 application-dev.properties;

  2. 使用环境变量。

1. 使用 Profile 文件

使用 application-dev.properties 覆盖默认配置。

  • 设置环境变量
export SPRING_PROFILES_ACTIVE=dev
  • 创建 application-dev.properties
touch contact-center/app/src/main/resources/application-dev.properties
  • 添加内容如下:
# MySQL
spring.datasource.url=jdbc:mysql://localhost:8037/cosinee?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123456

# Redis服务器连接端口
spring.data.redis.host=localhost
spring.data.redis.port=8041
# Redis服务器连接密码(默认为空)
spring.data.redis.password=123456

# ActiveMQ
spring.activemq.broker-url=tcp://localhost:8052
spring.activemq.user=admin
spring.activemq.password=123456
spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=50
注意

此处可以覆盖 application.properties 中的任何值。

2. 环境变量

application.properties 中的每一项都可以通过环境变量进行配置,实现覆盖 application.properties 中等配置。

映射方式为 .properties 文件中的键,转为大写的同时 .- 转为 _

示例部分环境变量, 如下所示:

export SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/contactcenter?useUnicode=true&characterEncoding=UTF-8
export SPRING_DATASOURCE_USERNAME=root
export SPRING_DATASOURCE_PASSWORD=123456
说明

比如,SPRING_DATASOURCE_URL 对应了 application.properties 文件中的 spring.datasource.url

注意

环境变量的值优先级高于 .properties 文件。

提示:在生产环境部署,建议使用环境变量方式配置。

春松客服 Docker 容器的配置,使用了环境变量的方式,参考文件docker-compose.yml

数据库搭建

默认使用 docker-compose 启动服务,用于快速准备开发环境。描述文件地址 docker-compose.yml

为了减少开发环境搭建可能遇到的问题,使用 docker-compose.yml 中的 docker 镜像启动以下服务,尤其是春松客服对于一些软件的版本有要求,我们强烈建议开发者在入门春松客服开发的阶段,安装 docker 和 docker-compose,并按照下面的步骤配置开发环境。

项目依赖数据库,可以用一行命令启动:

cd cskefu
docker-compose up -d mysql activemq redis

另外,不同的数据库服务分别部署在不同计算机或服务器,以节省开发机器的资源。

以下也给出如何逐个启动,如何修改配置文件。

1. ActiveMQ

春松客服依赖 ActiveMQ 服务,可以通过以下命令进行创建:

cd cskefu
docker-compose up -d activemq

application.properties 文件中,ActiveMQ 的配置项如下:

spring.activemq.broker-url=tcp://localhost:8052
spring.activemq.user=admin
spring.activemq.password=123456
spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=50

请根据你的实际情况修改 application.properties 文件中的配置项。

ActiveMQ 管理工具,使用浏览器打开,http://YOUR_ACTIVEMQ_IP:PORT。PORT 默认是 8051,即环境变量 ACTIVEMQ_PORT1

示例界面如下:

ActiveMQ 管理工具

点击【Manage ActiveMQ broker

用户名密码
admin123456

2. MySQL

春松客服依赖 MySQL 服务,可以通过以下命令进行创建:

cd cskefu
docker-compose up -d mysql

MySQL 容器启动后,需要手动创建春松客服数据库。

数据库客户端连接 MySQL 服务

安装 DBMS 管理工具 MySQL Workbench,下载地址:https://dev.mysql.com/downloads/workbench/

MySQL Workbench 下载

在 Windows 上,MySQL Workbench 依赖 Visual C++ Redistributable,需要提前安装。

MySQL Workbench 安装

执行 SQL 文件

使用以上命令,通过 docker-compose 启动的 MySQL 服务,其连接认证信息如下:

IP用户名密码端口
localhostroot1234568037

SQL 文件sql-getstart包括两个部分:

1)创建数据库 cosinee001.mysql-create-db.sql

2)在上一步的数据库 cosinee 中,创建表及测试数据:002.mysql-create-schemas.sql

成功运行上述文件完成初始化。

3. Redis

春松客服依赖 Redis 服务,可以通过以下命令进行创建:

cd cskefu
docker-compose up -d redis

Redis 启动后就可以,不需要其他操作。

Redis 管理工具,推荐 AnotherRedisDesktopManager for Windows, medis for macOS

认证信息如下:

IP端口密码
localhost8041123456
注意

以上的相关数据库配置信息,例如:端口,密码等,位于 cskefu 项目目录 /cskefu/blob/develop/docker-compose.yml 中进行查看。

安装春松客服插件

春松客服的一些定制化需求通过插件的形式发布,插件让非通用需求和定制化开发的功能的源码与基础功能代码分离

一些插件是付费的,一些插件是免费的,比如:机器人客服插件 就是免费开源的。

插件的安装和源码参考:https://github.com/cskefu/cskefu/tree/develop/public/plugins

IDE 配置

春松客服开发支持的 IDE,包括所有的支持 Spring Boot 的 IDE,以下仅提供部分工具的文档。

配置完成后,需要继续完成以下内容。

初始化系统及开发环境

启动调试服务,如果要定制化客服接待访客的代码,需要按照 系统初始化 文档做更多配置。

春松客服代码规范

为提升合作效率和代码可维护性,共同做好开源客服系统,修改春松客服代码,需要符合以下规范,这是对春松客服开源社区开发者的一致要求。

配置好开发环境后,阅读《春松客服代码规范》

模拟访客端测试

介绍如何测试网页端访客程序,假设服务是自动在本地 http://localhost:8035 端口。

1. 创建网站渠道

http://localhost:8035/
用户名:admin
密码:admin1234

保证有下面的一条网站渠道:

网站渠道

注意:网站地址为 localhost

2. 设计网页端样式

在网站列表中,从右侧操作中点击“设计”。

设计网页

按照需求配置各种属性。

配置

3. 访问测试程序

浏览器打开

http://localhost:8035/testclient.html

测试

网站留言

如果当前系统中没有"在线"并且"就绪"的客服人员,则进入留言。

嵌入代码到网站中

在目标接入访客聊天控件的网站中,网页 HTML 的 header 中加入一行代码,就可以访问了,代码:

<script defer="true" src="http://春松客服地址[:端口]/im/网站渠道标识.html"></script>

注意:如果使用 80 或 443 端口,可省略端口;请将网页放在 HTTP 服务器上,如果从浏览器中以本地文件打开因为安全限制会无法加载聊天控件。

HTML 示例:

<!DOCTYPE html>
<html lang="zh">

<head>
<!-- META -->
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script defer="true" src="http://cc.chatopera.com/im/104eac.html"></script>
</head>
<body>
春松客服演示客户端

</body>
</html>

接下来


  1. SQL 快速入门,参考《春松客服大讲堂》之春松客服开发基础知识 SQL 快速入门
- +
版本:v8

开发环境搭建

本文介绍如何完成春松客服开发环境的搭建,面向企业/开发者提供关于春松客服二次开发的相关知识,从入门到掌握全部开发技能请学习《春松客服大讲堂》

本文档针对春松客服 v8 版本,该版本对应的代码参考链接

依赖

开发环境依赖,提前准备好:

以上安装,也涉及环境变量 PATH 配置正确。在命令行终端中执行以下命令,能够正确输出对应的版本号。

java --version
mvn --version # eg. Apache Maven 3.9.2
git --version # eg. git version 2.39.2
提示

Docker 或 Docker compose 可以安装到 Linux/Windows/Mac 上,Docker 在开发阶段用来启动数据库、中间件。

1. 安装 Java SDK

春松客服使用 Amazon Corretto SDK 17,原因:

  • 兼容 OpenJDK 标准
  • 良好的开源社区,可长期商业友好的使用,Amazon 发布,James Gosling 领导
  • 适应不同操作系统
注意

春松客服不使用其它版本的 JDK,如有其它 JDK 诉求自行测试:理论上,所有 OpenJDK 17 的 JVM 都是可以运行春松客服的。

2. 配置 Maven

确保在 pom.xml 中存在如下的 maven 仓库配置。

Chatopera Nexus 是代理 Maven Central,Alibaba Maven Repo 等节点的混合 Maven Repository,使用 Chatopera Nexus 不会影响项目使用其它公共包(Artifacts)

<repositories><repository>内存在:

    <repositories>
<repository>
<id>chatopera</id>
<name>Chatopera Inc.</name>
<url>https://nexus.chatopera.com/repository/maven-public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>

配置文件的示例见 pom.xml

如配置后不能下载,请参考配置文件

克隆项目

1. 准备 GitHub 账号

  • 注册地址,该注册依赖于邮箱。注册完成后,进行登录。

  • 添加 SSH Key:

    • 在 Terminal 命令行终端(Git Bash, Windows)执行命令 ssh-keygen,得到文件 ~/.ssh/id_rsa.pub 并复制其文本内容到粘贴板。

    • 打开 SSH Keys 管理地址,点击【New SSH Key】,使用粘贴板内容创建一个 SSH KEY。

2. Fork 源码

打开 春松客服项目地址,点击右上角【Fork】按钮,根据提示选择空间。

Fork 源码

克隆后,该项目源码将被复制到该空间,新的项目地址类似如下:

https://github.com/${YOUR_SPACE}/cskefu  # ${YOUR_SPACE} 代表您的空间名称

3. 下载源码

克隆项目,就是将上面新建的项目的源码,下载到计算机,使用命令行终端执行:

git clone https://github.com/${YOUR_SPACE}/cskefu.git cskefu
# 默认为 develop 分支, develop 分支为当前发行版本的维护分支
# 以下,使用 cskefu 代表源码所在路径

4. 添加 Upstream

Upstream 指春松客服 GitHub Repo https://github.com/cskefu/cskefu,就是春松客服的项目库核心分支。添加 Upstream 的目的,是之后从春松客服项目拉取更新代码。

cd cskefu
git remote add upstream git@github.com:cskefu/cskefu.git

完成以上步骤,克隆项目完毕。


希望给春松客服点赞,点击【Fork】旁边的【Star】按钮。

给春松客服点赞

文件目录介绍

文件目录介绍

目录说明
_m2用于 Dockerfile 中,构建镜像
admin各种脚本
app源代码
config数据库文件
data数据库数据
logs日志

春松客服是基于 Java 开发到,使用 Maven 维护项目声明周期。使用 Maven 命令,生成项目,方便导入到 IDE 中。

配置启动参数

春松客服是基于 Spring Boot Release 3.x 开发,配置文件是

cskefu/contact-center/app/src/main/resources/application.properties

该文件配置数据库(后文介绍搭建数据库)连接等其他信息,参考该文件。

有以下两个方式进行参数配置:

  1. 使用 application-dev.properties;

  2. 使用环境变量。

1. 使用 Profile 文件

使用 application-dev.properties 覆盖默认配置。

  • 设置环境变量
export SPRING_PROFILES_ACTIVE=dev
  • 创建 application-dev.properties
touch contact-center/app/src/main/resources/application-dev.properties
  • 添加内容如下:
# MySQL
spring.datasource.url=jdbc:mysql://localhost:8037/cosinee?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123456

# Redis服务器连接端口
spring.data.redis.host=localhost
spring.data.redis.port=8041
# Redis服务器连接密码(默认为空)
spring.data.redis.password=123456

# ActiveMQ
spring.activemq.broker-url=tcp://localhost:8052
spring.activemq.user=admin
spring.activemq.password=123456
spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=50
注意

此处可以覆盖 application.properties 中的任何值。

2. 环境变量

application.properties 中的每一项都可以通过环境变量进行配置,实现覆盖 application.properties 中等配置。

映射方式为 .properties 文件中的键,转为大写的同时 .- 转为 _

示例部分环境变量, 如下所示:

export SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/contactcenter?useUnicode=true&characterEncoding=UTF-8
export SPRING_DATASOURCE_USERNAME=root
export SPRING_DATASOURCE_PASSWORD=123456
说明

比如,SPRING_DATASOURCE_URL 对应了 application.properties 文件中的 spring.datasource.url

注意

环境变量的值优先级高于 .properties 文件。

提示:在生产环境部署,建议使用环境变量方式配置。

春松客服 Docker 容器的配置,使用了环境变量的方式,参考文件docker-compose.yml

数据库搭建

默认使用 docker-compose 启动服务,用于快速准备开发环境。描述文件地址 docker-compose.yml

为了减少开发环境搭建可能遇到的问题,使用 docker-compose.yml 中的 docker 镜像启动以下服务,尤其是春松客服对于一些软件的版本有要求,我们强烈建议开发者在入门春松客服开发的阶段,安装 docker 和 docker-compose,并按照下面的步骤配置开发环境。

项目依赖数据库,可以用一行命令启动:

cd cskefu
docker-compose up -d mysql activemq redis

另外,不同的数据库服务分别部署在不同计算机或服务器,以节省开发机器的资源。

以下也给出如何逐个启动,如何修改配置文件。

1. ActiveMQ

春松客服依赖 ActiveMQ 服务,可以通过以下命令进行创建:

cd cskefu
docker-compose up -d activemq

application.properties 文件中,ActiveMQ 的配置项如下:

spring.activemq.broker-url=tcp://localhost:8052
spring.activemq.user=admin
spring.activemq.password=123456
spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=50

请根据你的实际情况修改 application.properties 文件中的配置项。

ActiveMQ 管理工具,使用浏览器打开,http://YOUR_ACTIVEMQ_IP:PORT。PORT 默认是 8051,即环境变量 ACTIVEMQ_PORT1

示例界面如下:

ActiveMQ 管理工具

点击【Manage ActiveMQ broker

用户名密码
admin123456

2. MySQL

春松客服依赖 MySQL 服务,可以通过以下命令进行创建:

cd cskefu
docker-compose up -d mysql

MySQL 容器启动后,需要手动创建春松客服数据库。

数据库客户端连接 MySQL 服务

安装 DBMS 管理工具 MySQL Workbench,下载地址:https://dev.mysql.com/downloads/workbench/

MySQL Workbench 下载

在 Windows 上,MySQL Workbench 依赖 Visual C++ Redistributable,需要提前安装。

MySQL Workbench 安装

执行 SQL 文件

使用以上命令,通过 docker-compose 启动的 MySQL 服务,其连接认证信息如下:

IP用户名密码端口
localhostroot1234568037

SQL 文件sql-getstart包括两个部分:

1)创建数据库 cosinee001.mysql-create-db.sql

2)在上一步的数据库 cosinee 中,创建表及测试数据:002.mysql-create-schemas.sql

成功运行上述文件完成初始化。

3. Redis

春松客服依赖 Redis 服务,可以通过以下命令进行创建:

cd cskefu
docker-compose up -d redis

Redis 启动后就可以,不需要其他操作。

Redis 管理工具,推荐 AnotherRedisDesktopManager for Windows, medis for macOS

认证信息如下:

IP端口密码
localhost8041123456
注意

以上的相关数据库配置信息,例如:端口,密码等,位于 cskefu 项目目录 /cskefu/blob/develop/docker-compose.yml 中进行查看。

安装春松客服插件

春松客服的一些定制化需求通过插件的形式发布,插件让非通用需求和定制化开发的功能的源码与基础功能代码分离

一些插件是付费的,一些插件是免费的,比如:机器人客服插件 就是免费开源的。

插件的安装和源码参考:https://github.com/cskefu/cskefu/tree/develop/public/plugins

IDE 配置

春松客服开发支持的 IDE,包括所有的支持 Spring Boot 的 IDE,以下仅提供部分工具的文档。

配置完成后,需要继续完成以下内容。

初始化系统及开发环境

启动调试服务,如果要定制化客服接待访客的代码,需要按照 系统初始化 文档做更多配置。

春松客服代码规范

为提升合作效率和代码可维护性,共同做好开源客服系统,修改春松客服代码,需要符合以下规范,这是对春松客服开源社区开发者的一致要求。

配置好开发环境后,阅读《春松客服代码规范》

模拟访客端测试

介绍如何测试网页端访客程序,假设服务是自动在本地 http://localhost:8035 端口。

1. 创建网站渠道

http://localhost:8035/
用户名:admin
密码:admin1234

保证有下面的一条网站渠道:

网站渠道

注意:网站地址为 localhost

2. 设计网页端样式

在网站列表中,从右侧操作中点击“设计”。

设计网页

按照需求配置各种属性。

配置

3. 访问测试程序

浏览器打开

http://localhost:8035/testclient.html

测试

网站留言

如果当前系统中没有"在线"并且"就绪"的客服人员,则进入留言。

嵌入代码到网站中

在目标接入访客聊天控件的网站中,网页 HTML 的 header 中加入一行代码,就可以访问了,代码:

<script defer="true" src="http://春松客服地址[:端口]/im/网站渠道标识.html"></script>

注意:如果使用 80 或 443 端口,可省略端口;请将网页放在 HTTP 服务器上,如果从浏览器中以本地文件打开因为安全限制会无法加载聊天控件。

HTML 示例:

<!DOCTYPE html>
<html lang="zh">

<head>
<!-- META -->
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script defer="true" src="http://cc.chatopera.com/im/104eac.html"></script>
</head>
<body>
春松客服演示客户端

</body>
</html>

接下来


  1. SQL 快速入门,参考《春松客服大讲堂》之春松客服开发基础知识 SQL 快速入门
+ \ No newline at end of file diff --git a/docs/osc/ide_eclipse/index.html b/docs/osc/ide_eclipse/index.html index 424ecef1..b7e986ba 100644 --- a/docs/osc/ide_eclipse/index.html +++ b/docs/osc/ide_eclipse/index.html @@ -4,15 +4,15 @@ IDE 使用之 Eclipse IDE | 春松客服 - +
-
版本:v8

IDE 使用之 Eclipse IDE

<< 回到上一步:开发环境搭建

安装和下载 Eclipse

下载安装包

安装 Eclipse:https://www.eclipse.org/downloads/ +

版本:v8

IDE 使用之 Eclipse IDE

<< 回到上一步:开发环境搭建

安装和下载 Eclipse

下载安装包

安装 Eclipse:https://www.eclipse.org/downloads/ 本文下载时,版本为:Eclipse IDE 2021‑09

下载 Eclipse

下载过程大约需要 10 mins。

安装 Eclipse

双击安装包,按照提示进行安装。

安装 Eclipse

安装 STS

STS 最简单的安装方式,就是启动 Eclipse 后,在 Eclipse Marketplace 中安装。

打开 Marketplace。

Marketplace。

搜索,Spring Tool Suite。

Spring Tool Suite

点击【Install】。

Install

至少选择以上几项,在授权声明页面,选择 【I accept】,点击【Finish】。 安装过程可能会持续半个小时,视网络情况。

STS 安装完成,下一步导入项目。

导入项目

初始化 Contact Center 项目描述文件

春松客服提供初始化脚本,在命令行执行:

cd cskefu.osc/contact-center
./admin/gen-eclipse.sh

完成后有如下提示:

导入项目

该命令生成了被 Eclipse 识别的项目导入文件。

导入到 Eclipse

打开 Eclipse,选择 File - Import, 导航到 cskefu.osc/contact-center/app,点击 【Select Folder】。

导入到 Eclipse

在提示界面,选择 Projects: contact-center.

选择项目

导入完成。

导入完成

启动和调试

设置 JDK 为 Corretto 8 或 11

在上一篇《开发环境搭建》文档中,介绍安装 Corretto 8 或 11,此时,需要将该 JDK 设置为 Eclipse 中 contact-center 项目依赖的 JDK,方法如下:

首先,在左侧 contact-center 右键,选择 Build path, configure Build Path ...

设置 Build path

然后,选择 Add Library, JRE System Library。

Add Library

然后,添加 JDK 8 路径。

设置路径

点击 【Finish】。确认依赖 JDK。

添加完成,回到 Java Build Path 配置页面,确认 Libraries 中,依赖了 Corretto JDK。

确认 SDK

修改配置文件

在目录中添加 application-dev.properties 文件

具体操作,复制 contact-center/src/main/resources/application.properties 为 /contact-center/src/main/resources/application-dev.properties。

根据数据库信息,或其它信息进行必要的更改。

参考上一篇《开发环境搭建》里的内容。

创建项目 debug 调试

点击 Debug 启动按钮下拉中的 Debug Configurations, 在左侧找到 Spring Boot App,右键,选择新建配置。

启动 Debug

在配置页面,填写应用名称:contact-center - Application,project 选择 contact-center, Main Type 选择 com.chatopera.cc.Application。

然后点击 Environment,点击 Add 添加:Name - SPRING_PROFILES_ACTIVE, Value - dev,字符串无空格。

设置环境变量

点击【Apply】。然后点击【Debug】。

此时,滚动出大量的日志。

查看日志

调试项目

在项目提示: c.c.socketio.SocketIOServer - SocketIO server started at port,代表项目启动成功。

断点调试的基本知识

第一步: 设置断点:在该行最前面边框双击 或快捷键:Ctrl + Shift + B

第二步: Debug 运行启动

第三部: 运行到断点后,使用快捷键F5,F6,F7单步执行。

  • F5 - Step into/跳入方法/进入该行的函数内部;
  • F6 - Step over/向下逐行调试/一行一行执行;
  • F7 - Step return/跳出方法/退出当前的函数;
  • F8 - 直接跳转到下一个断点。

更多相关内容参考网络文章

Trouble Shooting

报错:com.sun.net.ssl.internal.ssl.Provider

日志

解决办法:

日志

  • 修改 Project JRE 为前面安装的 Java8 JRE

修正中文显示

解决办法详细介绍

显示中文

下一步

回到上一步:开发环境搭建完成后续步骤。

- + \ No newline at end of file diff --git a/docs/osc/ide_intelij_idea/index.html b/docs/osc/ide_intelij_idea/index.html index 3adf3de8..5494ee27 100644 --- a/docs/osc/ide_intelij_idea/index.html +++ b/docs/osc/ide_intelij_idea/index.html @@ -4,13 +4,13 @@ IDE 使用之 IntelliJ IDEA | 春松客服 - +
-
版本:v8

IDE 使用之 IntelliJ IDEA

<< 回到上一步

春松客服团队使用 IntelliJ IDEA 作为集成开发环境,它因为更加智能而大幅提升了开发者的工作效率,我们也强烈推荐 Java 开发者使用这个工具。本文使用IntelliJ IDEA介绍搭建过程。

生成项目描述文件

在命令行终端,执行:

cd cskefu.osc
cd contact-center
./admin/gen-idea.sh

按照 IDEA 提示,导入 contact-center/app 目录。

配置执行及调试

配置运行方式为 Spring,应用为 com.chatopera.cc.app.Application

设置 Main Class

配置环境变量

设置环境变量

运行及调试

运行及调试

点击"执行"或"调试",服务启动,然后访问 http://localhost:8035 确定服务正常运行了。

登录

用户名:admin 密码:admin1234

热更新

在开发过程中,修改了代码,更新正在以 “调试” 模式运行服务,点击"执行旁边的锤子"。

构建

更新成功后,提示

断点

另外, “调试” 模式下,也支持断点调试。

下一步

回到开发环境搭建完成后续步骤。

- +
版本:v8

IDE 使用之 IntelliJ IDEA

<< 回到上一步

春松客服团队使用 IntelliJ IDEA 作为集成开发环境,它因为更加智能而大幅提升了开发者的工作效率,我们也强烈推荐 Java 开发者使用这个工具。本文使用IntelliJ IDEA介绍搭建过程。

生成项目描述文件

在命令行终端,执行:

cd cskefu.osc
cd contact-center
./admin/gen-idea.sh

按照 IDEA 提示,导入 contact-center/app 目录。

配置执行及调试

配置运行方式为 Spring,应用为 com.chatopera.cc.app.Application

设置 Main Class

配置环境变量

设置环境变量

运行及调试

运行及调试

点击"执行"或"调试",服务启动,然后访问 http://localhost:8035 确定服务正常运行了。

登录

用户名:admin 密码:admin1234

热更新

在开发过程中,修改了代码,更新正在以 “调试” 模式运行服务,点击"执行旁边的锤子"。

构建

更新成功后,提示

断点

另外, “调试” 模式下,也支持断点调试。

下一步

回到开发环境搭建完成后续步骤。

+ \ No newline at end of file diff --git a/docs/osc/ide_vscode/index.html b/docs/osc/ide_vscode/index.html index 7079f184..c423f4a6 100644 --- a/docs/osc/ide_vscode/index.html +++ b/docs/osc/ide_vscode/index.html @@ -4,13 +4,13 @@ IDE 使用之 Visual Studio Code | 春松客服 - +
-
版本:v8

IDE 使用之 Visual Studio Code

<< 回到上一步

春松客服团队使用 Visual Studio Code 作为集成开发环境,它因为更加智能而大幅提升了开发者的工作效率,相比于 IntelliJ IDEA, VSCode 免费并且有大量插件支持。本文使用 Visual Studio Code 介绍搭建过程。

视频教程

可使用视频《春松客服开发环境搭建之 VSCode + Docker》进行学习,完成本节任务。

安装插件

Spring Boot Extension Pack

配置环境变量

参照开发环境配置,通过 Profile 文件配置环境变量,并确保相关数据库已经启动。

运行

打开 Spring Boot Dashboard 工程(通过 Ctrl + Shift + P 打开),右键点击项目,选择 Run with Profile, 并勾选上一步设置的环境变量选项即可。

下一步

回到开发环境搭建完成后续步骤。

- +
版本:v8

IDE 使用之 Visual Studio Code

<< 回到上一步

春松客服团队使用 Visual Studio Code 作为集成开发环境,它因为更加智能而大幅提升了开发者的工作效率,相比于 IntelliJ IDEA, VSCode 免费并且有大量插件支持。本文使用 Visual Studio Code 介绍搭建过程。

视频教程

可使用视频《春松客服开发环境搭建之 VSCode + Docker》进行学习,完成本节任务。

安装插件

Spring Boot Extension Pack

配置环境变量

参照开发环境配置,通过 Profile 文件配置环境变量,并确保相关数据库已经启动。

运行

打开 Spring Boot Dashboard 工程(通过 Ctrl + Shift + P 打开),右键点击项目,选择 Run with Profile, 并勾选上一步设置的环境变量选项即可。

下一步

回到开发环境搭建完成后续步骤。

+ \ No newline at end of file diff --git a/docs/osc/index.html b/docs/osc/index.html index 014d7302..a7cd6fe2 100644 --- a/docs/osc/index.html +++ b/docs/osc/index.html @@ -4,13 +4,13 @@ 开源社区 | 春松客服 - +
-
版本:v8

开源社区

GitHub Stargazers GitHub Forks License GitHub Issues GitHub Issues Closed docker

开源许可协议

春松客服采用春松许可证,v1.0,详细了解该协议内容:

开源许可协议

加入春松客服开源社区

如何加入春松客服开源社区,参考文档

源码仓库

开源项目地址:

Github | Gitee | CodeChina

以上不同地址的代码同步,在上面的地址,您可以:

  • 下载项目开源码
  • 通过 README.md 了解更多项目信息
  • 通过 Wiki 获得开发文档
  • 通过 Issue 提问
  • 通过 Pullrequest 贡献代码
  • 通过 Issue 了解开发状态

在项目地址中,有详细的入门说明,如果使用遇到问题,第一时间阅读文档,第二时间搜索历史 Issues,如果无法解决,加入社区提问。

邮件列表

春松客服邮件列表通过邮件服务沟通,跟踪最新的开发动态:

https://lists.cskefu.com/cgi-bin/mailman/listinfo/dev

博客专栏

《春松客服专栏》火热 🔥 更新中,订阅关注,及时获得最新的信息。

春松客服拥抱开源

为春松客服点赞

您的关注、鼓励是开源项目的工作动力之一,请给春松客服点赞 👍!

点赞春松客服

- +
版本:v8

开源社区

GitHub Stargazers GitHub Forks License GitHub Issues GitHub Issues Closed docker

开源许可协议

春松客服采用春松许可证,v1.0,详细了解该协议内容:

开源许可协议

加入春松客服开源社区

如何加入春松客服开源社区,参考文档

源码仓库

开源项目地址:

Github | Gitee | CodeChina

以上不同地址的代码同步,在上面的地址,您可以:

  • 下载项目开源码
  • 通过 README.md 了解更多项目信息
  • 通过 Wiki 获得开发文档
  • 通过 Issue 提问
  • 通过 Pullrequest 贡献代码
  • 通过 Issue 了解开发状态

在项目地址中,有详细的入门说明,如果使用遇到问题,第一时间阅读文档,第二时间搜索历史 Issues,如果无法解决,加入社区提问。

邮件列表

春松客服邮件列表通过邮件服务沟通,跟踪最新的开发动态:

https://lists.cskefu.com/cgi-bin/mailman/listinfo/dev

博客专栏

《春松客服专栏》火热 🔥 更新中,订阅关注,及时获得最新的信息。

春松客服拥抱开源

为春松客服点赞

您的关注、鼓励是开源项目的工作动力之一,请给春松客服点赞 👍!

点赞春松客服

+ \ No newline at end of file diff --git a/docs/osc/license/index.html b/docs/osc/license/index.html index 648da8e1..8c54d645 100644 --- a/docs/osc/license/index.html +++ b/docs/osc/license/index.html @@ -4,13 +4,13 @@ 开源许可协议 | 春松客服 - +
-
版本:v8

开源许可协议

春松客服使用《春松许可证 v1.0 》

自 2023 年 6 月 25 日起,根据春松客服社区投票决议,春松客服的开源许可证使用春松许可证 v1.0,详细说明见下。

背景

开源软件在信息技术和数字化产业中做出了巨大贡献,在操作系统中有 Linux,在数据库中有 MySQL,在虚拟化云服务中有 OpenStack 等等,当我们提及企业的应用层,比如 CRM、ERP 等,尤其是中文,来自中国开发者实现的,并不能立刻想到什么有代表性的。

不是我们不熟悉这个话题,而是压根就没有什么耳熟能详的案例,其实这些软件应用,已经存在了巨大的通用性,类似于企业版的安卓操作系统,一个通用的底座,上面通过插件定制各种更复杂、不通用的场景。

今天,春松客服开源社区提出了春松许可证,就是要尝试做出企业应用领域成功的开源项目:为企业用户提供比闭源或 SaaS 还好的软件,开发者能在参与我们开源的软件项目中得到切实的回报。

  • 我们提供的开源软件比同行业的闭源或 SaaS 更好用,更开放
  • 开发者能因参与开源项目得到经济和社会回报

如何做到这些呢?那就是开发者和软件用户之间的契约,能建立长期稳定的互惠关系。开发者有收入,持续更新软件,软件用户有承诺。

春松许可证的主要着眼点在于:源码开放的同时,重新分发时不能干扰软件内部有的付费功能。比如在春松客服中,超过一定数量的座席或渠道要进行付费:创建相关资源时,弹出购买表单。重新分发或衍生作品不能干预这个付费和证书管理的流程,否则属于侵权、违约。

春松许可证 v1 的正文文本

关于春松许可证 v1 的正文文本,见:

https://docs.cskefu.com/licenses/v1.html

春松许可证是在 Apache2.0 的基础上调整的,改动的过程见:

https://docs.cskefu.com/licenses/v1.diff-apache2.0.docx

下载 v1.diff-apache2.0.docx 后,使用 Office Word 修订功能查看。就协议的正式内容,仍以 https://docs.cskefu.com/licenses/v1.html 为准。

- +
版本:v8

开源许可协议

春松客服使用《春松许可证 v1.0 》

自 2023 年 6 月 25 日起,根据春松客服社区投票决议,春松客服的开源许可证使用春松许可证 v1.0,详细说明见下。

背景

开源软件在信息技术和数字化产业中做出了巨大贡献,在操作系统中有 Linux,在数据库中有 MySQL,在虚拟化云服务中有 OpenStack 等等,当我们提及企业的应用层,比如 CRM、ERP 等,尤其是中文,来自中国开发者实现的,并不能立刻想到什么有代表性的。

不是我们不熟悉这个话题,而是压根就没有什么耳熟能详的案例,其实这些软件应用,已经存在了巨大的通用性,类似于企业版的安卓操作系统,一个通用的底座,上面通过插件定制各种更复杂、不通用的场景。

今天,春松客服开源社区提出了春松许可证,就是要尝试做出企业应用领域成功的开源项目:为企业用户提供比闭源或 SaaS 还好的软件,开发者能在参与我们开源的软件项目中得到切实的回报。

  • 我们提供的开源软件比同行业的闭源或 SaaS 更好用,更开放
  • 开发者能因参与开源项目得到经济和社会回报

如何做到这些呢?那就是开发者和软件用户之间的契约,能建立长期稳定的互惠关系。开发者有收入,持续更新软件,软件用户有承诺。

春松许可证的主要着眼点在于:源码开放的同时,重新分发时不能干扰软件内部有的付费功能。比如在春松客服中,超过一定数量的座席或渠道要进行付费:创建相关资源时,弹出购买表单。重新分发或衍生作品不能干预这个付费和证书管理的流程,否则属于侵权、违约。

春松许可证 v1 的正文文本

关于春松许可证 v1 的正文文本,见:

https://docs.cskefu.com/licenses/v1.html

春松许可证是在 Apache2.0 的基础上调整的,改动的过程见:

https://docs.cskefu.com/licenses/v1.diff-apache2.0.docx

下载 v1.diff-apache2.0.docx 后,使用 Office Word 修订功能查看。就协议的正式内容,仍以 https://docs.cskefu.com/licenses/v1.html 为准。

+ \ No newline at end of file diff --git a/docs/osc/maintainence/index.html b/docs/osc/maintainence/index.html index faa028c4..0cf750dc 100644 --- a/docs/osc/maintainence/index.html +++ b/docs/osc/maintainence/index.html @@ -4,14 +4,14 @@ 系统维护 | 春松客服 - +
-
版本:v8

系统维护

以下文档基于《春松客服私有部署》文档部署的案例,进行运维管理。

假设春松客服部署目录为:ROOT_PATH/cskefu.osc。以下脚本假设部署服务器为 Linux 或包含 Bash 环境的 Windows 服务器,使用 Bash Shell 运行脚本。

注意事项及官方声明

!!! 如果您在使用其它部署方案,或者在官方基础上更新过春松客服的源代码,以下文档并不一定适用。

运维需谨慎,尽量了解每个步骤的目的和结果,在操作前,如果使用虚拟化环境,请给服务器做快照!!!

作为一个给开发者社区提供的维护文档,我们的维护指南不承担法律责任,不承担经济责任。如需要专业的商业支持,请联系春松客服官方团队

关于春松客服版本号

ROOT_PATH/cskefu.osc/.env(以下简称 .env) 文件作为配置春松客服版本和环境变量的文件,也记录着 Docker 启动春松客服的版本信息,该文件在部署阶段创建。

CC_IMAGE=chatopera/contact-center:develop

在开源版本中,镜像的名字是 chatopera/contact-center,默认的版本是 develop,所有可选的版本在 GitHub 中可以浏览到:

版本管理

https://github.com/chatopera/cskefu/commits/osc

为了方便管理,春松客服 Git Commit Short ID 也是春松客服 Docker 镜像的 Tag,也常用 Docker 镜像版本号来指代。在 GitHub Commit 历史中,有对号的版本就是完成了对应的 Docker 镜像发布的版本,develop 标签就是已经发布的最近的版本。

比如,在上图中,chatopera/contact-center:develop 就代表 chatopera/contact-center:4b70d05chatopera/contact-center:develop 对应的 Docker 容器会变化,但是用 Commit Short ID 的版本号对应的容器和代码一一对应,是不变的。

在春松客服实例中,也可以得到版本信息。作为春松客服系统用户登录,并在右上角用户名下拉菜单中,打开【关于产品】。

查看版本信息

build 的最后几位字符串就是版本号。

系统备份

设置版本号到配置文件

设置春松客服容器版本到 .env。

cd ROOT_PATH/cskefu.osc
vi .env # 使用文本编辑器编辑

找到修改或添加

CC_IMAGE=chatopera/contact-center:YOUR_VERSION

YOUR_VERSION 替换为春松客服版本号,此处不要使用 develop,而必须是 Git Commit Short ID,原因见上文。

运行脚本

作为备份的文件,是和春松客服 Docker 容器版本绑定的,在完成了以上步骤后,执行下面的脚本。

TIMESTAMP=$(date +%Y%m%d_%H%M)
cd ROOT_PATH/cskefu.osc
docker-compose down # 停止服务
cd ../ # 来到父级目录
tar czfp cskefu.osc.$TIMESTAMP.tgz cskefu.osc # 打包备份

其中,tar 命令执行了将应用文件夹归档为【保留文件访问权限】的压缩包。

系统升级

基于 Docker 容器的系统升级,过程也很简单,因为春松客服发布的版本中,每次重启,都会校验数据库的版本匹配,自动维护数据库的表结构,比如新版本中增加了字段、删除了字段等,都会自动完成。这也是 Chatopera 团队推荐开发者/企业使用春松客服官方镜像的主要原因:部署、运维更简单。

系统备份

春松客服升级为【就地升级/ In Place Upgrade】,首先按照系统备份过程备份,以防升级后遇到问题无法回退。

获取最新的春松客服版本

参考前文【关于春松客服版本号】获得春松客服最新的版本信息,然后执行以下操作。

cd ROOT_PATH/cskefu.osc
docker-compose down # 停止服务
vi .env # 打开配置文件

找到修改或添加

CC_IMAGE=chatopera/contact-center:YOUR_VERSION

YOUR_VERSION 替换为春松客服新的版本号。

cd ROOT_PATH/cskefu.osc
docker-compose up -d # 重启服务,此时,docker 会自动拉取新版本的镜像

回滚到系统备份

假设备份文件压缩包的位置是:/root/cskefu.osc.202107001.tgz

cd ROOT_PATH/cskefu.osc
docker-compose down
cd ..
mv cskefu.osc cskefu.osc.backup # 将当前的文件存放在临时位置(万一还会用到,只是以防有可能用到)
tar xzfp /root/cskefu.osc.202107001.tgz # 备份文件被解压到 ROOT_PATH/cskefu.osc
cd ROOT_PATH/cskefu.osc
docker-compose up -d # 启动服务
docker-compose logs -f contact-center # 查看日志

在春松客服运行后,在浏览器内访问并验证服务正常。升级完毕。 +

版本:v8

系统维护

以下文档基于《春松客服私有部署》文档部署的案例,进行运维管理。

假设春松客服部署目录为:ROOT_PATH/cskefu.osc。以下脚本假设部署服务器为 Linux 或包含 Bash 环境的 Windows 服务器,使用 Bash Shell 运行脚本。

注意事项及官方声明

!!! 如果您在使用其它部署方案,或者在官方基础上更新过春松客服的源代码,以下文档并不一定适用。

运维需谨慎,尽量了解每个步骤的目的和结果,在操作前,如果使用虚拟化环境,请给服务器做快照!!!

作为一个给开发者社区提供的维护文档,我们的维护指南不承担法律责任,不承担经济责任。如需要专业的商业支持,请联系春松客服官方团队

关于春松客服版本号

ROOT_PATH/cskefu.osc/.env(以下简称 .env) 文件作为配置春松客服版本和环境变量的文件,也记录着 Docker 启动春松客服的版本信息,该文件在部署阶段创建。

CC_IMAGE=chatopera/contact-center:develop

在开源版本中,镜像的名字是 chatopera/contact-center,默认的版本是 develop,所有可选的版本在 GitHub 中可以浏览到:

版本管理

https://github.com/chatopera/cskefu/commits/osc

为了方便管理,春松客服 Git Commit Short ID 也是春松客服 Docker 镜像的 Tag,也常用 Docker 镜像版本号来指代。在 GitHub Commit 历史中,有对号的版本就是完成了对应的 Docker 镜像发布的版本,develop 标签就是已经发布的最近的版本。

比如,在上图中,chatopera/contact-center:develop 就代表 chatopera/contact-center:4b70d05chatopera/contact-center:develop 对应的 Docker 容器会变化,但是用 Commit Short ID 的版本号对应的容器和代码一一对应,是不变的。

在春松客服实例中,也可以得到版本信息。作为春松客服系统用户登录,并在右上角用户名下拉菜单中,打开【关于产品】。

查看版本信息

build 的最后几位字符串就是版本号。

系统备份

设置版本号到配置文件

设置春松客服容器版本到 .env。

cd ROOT_PATH/cskefu.osc
vi .env # 使用文本编辑器编辑

找到修改或添加

CC_IMAGE=chatopera/contact-center:YOUR_VERSION

YOUR_VERSION 替换为春松客服版本号,此处不要使用 develop,而必须是 Git Commit Short ID,原因见上文。

运行脚本

作为备份的文件,是和春松客服 Docker 容器版本绑定的,在完成了以上步骤后,执行下面的脚本。

TIMESTAMP=$(date +%Y%m%d_%H%M)
cd ROOT_PATH/cskefu.osc
docker-compose down # 停止服务
cd ../ # 来到父级目录
tar czfp cskefu.osc.$TIMESTAMP.tgz cskefu.osc # 打包备份

其中,tar 命令执行了将应用文件夹归档为【保留文件访问权限】的压缩包。

系统升级

基于 Docker 容器的系统升级,过程也很简单,因为春松客服发布的版本中,每次重启,都会校验数据库的版本匹配,自动维护数据库的表结构,比如新版本中增加了字段、删除了字段等,都会自动完成。这也是 Chatopera 团队推荐开发者/企业使用春松客服官方镜像的主要原因:部署、运维更简单。

系统备份

春松客服升级为【就地升级/ In Place Upgrade】,首先按照系统备份过程备份,以防升级后遇到问题无法回退。

获取最新的春松客服版本

参考前文【关于春松客服版本号】获得春松客服最新的版本信息,然后执行以下操作。

cd ROOT_PATH/cskefu.osc
docker-compose down # 停止服务
vi .env # 打开配置文件

找到修改或添加

CC_IMAGE=chatopera/contact-center:YOUR_VERSION

YOUR_VERSION 替换为春松客服新的版本号。

cd ROOT_PATH/cskefu.osc
docker-compose up -d # 重启服务,此时,docker 会自动拉取新版本的镜像

回滚到系统备份

假设备份文件压缩包的位置是:/root/cskefu.osc.202107001.tgz

cd ROOT_PATH/cskefu.osc
docker-compose down
cd ..
mv cskefu.osc cskefu.osc.backup # 将当前的文件存放在临时位置(万一还会用到,只是以防有可能用到)
tar xzfp /root/cskefu.osc.202107001.tgz # 备份文件被解压到 ROOT_PATH/cskefu.osc
cd ROOT_PATH/cskefu.osc
docker-compose up -d # 启动服务
docker-compose logs -f contact-center # 查看日志

在春松客服运行后,在浏览器内访问并验证服务正常。升级完毕。 当系统可以稳定运行,比如 2 个月,再酌情删除 cskefu.osc.backup

下一步

- + \ No newline at end of file diff --git a/docs/osc/restapi/index.html b/docs/osc/restapi/index.html index 4f30c693..8d6a9afa 100644 --- a/docs/osc/restapi/index.html +++ b/docs/osc/restapi/index.html @@ -4,13 +4,13 @@ REST APIs | 春松客服 - +
-
版本:v8

REST APIs

春松客服目前具备 30 余个 RESTful API 接口,包括联系人管理,授权,获得访客会话列表等,方便企业/开发者从不同系统中集成春松客服。

安装 Postman

查看、测试和体验春松客服 API 需要安装 Postman, 并导入春松客服 API Collection 文件。

Postman 支持各种操作系统,免费下载安装包并使用:

https://www.postman.com/

导入 Collection

导入春松客服 API Collection,下载Chatopera_cc_v1.postman_collection.20200312.zip

将 zip 文件解压,得到 Chatopera_cc_v1.postman_collection.json

打开 Postman,执行导入

导入 Postman

每个 API 在 Postman 中都有PathBodyHeaders等的设置,可查看示例和发送请求,对于开发人员来说非常友好。

API 认证

导入 collection 文件后,从左侧找到 Chatopera_cc_v1

找到 Collection

认证接口:

# 获得Token
POST http://IP:PORT/tokens?username=USERNAME&password=PASSWORD
key描述
IP春松客服 IP
PORT春松客服端口
USERNAME用户名
PASSWORD密码

回复结果为一个字符串,即 Auth token。

API 请求

在请求其它 API 时,在 header 中设置authorization为 Auth token 就可以,如下:

发送 API 请求

部分接口:

  • 获得登录用户

  • 联系人笔记:创建/删除/更新

  • 机器人客服:创建/查询

针对每个接口的描述,此处不赘述,请直接用 Postman 查看。

注意事项

  • 每个 token 有效期为 24 小时,认证失败会有相应提醒
  • 登录用户的权限有限制,API 访问受此约束
- +
版本:v8

REST APIs

春松客服目前具备 30 余个 RESTful API 接口,包括联系人管理,授权,获得访客会话列表等,方便企业/开发者从不同系统中集成春松客服。

安装 Postman

查看、测试和体验春松客服 API 需要安装 Postman, 并导入春松客服 API Collection 文件。

Postman 支持各种操作系统,免费下载安装包并使用:

https://www.postman.com/

导入 Collection

导入春松客服 API Collection,下载Chatopera_cc_v1.postman_collection.20200312.zip

将 zip 文件解压,得到 Chatopera_cc_v1.postman_collection.json

打开 Postman,执行导入

导入 Postman

每个 API 在 Postman 中都有PathBodyHeaders等的设置,可查看示例和发送请求,对于开发人员来说非常友好。

API 认证

导入 collection 文件后,从左侧找到 Chatopera_cc_v1

找到 Collection

认证接口:

# 获得Token
POST http://IP:PORT/tokens?username=USERNAME&password=PASSWORD
key描述
IP春松客服 IP
PORT春松客服端口
USERNAME用户名
PASSWORD密码

回复结果为一个字符串,即 Auth token。

API 请求

在请求其它 API 时,在 header 中设置authorization为 Auth token 就可以,如下:

发送 API 请求

部分接口:

  • 获得登录用户

  • 联系人笔记:创建/删除/更新

  • 机器人客服:创建/查询

针对每个接口的描述,此处不赘述,请直接用 Postman 查看。

注意事项

  • 每个 token 有效期为 24 小时,认证失败会有相应提醒
  • 登录用户的权限有限制,API 访问受此约束
+ \ No newline at end of file diff --git a/docs/osc/training/index.html b/docs/osc/training/index.html index 62a22b81..ae202083 100644 --- a/docs/osc/training/index.html +++ b/docs/osc/training/index.html @@ -3,14 +3,14 @@ -春松客服大讲堂 | 春松客服 - +定制开发教程 | 春松客服 +
-
版本:v8

春松客服大讲堂

😉 春松客服大讲堂,面向开发者、软件工程师及运维人员的在线课程(视频及课件)。

  • 基于春松客服定制客服系统,紧紧围绕春松客服开发技能
  • 由浅入深的介绍春松客服上线智能客服系统、运营客服工作
  • 全面介绍春松客服插件、机器人客服的等原理和使用

购买地址

春松客服大讲堂通过 Chatopera 证书商店进行出售,通过购买的【证书标识】获得下载 URL 地址,或扫下图二维码。

https://store.chatopera.com/product/cskfdjt19

课程大纲

共 7 章,合计 21 学时视频,552 页 PPT 课件。

小节时长(时:分:秒)
一、春松客服的介绍如何使用Java开发智能客服系统00:31:55
春松客服在企业的落地00:25:23
春松客服的技术介绍01:01:30
二、客服相关的基本知识客服的日常工作00:52:44
客服的基本知识00:41:40
账号体系-权限,部门和角色00:38:42
坐席会话的工具-拉黑,服务小结和转接00:32:16
即时通信及坐席自动分配00:49:59
企业聊天与人工质检00:31:16
统计报表和满意度评价00:36:59
三、春松客服的上线及维护春松客服的编译和部署00:37:28
春松客服的运维管理00:59:26
春松客服的自动化系统测试(1)00:31:28
春松客服的自动化系统测试(2)00:48:43
春松客服的压力测试(1)00:31:52
春松客服的压力测试(2)00:39:36
四、春松客服的机器人客服Chatopera 云服务介绍00:26:23
机器人的知识库管理00:38:27
机器人的多轮对话及富文本消息类型00:35:08
五、春松客服开发基础知识SQL快速入门00:38:38
春松客服数据库表及管理00:41:44
Java编程基础(1)00:36:12
Java编程基础(2)01:34:23
Maven项目管理00:39:56
搭建春松客服开发环境01:10:28
SpringBoot快速入门00:38:46
项目源码讲解01:07:21
六、春松客服的插件插件机制设计00:36:21
春松客服机器人插件解读00:37:59
七、总结春松客服团队介绍及课程总结00:30:08

下载课程文件

Chatopera 证书商店 获得到证书 ID(LICENSE_ID) 后,文件的下载地址为:

https://store.chatopera.com/dl/${LICENSE_ID}.gz

${LICENSE_ID} 替换为您的证书标识。假设上一步得到的证书标识为:L123,那么 URL 下载地址就是:

https://store.chatopera.com/dl/L123.gz

将您的课程文件的 URL 下载地址在浏览器中打开,完成下载,文件大小约 3.5 GB。您也可以使用 wget 命令行工具从命令行终端(比如 Bash Shell)下载和解压。

wget https://store.chatopera.com/dl/L123.gz -O cskfdjt.tar.gz
tar xzfv cskfdjt.tar.gz # 进行解压
- +
版本:v8

定制开发教程

😉 春松客服大讲堂,面向开发者、软件工程师及运维人员的在线课程(视频及课件)。

  • 基于春松客服定制客服系统,紧紧围绕春松客服开发技能
  • 由浅入深的介绍春松客服上线智能客服系统、运营客服工作
  • 全面介绍春松客服插件、机器人客服的等原理和使用

春松客服大讲堂

共 7 章,合计 21 学时视频,552 页 PPT 课件。

小节时长(时:分:秒)
一、春松客服的介绍如何使用Java开发智能客服系统00:31:55
春松客服在企业的落地00:25:23
春松客服的技术介绍01:01:30
二、客服相关的基本知识客服的日常工作00:52:44
客服的基本知识00:41:40
账号体系-权限,部门和角色00:38:42
坐席会话的工具-拉黑,服务小结和转接00:32:16
即时通信及坐席自动分配00:49:59
企业聊天与人工质检00:31:16
统计报表和满意度评价00:36:59
三、春松客服的上线及维护春松客服的编译和部署00:37:28
春松客服的运维管理00:59:26
春松客服的自动化系统测试(1)00:31:28
春松客服的自动化系统测试(2)00:48:43
春松客服的压力测试(1)00:31:52
春松客服的压力测试(2)00:39:36
四、春松客服的机器人客服Chatopera 云服务介绍00:26:23
机器人的知识库管理00:38:27
机器人的多轮对话及富文本消息类型00:35:08
五、春松客服开发基础知识SQL快速入门00:38:38
春松客服数据库表及管理00:41:44
Java编程基础(1)00:36:12
Java编程基础(2)01:34:23
Maven项目管理00:39:56
搭建春松客服开发环境01:10:28
SpringBoot快速入门00:38:46
项目源码讲解01:07:21
六、春松客服的插件插件机制设计00:36:21
春松客服机器人插件解读00:37:59
七、总结春松客服团队介绍及课程总结00:30:08

更多介绍,查看购买地址内详情。

购买地址

春松客服大讲堂通过 Chatopera 证书商店进行出售,通过购买的【证书标识】获得下载 URL 地址,或扫下图二维码。

https://store.chatopera.com/product/cskfdjt19

下载课程文件

Chatopera 证书商店 获得到证书 ID(LICENSE_ID) 后,文件的下载地址为:

https://store.chatopera.com/dl/${LICENSE_ID}.gz

${LICENSE_ID} 替换为您的证书标识。假设上一步得到的证书标识为:L123,那么 URL 下载地址就是:

https://store.chatopera.com/dl/L123.gz

将您的课程文件的 URL 下载地址在浏览器中打开,完成下载,文件大小约 3.5 GB。您也可以使用 wget 命令行工具从命令行终端(比如 Bash Shell)下载和解压。

wget https://store.chatopera.com/dl/L123.gz -O cskfdjt.tar.gz
tar xzfv cskfdjt.tar.gz # 进行解压
+ \ No newline at end of file diff --git a/docs/reports/index.html b/docs/reports/index.html index 3866a8d9..a0f59e93 100644 --- a/docs/reports/index.html +++ b/docs/reports/index.html @@ -4,13 +4,13 @@ 会话历史 | 春松客服 - +
版本:v8

会话历史

会话历史作为客服主管的运营工具,主要展示客服业务的数据和报表,同时也有一些数据是实时的,或通过时间选择器自定义时间段,形成数据分析和汇总。在角色中,可以配置权限,指定登录用户的访问【会话历史】的权限。

历史会话

查看:左侧菜单 → 会话历史 → 历史会话

历史会话

当前会话

查看:左侧菜单 → 会话历史 → 当前会话

当前会话

排队队列

查看:左侧菜单 → 会话历史 → 排队队列

排队队列

访客留言

查看:左侧菜单 → 会话历史 → 访客留言

访客留言

满意度统计

查看:左侧菜单 → 统计功能 → 满意度统计

满意度统计

客服坐席

查看:左侧菜单 → 统计功能 → 客服坐席

客服坐席

服务小结

查看:左侧菜单 → 服务小结 → 多媒体客服

服务小结

已处理服务小结

查看:左侧菜单 → 服务小结 → 已处理多媒体客服

已处理服务小结

满意度评价

查看:左侧菜单 → 满意度评价 → 在线客服

满意度评价

在线坐席

查看:左侧菜单 → 坐席信息 → 在线坐席

在线坐席

全部坐席

查看:左侧菜单 → 坐席信息 → 全部坐席

全部坐席

常见问题

GH-395

问题 历史会话不显示数据

解决方案 需要在网站渠道中启用技能组模式,并绑定单一技能组。

- + \ No newline at end of file diff --git a/docs/sla/index.html b/docs/sla/index.html index 87bff0eb..2c3f069e 100644 --- a/docs/sla/index.html +++ b/docs/sla/index.html @@ -4,7 +4,7 @@ 服务水平协议 | 春松客服 - + @@ -13,7 +13,7 @@ 第三方未经批准的使用用户的账户或更改用户的数据; 用户对本公司服务的误解; 任何非因本公司的原因而引起的与本公司服务有关的其它损失。

特别提示:在受限于本协议其他规定的前提下,为更好的提供服务,本公司将定期或不定期的对本公司平台进行功能及(或)页面上的改造及(或)升级。本公司会通过本公司平台或其他有效方式将相关事项及用户注意事项告知用户,经上述告知,本公司不对因用户未能遵守相关注意事项而造成的损失承担任何责任,本公司经改造及(或)升级后,对于用户因操作习惯性而引起的损失,本公司不承担任何责任

受限于本协议其他规定的前提下,因本公司平台中接入的其他方的支付渠道与用户就支付关系发生任何争议的,与本公司无关,本公司不承担任何责任

当出现来自或针对客户网站的互联网攻击行为或者接到政府相关部门的监管要求时,本公司将通知客户立即进行处理,对未按照要求及时处理的,本公司有权采取相应措施,以避免网络或内容安全事件的进一步扩大;当出现紧急网络或内容安全事件(例如内容涉及国家监管部门禁止范围,被国家监管部门如网监勒令封闭 IP 等事件)时,为保护广大用户的合法权益,本公司有权在事先不通知对方的情况下采取相应措施。本公司对上述紧急网络或内容安全事件的处理措施免于承担责

用户接入第三方服务,比如百度统计等,并不是本公司负责安全保护,如果造成用户财产损失,与本公司无关,本公司不承担任何责任

2018 年 10 月 北京华夏春松科技有限公司

- + \ No newline at end of file diff --git a/docs/usage/index.html b/docs/usage/index.html index a1533e32..11bdaed0 100644 --- a/docs/usage/index.html +++ b/docs/usage/index.html @@ -4,13 +4,13 @@ 访问统计 | 春松客服 - +
版本:v8

访问统计

页面统计是针对坐席控制台的 Web 页面的使用情况进行统计,按照页面打开次数、登录地址和入口页面等内容进行计数。目前只支持接入百度统计,请注册百度统计帐号【百度统计-站长版】使用。

获得百度统计 Key

登录,新增网站,https://tongji.baidu.com/

新增网站

  • 网站域名:春松客服系统域名,必须是你安装的实际地址(假设你安装在 cc.example.com,则填写 cc.example.com)

  • 网站首页:春松客服首页 (https://cc.example.com)

拷贝 YOUR_SITE_KEY: 登录 -> 管理 -> 新增网站 -> 代码获取 -> 拷贝 SiteKey

hm.src = "https://hm.baidu.com/hm.js?YOUR_SITE_KEY";

统计代码获取

得到YOUR_SITE_KEY后继续设置环境变量

设置环境变量

设置环境变量 TONGJI_BAIDU_SITEKEY,可以在 .env 文件或 docker-compose.yml 文件中添加,参考部署文档:

https://docs.chatopera.com/products/cskefu/deploy.html

TONGJI_BAIDU_SITEKEY=YOUR_SITE_KEY

示例

TONGJI_BAIDU_SITEKEY=585cbac007x12es81b517031e9ec29c56e

重启服务

docker-compose restart contact-center

重启完成后,回到百度统计站点,在网站栏内,点击:代码安装检查,代码检查成功表示安装成功;注意网站域名等一致,数据收集有延迟。

报告

进入百度统计主页,选择站点“查看报告”

示例:

示例代码

注意事项

  • 该功能开发者/企业自行设置

  • 开源代码中没有后门、追踪程序、统计等

  • 不设置环境变量不进行统计,该统计报告只开发者/企业在百度网站内能查看

  • 开发者/企业自行衡量和保护百度统计账号,因百度账号泄漏等原因造成企业/开发者财产损失,春松客服不承担任何责任,见服务水平协议

- + \ No newline at end of file diff --git a/docs/v7/accounting/index.html b/docs/v7/accounting/index.html index cb4321b7..d80e2535 100644 --- a/docs/v7/accounting/index.html +++ b/docs/v7/accounting/index.html @@ -4,13 +4,13 @@ 账号和权限 | 春松客服 - +
版本:v7

账号和权限

系统管理员

在春松客服里,系统管理员是具备管理所辖组织内坐席、权限、角色、联系人和坐席监控等资源的管理员,系统管理员分为两种类型:超级管理员普通管理员,普通管理员也简称“管理员”。

超级管理员为春松客服系统设置的,初始化一个春松客服实例后,默认超级管理员用户名为 admin,密码为 admin1234,并且有且只有一个,IT 人员在初始化搭建的春松客服实例的第一件事就是更改超级管理员账号的密码,以确保系统安全。超级管理员具备更新系统所有属性的能力,读写数据,是春松客服内权限最大的用户。

安装启动系统,进入春松客服后台界面,输入初始化的超级管理员账号密码(用户名: admin, 密码: admin1234),点击立即登录。

登录界面

超级管理员同时维护者春松客服的组织机构的高层级,组织机构是树形结构,默认情况下没有组织机构信息,春松客服搭建完成后,由超级管理员设定根节点,比如总公司、总公司下属子公司,维护这样的一个层级结构,再创建其他管理员账号,普通管理员账号可以创建多个,不同管理员隶属于不同组织机构,该管理员只有管理其所在组织机构及该组织机构附属组织机构的权限。

系统管理员切换不同的组织机构,可以查看不同组织机构的数据。

权限设计

春松客服权限体系包括:组织机构,角色,账号。

权限的管理

角色可以自定义,设置对一系列资源的读写。角色的创建和删除,修改资源授权,只有超级管理员可以操作,,普通【管理员】只具备角色的使用权:添加或删除权限里的系统账号。

系统账号读写资源与角色的关系

将账号添加到角色后,因为账号也同时隶属于不同的组织机构,那么账号所具有的权限就是其所在组织机构以及附属组织机构的角色对应的资源的读写。

根据角色和坐席所在组织机构进行权限检查:

  • 超级管理员可以管理系统所有资源
  • 管理员可以创建部门人员
  • 组织机构支持层级的树状结构
  • 角色包含对不同资源的读写权限
  • 资源如联系人,客户等是根据组织机构进行隔离的
  • 网站渠道必须启用技能组,不同网站渠道接入的访客根据网站渠道设置分配给不同的技能组
  • 系统数据根据坐席当前所在的组织机构进行展示
  • 坐席可以看到自己所在组织机构以及附属组织机构的数据

假设组织机构如下:

组织机构示意图

  • 李四所能看到的联系人全集是 A 部门及其附属部门所创建的全部联系人
  • 李四看不到 B 部门的联系人,张三看不到 A 部门的联系人
  • 李四能看到刘一创建的联系人,刘一看不到李四创建的联系人

组织机构管理

创建部门

系统 -> 系统概况 -> 用户和组 -> 组织机构 -> 创建部门,并且可以启用或关闭技能组

创建部门

  • 名词解释:

部门 需要创建的部门名称

上级机构 选择上级部门

启用技能组 这里启用与否,技能是接待同一个渠道的坐席人员群组,春松客服支持配置自动分配策略,连接访客与坐席,简称 ACD 模块

更新、删除部门

进入部门列表

系统 -> 系统概况 -> 用户和组 -> 组织机构

编辑(修改)部门

系统 -> 系统概况 -> 用户和组 -> 组织机构 -> 修改部门

修改部门

删除部门

系统 -> 系统概况 -> 用户和组 -> 组织机构 -> 删除部门

设置部门地区

系统 -> 系统概况 -> 用户和组 -> 组织结构 -> 选中一个部门 -> 地区设置

设置部门地区

角色管理

创建角色

系统 -> 系统概况 -> 用户和组 -> 系统角色 -> 新建角色

只有【系统超级管理员】可以创建角色。

创建角色

名词解释:

角色 系统中用户的操作权限是通过角色来控制,角色可以理解为具备一定操作权限的用户组;

可以把一个或者更多的用户添加到一个角色下;

可以给一个角色设置一定的系统权限,相当于这个角色下面的用户有了这些系统权限;

角色创建好了以后,在所有组织机构中共享。不同组织机构的管理员,只能管理其所在组织机构和下属组织机构里的账号的角色。

编辑(修改)角色

系统 -> 系统概况 -> 用户和组 -> 系统角色 -> 修改角色

只有【系统超级管理员】可以编辑角色。

修改角色

删除角色

系统->系统概况->用户和组->系统角色>删除角色

只有【系统超级管理员】可以删除角色。

删除角色

账号管理

创建用户账号:系统 -> 系统概况 -> 用户和组 -> 用户账号 -> 创建新用户

提示:

电子邮件: 需要有效的格式
密码: 字母数字最少8位,手动录入
手机号: 全系统唯一
  • 用户分为管理员和普通用户

  • 坐席分为一般坐席和 SIP 坐席,普通用户与管理用户都可以成为坐席,SIP 坐席是在多媒体坐席的基础上

  • 每个账号必须分配到一个部门下,以及关联到一个角色上,才可以查看或管理资源,请详细阅读【组织机构】和【角色】管理

  • 创建普通用户

创建普通用户

  • 创建多媒体坐席

创建多媒体坐席

  • 创建管理员

创建管理员

查看账号信息

系统 -> 系统概况 -> 用户和组 -> 用户账号

查看账户信息

点击操作一栏中的“编辑”“删除”,可以对当前用户列表中的所有用户的信息进行编辑或者删除

添加账号到部门

系统 -> 系统概况 -> 用户和组 -> 组织结构 -> 选中一个部门 -> 添加用户到当前部门

  • 可以把已经存在的 用户账号 添加到一个特定的部门中

  • 一个用户账号只能隶属于一个部门

部门中添加账号

添加账号到角色

系统->系统概况->用户和组->系统角色>添加用户到角色

角色中添加账号

- + \ No newline at end of file diff --git a/docs/v7/channels/index.html b/docs/v7/channels/index.html index 2b5847c4..ed07c79a 100644 --- a/docs/v7/channels/index.html +++ b/docs/v7/channels/index.html @@ -4,13 +4,13 @@ 渠道管理 | 春松客服 - +
版本:v7

渠道管理

概述

春松客服支持多种渠道,访客的来源可能是多渠道的,这也是目前联络中心发展的趋势,以及对智能客服系统的一个挑战,一方面随着信息技术和互联网通信、聊天工具的演变,企业的客户逐渐分散,尤其是营销平台多元化。

多渠道的适应能力,是春松客服的重要特色。在【渠道管理】的子菜单中,查看支持的不同类型的渠道。

渠道支持

渠道名称简介获得
网页渠道通过在网页中注入春松客服网页渠道 HTML,实现聊天控件,访客与客服建立实时通信连接,支持坐席邀请访客对话等功能开源,免费,随基础代码发布
Facebook Messenger 渠道简称“Messenger插件”或“ME”插件, Messenger 是 Facebook 旗下的最主要的即时通信软件,支持多种平台,因其创新的理念、优秀的用户体验和全球最大的社交网络,而广泛应用。春松客服 Messenger 插件帮助企业在 Facebook 平台上实现营销和客户服务开源,免费,随基础代码发布
- + \ No newline at end of file diff --git a/docs/v7/channels/messenger/facebook-otn/index.html b/docs/v7/channels/messenger/facebook-otn/index.html index 882da72e..a70e6828 100644 --- a/docs/v7/channels/messenger/facebook-otn/index.html +++ b/docs/v7/channels/messenger/facebook-otn/index.html @@ -4,14 +4,14 @@ Facebook OTN 主动推送指南 | 春松客服 - +
版本:v7

Facebook OTN 主动推送指南

什么是 OTN 消息

OTN 消息是 Facebook 平台提供的 Facebook 主页可以向粉丝主动推送消息的工具。粉丝有权利订阅,订阅后 Facebook 主页管理员推送通知消息时,不受24小时规则限制,可以是营销或非营销消息。

OTN 是 One-time Notification 的缩写。

OTN

整个 OTN 使用流程可分为四步:

1、管理员在春松客服“营销中心”创建 OTN 记录,生成分享链接

2、运营人员发布分享链接到 Facebook Page 页面或其它渠道;

3、消费者或访客点击分享链接后订阅 OTN 通知,即分享链接页面的“通知我”按钮;

4、管理员可以通过手动触发或自动发送的方式,向订阅的访客发送 OTN 通知,即创建 OTN 记录时表单的内容。

使用 OTN 的关键在于掌握:OTN 创建表单,在推广活动时使用分享链接发送 OTN 通知

下图为 Facebook 官方给出的一个 OTN 通知在访客端的样例:

案例

开通 Facebook Page 的 OTN 权限

根据 Facebook 的规定,您首先需要为您的 Page 开通 OTN 权限。如下图所示,在 Page 中按照:设定→ 进阶信息→ 要求的功能→ 一次性通知 的路径为您的 Page 申请 OTN 权限。

开通权限

OTN 管理

营销人员可以在营销中心对 OTN 进行管理。在营销中心可以看到 OTN 的详细信息以及订阅人数和状态等。

创建 OTN

步骤:营销中心 → 创建 OTN

创建 OTN

OTN 表单内容。

自定义内容

  • OTN支持文本和图片两种消息类型
  • 请选择渠道是指messenger渠道
  • 订阅前邀请消息支持文本和图片,可以根据需要自定义
  • 订阅邀请文本
  • 成功订阅提醒是用户订阅消息后,收到的消息
  • OTN 内容指用户收到的营销人员发送的OTN消息详情
  • 推送时间可以预设,到达预设的时间,系统自动发送 OTN 消息

获得分享链接

创建 OTN 后,可以在 OTN 管理列表中,找到对应项的【分享链接】,点击【复制】。

那么,接下来,您就可以发布推文(Post),并且在推文中增加该链接,Facebook 用户在浏览推文,如果感兴趣就点击该链接,完成订阅!

编辑 OTN

步骤:Messenger OTN 列表页→ 操作栏→ 编辑 在推送内容前,管理员可以继续编辑 OTN 表单内容。

删除 OTN

步骤:Messenger OTN列表页→ 操作栏→ 删除

删除

发送 OTN 推送

活动的时间到了,是推送优惠券或者重要更新的时候了,之前点击了订阅的链接的用户,给 TA 们推送消息吧!

有两种发送 OTN 推送方式:定时发送手动发送

定时发送:在 OTN 的表单中,指定时间,在当前设定未到达前,您可以随时调整该时间。

定时发送

手动发送步骤:Messenger OTN列表页→ 操作栏→ 发送

手动发送

营销人员发布分享链接到 Facebook 主页

第一步:营销人员复制 Messenger OTN 列表中的分享链接

复制链接

第二步:进入 Facebook 主页页面,建立贴文;帖文中加上分享链接,然后发布

分享链接

Facebook 渠道用户订阅 OTN 消息

用户在 Facebook page 页面,点击分享链接,进入对话窗口后点击:通知我/Notify Me

订阅消息

Facebook 渠道用户接收 OTN 消息

用户订阅 OTN 消息后,营销人员在营销中心发送 OTN,用户就可以收到消息了

通知消息

查看 OTN 发送效果

OTN 列表页“订阅”一列显示此 OTN 订阅人数,订阅的用户都能接收到 OTN 推送,接收人数和订阅人数相同。

查看 OTN 数据

在 Facebook 主页上,作为管理员,从右侧管理面板进入公共主页成效分析,包含最近丰富的粉丝增长数据,页面访问情况数据,指导企业计算 RoI 等指标。

查看 Facebook 统计数据

OTN 注意事项

根据 Facebook 官方对于 OTN 的限制说明,需要注意:不能在短时间内多次向用户发送获得 OTN 许可的请求,即不能短时间内重复多次发送 OTN、请求用户点击“通知我/Notify Me”。这样的行为会被 Facebook 监控,如果 Facebook 算法检测到短时间内发送的 OTN 请求数量异常,您将面临失去访问 OTN 功能的风险。

- + \ No newline at end of file diff --git a/docs/v7/channels/messenger/index.html b/docs/v7/channels/messenger/index.html index 5f56b1b0..835ff6e4 100644 --- a/docs/v7/channels/messenger/index.html +++ b/docs/v7/channels/messenger/index.html @@ -4,13 +4,13 @@ Messenger 渠道 | 春松客服 - +
版本:v7

Messenger 渠道

Facebook Messenger

概述

Messenger 是 Facebook 旗下的最主要的即时通信软件,支持多种平台,因其创新的理念、优秀的用户体验和全球最大的社交网络,而广泛应用。通过 Facebook Messenger 的官方链接,可以了解更多。

https://www.messenger.com/

春松客服 Messenger 插件帮助企业在 Facebook 平台上实现营销和客户服务。

连接客户

  • 集成 Facebook 粉丝页,使用 OTN 推送营销活动信息,吸引新粉丝和激活老客户
  • 集成 Chatopera 机器人客服,自动回答常见问题,提升客户体验
  • 支持机器人客服转人工坐席,解决客户的复杂问题
  • 产品迭代一年,提供多个最佳实践,帮助企业高效率运营
  • 春松客服运营分析和 Chatopera 机器人客服运营分析生成报表,洞察业务指标

了解 Messenger 的强大功能

首先,出海企业要获客,或者通过互联网方式提供服务,那么 Facebook 上的广告和 Messenger 服务,是您无论如何都要使用的,因为你可以从这里找到您的目标客户、潜在客户。但是,如果 Facebook 平台的商业化程度过高,将影响社交网络内用户的体验,比如用户收到和自己不相关、不感兴趣的、大量的广告。为此 Facebook 在广告和 Messenger 上,有很多设计、一些限制,达到了商业化和人们社交需求的平衡,这是 Facebook 能成为今天世界上最大的社交网络的关键原因之一。

其次,您需要了解 Messenger 的一些应用场景,比如 Chatopera 为九九互动提供的智能客服和 OTN 服务的案例chatopera-me-jiujiu2020

在正式介绍春松客服 Messenger 插件的使用之前,需要说明 Chatopera 提供该插件是通过 Facebook Messenger 平台的开发者 APIs 实现,因此,该插件的功能安全可靠、稳定强大并且会不断更新。

https://developers.facebook.com/docs/messenger-platform

使用指南


  1. 春松客服为出海企业提供智能客服,https://www.chatopera.com/solutions/overseas.html
- + \ No newline at end of file diff --git a/docs/v7/channels/messenger/install/index.html b/docs/v7/channels/messenger/install/index.html index 156abd22..c7247b03 100644 --- a/docs/v7/channels/messenger/install/index.html +++ b/docs/v7/channels/messenger/install/index.html @@ -4,14 +4,14 @@ Messenger 渠道配置 | 春松客服 - +
版本:v7

Messenger 渠道配置

前提准备

在使用春松客服集成 Messenger 前,您需要做如下准备工作。

准备工作描述网址
注册 Facebook 账号创建 Messenger 应用,Facebook Page 页,测试 BOT 等需要准备 Facebook 账号link
注册 Chatopera 云服务账号创建机器人客服需要使用 Chatopera 云服务link
部署春松客服实例春松客服实例需要安装有 Messenger 插件link
初始化春松客服使用超级管理员创建组织机构,技能组,坐席角色和一个坐席账号,将账号绑定到坐席角色和技能组link

在配置的过程中,还需要开通额外的账号或资源,是以以上为基础的。

集成 Messenger 渠道

安装好春松客服 Messenger 插件后,系统管理员登录,只有系统管理员或超级系统管理员【admin】可以维护 Facebook Messenger 渠道。

Messenger 渠道管理

在右上角组织机构,选择一个技能组,然后进入【系统管理】,打开 【Messenger】页面。

打开 Messenger 渠道管理

注意:此处要先切换到技能组,因为创建 Messenger 渠道必须绑定一个技能组。

点击【创建渠道】。

创建渠道

如图,创建 Messenger 表单有几个信息,接下来,我们将介绍如何获得这些信息。

创建 Facebook Page

Facebook Page,也称为 Facebook 粉丝页、Facebook 页面、Facebook 主页,是 Facebook 为机构、企业、非营利性组织等各种类型的组织提供的站点,在该站点组织发布消息,和 Facebook 平台的用户互动。在粉丝页,Facebook 提供了广告、推文、点评、小组、数据分析等工具,帮助企业充分的利用社交网络实现营销、品牌建设。

粉丝页

在上图,我们注意到,访客可以看到“发消息”按钮,那么点击发消息按钮就可以唤起 Messenger 聊天控件和企业互动,完成反馈、咨询等。服务访客的,可能是人工坐席,也可以能是机器人客服,此外,企业可以主动联系访客,并进而通过 Messenger 进行实时对话。稍后,我们将介绍如何集成配置春松客服连接一个 Facebook 页面,然后进行更多最佳实践的介绍,敬请继续阅读。

在熟悉了 Facebook Page 的定位以后,当您有了 Facebook 账号,您可以通过下面链接快速的创建一个 Facebook Page。

https://www.facebook.com/pages/creation/?ref_type=comet_home

快速创建

在此,我们创建一个示例页面,在演示如何在春松客服集成 Messenger 时使用,注意:企业创建 Messenger 应用以后,可以将 Messenger 应用集成到 Facebook Page 上,Facebook Page 是企业的一个对外的主页,而并不是唯一的,Messenger 应用同时支持多种渠道,比如网页聊天、Whatsapp等。Messenger 应用的介绍是在下一环节。

假设我们创建的 Facebook Page 名称:春松客服 DEMO。创建完成后,进入 春松客服 DEMO 地址,这时,我们是管理员视图,点击“访客视图”,就是普通访客看到的页面。

访客视图

注意:此时,Facebook Page 刚刚创建,对于 Facebook 普通用户而言,这个页面还是不可见的,作为管理员,在 Facebook Page 设置页面,进行可见度设置,调整为 Public 才是公开的。设置界面,后面我们还会使用到。

管理员界面

添加联系我按钮

此时,我们有了一个 Facebook Page,默认情况下,没有联系我按钮,我们需要手动的添加。

在 Facebook Page 页面,以管理员视图查看,找到“添加按钮”,点击这个按钮。

添加按钮

这时,我们在很多弹出的选项中,选择“发消息”。

发消息

提交后,在您的页面上,便有了“发消息”按钮。作为管理员,您可以设置或测试它。

测试对话

当我们再以访客视图查看,就会发现唤起 Messenger 聊天控件的发消息按钮。

访客视图

作为 Facebook Page 的管理员,我如何回复消息呢?

有两个方案:

普通模式

在默认情况下,用户浏览会以通知的形式发送给您登录的浏览器,您可以进行回复。并进入设置→消息,进行一些个性化的设置。

回复消息

此种方式下,访客的信息并没有和您的 CRM 系统联通,信息分散了;此外,您的访客可能来自不同渠道,Facebook Messenger 只是其中之一,渠道不能统一到一个系统,您的组织的客户服务工作效率降低,客户体验差。还有很多问题,这就是为什么 Facebook 提供了第二种模式 - 高级模式。

高级模式

在高级模式下,Facebook 将访客在您的 Facebook Page 上唤起的 Messenger 对话控件的消息,转发给了兼容 Facebook Messenger 平台的软件服务,比如一个春松客服实例,春松客服和 Facebook Messenger 平台之间进行通信,并且以约定的形式,企业可以主动发起会话、发布营销通知、回复访客会话等,Facebook 平台同时有丰富的接口,春松客服可以获得访客的 ID、语言、所在地区、邮箱、电话号码等信息,从而满足客户关系管理、营销和客服等诉求。下文,我们就详细介绍如何使用春松客服 Messenger 插件,通过高级模式,支持 Messenger 的对话。

创建 Messenger 应用 在高级模式下,企业可以选择:

  • 1)企业自行开通 Facebook 开发者平台账号,创建 Messenger 应用,并绑定 Facebook Page;
  • 2)和支持 Facebook Messenger 平台的服务商合作,获得技术支持,比如春松客服官方团队,该技术支持是付费服务项。

我们推荐企业使用第一种方式,即自行开通,该过程会多花一点时间,但是相对也简单,这种方式,完全由企业在 Facebook 平台上操作,不涉及任何春松客服官方的接口、云服务。

在以上两种方式中,您的春松客服实例都需要配置 HTTPs 协议,这部分后续会详细介绍。接下来,我们就以自行开通 Facebook 开发者平台进行讲解。

打开 Facebook Developer Portal, 使用 Facebook 账号开通

https://developers.facebook.com/apps

开通后登入,点击创建应用,一个应用可以关联多种 Facebook 产品,Messenger 是产品之一,因为本文我们将用该应用关联 Messenger 产品,因此,我们简称此种应用为 Messenger 应用。

Facebook 应用

在弹出的表单中,选择“更多选项”。

更多选项

接着填写应用的名称,联系邮箱。

联系邮箱

这里,我们假设名字填写了【春松001】,作为示例程序名字。如果您有开通 Facebook 商务账号,也可以在这里关联,该项为非必填。

Facebook 商户账号( https://business.facebook.com/ )是管理企业的组织人员、广告等资产的平台。

当应用创建成功,自动跳转到应用详情页面,如下。

详情页面

在添加产品卡片上,点击 Messenger 的【设置】按钮,进入 Messenger 产品设置页面,该页面有较多内容,我们将着重介绍有关和春松客服集成到 Facebook Page 相关的内容。

页面滑动至【访问口令】,点击【添加或移除主页】。

访问口令

此时,将弹出对话框,提示授权登录 Facebook,登录成功后,将展示您的 Facebook Page 列表,此时,我们可以看到【春松客服 DEMO】,勾选并选择提交。

绑定页面

如果该绑定失败,可能会提示原因,并且提示您进行变更,如下所示,点击【完成】。

完成绑定

此时,代表着【春松客服001】Messenger 应用正式接管了 Facebook Page 【春松客服 DEMO】的消息管理。回到应用详情页面,此时 Messenger 设置中,就出现了【春松客服 DEMO】。

完成接入

获得 Messenger 配置信息

还记得之前在春松客服内,创建 Messenger 渠道的表单吗?现在,对于表单里的内容,就可以获得了。

配置项描述示例
名称渠道名称,可使用 Facebook Page 名字春松客服 DEMO
Page IDFacebook Page 的唯一标识。在 Messenger 应用的设置的访问口令列表中,Page ID 就是主页名称下的数字字符串159955055741
Access Token访问 Facebook Page 的口令,每个 Facebook Page 使用不同口令。在 Messenger 应用的设置的访问口令列表中,点击【生成口令】xxxx
Verify Token该值为随机字符串,由企业用户自定义foobar20

渠道表单

创建 Messenger 渠道

回到春松客服 Messenger 渠道创建表单,填写对应值,点击【提交】。

提交表单

此时,渠道创建成功。但是,还需要一些配置,使得春松客服实例与 Facebook Messenger 平台服务连接起来。

配置 HTTPS

处于安全的考虑,Facebook 要求 Messenger 应用对接的软件服务使用 HTTPS 加密协议,春松客服企业用户有多种方案完成这一目的,针对生产环境,推荐您使用文档《春松客服配置 CDN和HTTPS》进行配置。出于本文是演示使用的目的,我们使用更为简单的方案,但是企业客户不要在生产环境用这种方式,避免因连接不稳定给您带来的损失。

在下文,我们使用 ngrok 为春松客服实例实现 HTTPS 协议的访问地址,ngrok 是可以免费使用的,但是需要您先注册,注册好了使用 ngrok 的命令行客户端绑定 localhost 的春松客服端口,ngrok 就提供一个 https 地址作为代理。

执行命令:

ngrok http 8035

此处,8035 即春松客服实例运行端口。

HTTPS 代理

在以上 ngrok 运营的结果,就是 https://efdbe3894f65.ngrok.io -> http://localhost:8035

此时,我们就得到了春松客服的HTTPS服务的地址 https://efdbe3894f65.ngrok.io

激活渠道连接

进入 Messenger 应用设置页面,滑动至【Webhook】区域,点击【添加回调网址】。

回调信息

在弹出的对话框内,填写回调地址和验证口令。

地址和验证

回调地址:https://your_domain/facebook/webhook/{{PAGE_ID}} ,将 {{PAGE_ID}} 替换为Page ID。

验证口令:即之前设定的 Verify Token。

点击【验证并保存】,此时,Facebook 会请求春松客服实例,保证服务连接状态正常,回到设置页面;若连接不成功,将会进行提示。

注意:第一次配置回调地址成功后,回调地址栏内将有值。一个 Messenger 应用可以集成多个 Facebook Page,这些 Facebook Page 是共享一个回调地址和验证口令的,那么您在这个 Messenger 应用上添加第二个 Facebook Page 并且都是连接到同一个春松客服实例时,是不需要再次设置 Webhook 信息的,所有的 Facebook Page 对话将一起被发送给这个回调地址处理。

配置 Webhook

至此,配置 Webhook 成功。

Webhook 添加订阅

完成添加 Webhook 信息,还需要在 Webhook 栏内选择【添加订阅】。

设置订阅内容

Facebook 将该主页发生的【发消息】相关的事件分为很多种类型,现在我们勾选 messages 和 messaging_postbacks。如果需要了解其他的事件类型可以参考 Facebook Messenger 平台文档

检查订阅内容

保存,回到 messenger 设置页面后,可见 Webhooks 多了两个字段。

完成订阅

此时,渠道就连接上了,春松客服经由 Facebook 开发者平台对接上了 Facebook Page 上的 Messenger 对话控件。

做一个测试

在集成 messenger 渠道的准备工作里,提到前提条件包括创建技能组、创建坐席人员的角色和创建至少一个账号关联角色和技能组。假设这个坐席人员名字是张三,现在,我们作为技能组的张三登录系统。同时,进入春松客服 DEMO 的 Facebook 主页,点击【发消息】,开始对话。

发送测试消息

访客发送的消息会自动在张三的网页上弹屏,二者进入对话。

正式上线

之前,在 Facebook 主页内的操作,我们都是使用管理员账号,此时,Facebook 普通用户作为访客登录,发起 Messenger 对话,是不会被 Facebook 转发到春松客服的,为了达成这个目标,我们需要提交上线,此过程需要在 Facebook 开发者平台,应用详情页面,编辑申请权限。

编辑权限

找到 pages_messaging,点击申请。

申请

提示申请需要大约 5 天,根据经验,三天内就可以完成。

提交状态

提交申请后,同时我们丰富一下 Facebook 应用的介绍信息,这是可能被数十亿人浏览和使用的!

比如应用的 Icon, 服务条款网址等。

审核内容

当权限申请完成,应用信息填写完成,正式提交审核,在侧边栏,点击【应用审核->申请】。

处理申请

注意:以上图片因为没有完成权限申请,没有提交上线的审核按钮。

上线审核通过后,在应用设置页面的上方,将【开发中】开关拨动到另一侧,此时,Facebook Page 和春松客服的集成大功告成。

上线

这时,您的主页就可以通过购买 Facebook 广告、发布文章等方法运营、转化客户了。

进一步学习最佳实践

接下来,您可以阅读下面的最佳实践系列文章,了解如何一步一步的打造良好的用户体验。

最佳实践主要是针对 Facebook 主页与春松客服之间的使用经验,如何获得高效的运营体验和客服服务体验,完成营销和客服工作。

此外,春松客服的基本功能如报表和坐席监控等,请参考春松客服文档中心的其它部分。

最佳实践

- + \ No newline at end of file diff --git a/docs/v7/channels/messenger/message-types/index.html b/docs/v7/channels/messenger/message-types/index.html index c7ff3266..2a7c5b03 100644 --- a/docs/v7/channels/messenger/message-types/index.html +++ b/docs/v7/channels/messenger/message-types/index.html @@ -4,13 +4,13 @@ Messenger 管理机器人客服对话 | 春松客服 - +
版本:v7

Messenger 管理机器人客服对话

概述

本文演示ME渠道机器人可以实现的一些基本功能。

阅读本文前需了解:

关系图

开始按钮

用户首次打开该 Facebook 主页的 Messenger 对话窗口时,主页显示【Get Started】,引导用户开始和机器人对话。

点击按钮后,机器人发送自定义欢迎信息。

欢迎语

实现原理:

通过 Messenger Profile API 设置 Page 欢迎屏幕会显示“开始”按钮,payload 设置为 __get_start

户轻触此按钮后,Messenger 平台会向您的 Webhook 发送一个 messaging_postbacks 事件, 发送 __get_start 到机器人,开启机器人对话。

延申阅读Facebook Messenger 消息格式Get Started 文档

在多轮对话设计器中,处理__get_start事件,定制机器人回复:

欢迎事件

比如下面技能代码,实现响应 __get_start 事件,推送欢迎语和导航菜单。

技能函数:

// Get Started
+ __get_start
- ^get_start()

技能函数:

exports.get_start = async () => {
return {
text: '#in params',
params: [{ // 文本消息
text: '欢迎使用ME机器人客服'
}, {
attachment: { // 导航菜单
type: 'template',
payload: {
template_type: 'button',
text: 'Hi,你想查看什么?',
buttons: [{
type: "phone_number",
title: "商务洽谈",
payload: "+8613691490568",
},
{
type: "postback",
payload: "__body_feeling",
title: "查看城市体感",
},
{
type: "postback",
payload: "__start_ask",
title: "咨询问题",
}
],
},
},
}, ]
}
}

导航菜单

我们给用户推送一个导航菜单,引导用户使用我们的服务。

菜单按钮直接触发云平台对应机器人技能。

导航菜单

导航菜单使用 Buttons 实现,按钮类型同 Messenger Buttons

菜单 payload 在用户点击后推送给机器人。

快捷回复

现在用户想查看城市体感信息,我们通过快捷回复,给用户几个热门城市选择,点击直接回复机器人。

快捷回复

用户选择 “查看城市体感” , __body_feeling 技能被处理,返回推荐选项给用户选择。

技能脚本:

// 显示推荐城市
+ __body_feeling
- ^queryFeeling()

// 查询城市数据
+ __query_city (*)
- ^getWeatherByCity(<cap1>)

技能函数

exports.queryFeeling = async () => {
return {
text: '#in params',
params: {
text: '请选择需要查询体感的城市',
// 快捷回复选项
quick_replies: [{
content_type: 'text',
title: '北京',
payload: '__query_city 北京',
},
{
content_type: 'text',
title: '上海',
payload: '__query_city 上海'
},
],
},
};
}

// 此处简化处理,技能函数有访问REST API的能力
exports.getWeatherByCity = function(city, cb) {
debug("getWeatherByCity: %s", city);
let data = {
'北京': '舒适',
'上海': '闷热'
}

cb(null, city + '体感' + data[city]);
}

知识库查询

在输入框直接回复完整问题查询知识库,回答已有的知识点。

知识库

在 Chatopera 云平台,设置常见问答对。用户问答和知识库数据匹配度超过指定阈值时,直接回复该条目答案。

知识库回复

知识库反馈

针对知识库的问答对,可以请用户进行反馈,提高知识库准确定。

知识库反馈

数据统计展示在云平台ROI数据中。使用 Chatopera 云服务 聚类分析 ,选择性优化知识库,提升机器人服务效果。

知识库聚类

知识库推荐

当问题没有匹配,有相关问题时,系统会推荐给用户,供用户快速选择。

知识库推荐

人工服务

用户问题机器人无法解决时,可在适当时机转人工处理。

转人工

系统会根据ACD策略接入合适的客服,进行处理。客服可以看到用户的历史对话,并使用 知识库快捷,知识库联想、转接其他专业客服等功能更好的服务访客。

小结

基于以上介绍,企业用户在春松客服和 Chatopera 机器人平台基础上,可以无代码的方式提供基于知识库的 FAQ Bot 和 低代码的方式实现多轮对话 Bot。

强大的定制化开发能力,满足企业客户的各种需求,提升企业的智能化和自动化,在规模化的同时,消费者获得个性化服务,自助式服务。

- + \ No newline at end of file diff --git a/docs/v7/channels/messenger/messenger-chatbot/index.html b/docs/v7/channels/messenger/messenger-chatbot/index.html index c35ee397..50bfad82 100644 --- a/docs/v7/channels/messenger/messenger-chatbot/index.html +++ b/docs/v7/channels/messenger/messenger-chatbot/index.html @@ -4,13 +4,13 @@ Messenger 渠道配置机器人客服 | 春松客服 - +
版本:v7

Messenger 渠道配置机器人客服

概述

在春松客服中集成了 Messenger 渠道后,您可以通过配置机器人客服实现更加高效,方便,快捷的服务方式。机器人客服可以帮助您回答简单问题,提供轻松的娱乐,预先过滤访客数据,收集信息等,大大减少了人工客服的工作量。

配置机器人客服

春松客服实例需要安装有 Messenger 插件和智能机器人插件。只有超级管理员「admin」可以维护智能机器人插件。

创建机器人

步骤:系统→系统设置→智能机器人→新建

新建机器人

点击新建之后,弹出集成智能机器人对话框。渠道类型默认的是网站渠道,需要选择 Messenger 渠道。

选择 Messenger 渠道

根据提示填写对应信息,其中 ClientId 和 Secret 需要在 Chatopera 云服务中机器人的设置页面获取。

填写密钥

点击保存之后,创建智能机器人成功。

编辑机器人

步骤:智能机器人页面→操作栏→绑定

绑定

设置机器人

步骤:智能机器人列表选择需要设置的机器人→根据需求进行设置

设置

删除机器人

步骤:智能机器人页面→操作栏→删除

删除

机器人不同工作模式

模式描述是否可以转接不同工作模式
机器人客服优先当有新的访客接入会话时,机器人客服优先服务。访客可以选择转人工服务。
人工客服优先当有新的访客接入会话时,人工客服优先服务。
仅机器人客服当有新的访客接入会话时,机器人客服优先服务。访客不可以选择转人工服务。

访客和机器人对话

访客在 Facebook page 页面点击「发消息」进入对话窗口,访客在对话窗口中发消息可以收到机器人回复,并且可以评价机器人的回复是否有帮助。

评价机器人

访客反馈问题是否有帮助后,数据会记录到 Chatopera 云服务中,登录 https://bot.chatopera.com/ 进入机器人「统计」页面可以查看数据。

查看统计数据

访客如何选择转人工服务

访客和机器人对话触发到兜底回复时,兜底回复下带有「转人工」的按钮,访客点击「转人工」收到提示消息后就可以发送消息和人工客服对话。

转人工

人工客服如何结束对话

Facebook 渠道的访客不能主动结束对话,需要人工坐席在坐席工作台主动结束对话。

结束对话

- + \ No newline at end of file diff --git a/docs/v7/channels/webim/index.html b/docs/v7/channels/webim/index.html index b3a06289..f8e98091 100644 --- a/docs/v7/channels/webim/index.html +++ b/docs/v7/channels/webim/index.html @@ -4,13 +4,13 @@ 网页渠道 | 春松客服 - +
版本:v7

网页渠道

概述

网页聊天支持可以适配移动设备浏览器,桌面浏览器。可以在电脑,手机,微信等渠道接入网页聊天控件。

安装

获取网页脚本,系统 -> 系统管理 -> 客服接入 -> 网站列表 -> 点击“Chatopera 官网” -> 基本设置 -> 接入;

接入网站

将图中的代码复制到一个 Web 项目的页面中,例如下图的。

粘贴聊天控件代码

使用

使用浏览器打开该 Web 页面。

聊天控件

【提示】该网页需要使用 http(s)打开,不支持使用浏览器打开本地 HTML 页面。

点击该网页中出现的“在线客服”按钮,出现聊天窗口,可以作为访客,与客服聊天了。

与在线客服对话

【提示】春松客服提供一个测试网页客户端的例子,可以使用 http://{{春松春松客服IP:[PORT]}}/testclient.html 进行访问。

- + \ No newline at end of file diff --git a/docs/v7/crm/index.html b/docs/v7/crm/index.html index 8ff99674..de3cb11f 100644 --- a/docs/v7/crm/index.html +++ b/docs/v7/crm/index.html @@ -4,7 +4,7 @@ 客户关系管理 | 春松客服 - + @@ -13,7 +13,7 @@ 其中“联系人信息”,会同步到 左侧菜单->全部联系人;

新建联系人

编辑客户

左侧菜单 -> 全部客户 -> 客户列表 -> 选中一个客户 -> 点击“编辑”按钮

只能更新“基本信息”,“企业信息”; 需要更新 “联系人信息”,请移步到 左侧菜单->全部联系人;

联系人笔记

进入联系人列表,选择一个联系人,点击联系人姓名,进入详情页面。 在详情页面,编辑联系人笔记,记录来往历史。

编辑联系人笔记

删除客

左侧菜单 -> 全部客户 -> 客户列表 -> 选中一个客户 -> 点击“删除”按钮

- + \ No newline at end of file diff --git a/docs/v7/deploy/index.html b/docs/v7/deploy/index.html index ec31fedc..b4492c2a 100644 --- a/docs/v7/deploy/index.html +++ b/docs/v7/deploy/index.html @@ -4,7 +4,7 @@ 应用部署 | 春松客服 - + @@ -15,7 +15,7 @@ docker pull cskefu/contact-center:develop

春松客服包含多个 image。

导出镜像

下载好 image 后,导出 image,将所有 image 使用下面命令导出为 tgz 文件

docker save cskefu/contact-center:develop > cc.docker.tgz

上传镜像

将所有导出的 image tgz 文件上传到目标部署的服务器 即网络条件不好的机器,比如用 FTP 工具或 SCP 命令。

安装镜像

上传到目标机器后,安装镜像 docker load < cc.docker.tgz

安装成功后,会提示。

启动服务

启动春松客服,参考本章以上内容。

cd cskefu # 源文件下载地址
docker-compose up -d contact-center

下一步

配置 HTTPS

系统初始化

系统维护

- + \ No newline at end of file diff --git a/docs/v7/faq/index.html b/docs/v7/faq/index.html index b6af32ec..7958e6b6 100644 --- a/docs/v7/faq/index.html +++ b/docs/v7/faq/index.html @@ -4,7 +4,7 @@ FAQ | 春松客服 - + @@ -14,7 +14,7 @@ 适用场景包括售前、对话营销。

问:多轮对话设计器、智能问答引擎,这两个集成后是开源的吗,还是付费使用?

多轮对话设计器可以免费下载使用, 智能问答引擎还没有开源。参考Chatopera 云服务

问:请问客户怎么接入?

部署安装,配置使用。创建网站渠道,查看网站渠道详情有集成指南。

问:软件怎么收费?

基础模块不收费,商业插件和服务收费。参考开源项目地址主页介绍

问:春松客服支持哪些渠道?

免费模块目前支持 PC,Mobile 浏览器,开源版本就可以。APP 需要对接 SDK,这个有额外的开发工作,我们可以定制开发。

付费模块支持安装 Facebook Messenger 渠道插件。

问:如果我们也需要给商家开坐席,也是能支持的吗?

支持,春松客服内置的权限,组织机构管理使用参考账号和权限

问:那怎么能互相交流?后台看到坐席了,前端是不是还要在跑一个程序?

访客可以用网页客户端插件,参考文档

问:有没有 java 项目可以直接导入 idea?

开发环境搭建

问:为啥我这里客服没有管理员权限就看不到对话?

权限由“人员-角色-资源”确定。资源又通过部门隔离,参考[cc] resource 根据角色和部门进行权限检查 #61 然后,具体到坐席管理,需要新建一个角色。之后赋予坐席的权限。再加“人员”到这个角色。

问:我的服务器已经部署过 redis mysql 等服务,对这个项目部署有问题吗?

那可以直接用,设置环境变量就行。修改一下 docker-compose.yml。

问:有本地部署的教程文档吗?

参考春松客服部署方案

问:我想改成异步触发对话,后台重新输出了一下页面作用域里面的值,发现参数太多,web 通信时候调用得 socket.io.js 有没有相关的文档和参数解释?

[cc] 提供启动客服会话的 RestAPI #97

问:由于使用了 netty-socketio,所以 Web 端、android、ios 端都需要使用 socketio 的客户端吧,比如不能说 Android 直接写原生 netty 客户端 或者 web 直接写 websocket 客户端去连服务器,对吧?

socketio 是对 websocket 进行封装,是 websocket 协议的一种实现,在客户端通过 websocket 连接应该是没问题的。这块我还没有试过,不过肯定能 google 到。

问:微信功能接进去了吗?

现在还不支持微信公众号。

问:机器人自动回复模块在哪?

机器人客服参考文档

问:多轮对话,看上去就是在编辑脚本,有对分支逻辑的支持吗?

支持分支编辑,参考 https://github.com/chatopera/chatbot-samples

问:多轮语言的编辑的 开源的也有么

我们做的不开源。

问:就是客服开源对吧

Chatopera 全部开源项目查看 https://github.com/chatopera

问:春松的访客,有匿名用户和注册用户的概念吗

没有,访客并不注册账号,客服端可以关联联系人。

问:没有多租户也就是你们没有考虑搞 saas 云喽?要用只能做独立部署?

春松客服 SaaS 版暂时没有上线时间计划,主要是企业私有部署或部署在 IaaS 云服务内。

问:现在的最新开源代码,已经完成集群改造了?

集群还需要调整一点代码,因为目前单机版性能轻松支持 200 位坐席人员同时使用,集群部署还未提上日程。

问:常用浏览器兼容到的最低版本多少?

有条件就用最新的,安全性有保证。 特殊说明微软浏览器:暂时不支持IE,请推荐用户使用 Edge 浏览器。

问:这个项目要怎么启动呢

- + \ No newline at end of file diff --git a/docs/v7/index.html b/docs/v7/index.html index 749dadc4..db8016f4 100644 --- a/docs/v7/index.html +++ b/docs/v7/index.html @@ -4,13 +4,13 @@ 春松客服 | 春松客服 - +
版本:v7

春松客服

https://www.cskefu.com

春松客服是拥有坐席管理、渠道管理、机器人客服、数据分析、CRM 等功能于一身的新一代客服系统。将智能机器人与人工客服完美融合,同时整合了多种渠道,结合 CRM 系统,为客户打标签,建立客户的人群画像等,帮助企业向客户提供更加专业客服服务。

!!! 目前,春松客服 v7 已经不在积极维护,请参考文档中心使用稳定版本。

用户案例

产品定义

客服系统是企业的重要工具,尤其是移动互联网时代,微信公众号、移动电话或是 Facebook Messenger 等渠道分散了企业的服务渠道,企业需要响应来自任何地点任何时间的客户。同时,企业的口碑至关重要,企业服务需要在客户获得、客户激活、客户留存等阶段无懈可击。

客服的重要性

春松客服有下面的亮点:

模块化设计

将功能以插件形式模块化,适合企业长期使用,尤其是中小型企业,灵活购买高级插件。

插件机制

部署方便

以容器化基础,安装使用 Docker 编排,卸载等非常简单。

机器人客服

强大的机器人客服解决方案,与 Chatopera 机器人平台等产品集成。

全周期解决方案

开箱即用

春松客服提供多个开箱即用的模块:

  • 账号及组织机构管理:按组织、角色分配账号权限

  • 坐席监控:设置坐席监控角色的人员可以看到并干预访客会话

  • 联系人和客户管理:CRM 模块,管理联系人和客户,细粒度维护客户信息,自定义标签和打标签,记录来往历史等

  • 网页渠道组件:一分钟接入对话窗口,支持技能组、邀请和关联联系人等

  • Facebook 渠道组件:快速接入 Facebook Messenger 渠道,通过 Messenger 支持 Facebook 粉丝页、Shopify 等海外社交、电商平台

  • 坐席工作台:汇聚多渠道访客请求,坐席根据策略自动分配,自动弹屏,转接等

  • 机器人客服:与Chatopera 云服务集成

  • 企业聊天:支持企业员工在春松客服系统中群聊和私聊

  • 质检:历史会话、服务小结、服务反馈及相关报表

在本文档中,也称以上模块为基础模块

产品演示

演示环境是为了帮助大家了解春松客服,以下是地址和超级管理员账号。

网站用户名密码
https://demo.cskefu.com/adminadmin1234

提示:【演示环境】定时刷新且任何人都可以登录,不要更改密码和创建敏感数据,因该网站会频繁重置数据和升级该网站不能作为生产系统评估,仅作为应用可行性参考;评估系统,比如压力测试和性能测试,请按照部署文档deploy操作获得新的服务实例。

使用场景角色

客户

需要智能客服系统的企业。

客服人员

指代客户的客服团队的工作人员。

访客/消费者

指代甲方的客户,是需要通过联系客服人员咨询问题的人。

开发人员

指代智能客服系统的开发者,开发人员应该是有权限修改智能客服系统代码的人,包括 Chatopera 工程师和春松客服开源社区开发者。

业务专家

指代熟悉客户业务的人员,业务专家可以提供产品设计的意见,可以参与智能问答的质量评定,也可以作为管理员登录智能客服系统,配置系统,管理智能对话和训练。

关注春松客服公众号

及时获得产品更新、活动分享等信息。

春松客服公众号

用户使用文档 PDF

春松客服用户使用指南(PDF) 2022 最新版本下载链接

https://www.cskefu.com/moment/825.html/

用户使用文档(PDF)是与文档中心的内容一致的 PDF 文件。PDF 格式方便查看、搜索和打印。使用时注意版本更新,相对而言,网站 是最新的,注册春松客服官网:https://www.cskefu.com/,及时获得更新提醒。

定制化开发培训课程

开发者通过学习《春松客服大讲堂》cskefudjt2019来掌握基于春松客服定制开发客服系统,在春松客服基础上添加企业特别需求的功能。

- + \ No newline at end of file diff --git a/docs/v7/initialization/index.html b/docs/v7/initialization/index.html index d1e61df6..bfb6f59e 100644 --- a/docs/v7/initialization/index.html +++ b/docs/v7/initialization/index.html @@ -4,13 +4,13 @@ 系统初始化 | 春松客服 - +
版本:v7

系统初始化

完成部署春松客服实例后,还需要针对企业的组织架构和客服坐席进行配置才能使用。请认真阅读本页内的内容,尤其是【常见问题】一节。 这样可以节约您的宝贵时间!

默认的账号 admin 是超级管理员,该账号做了特殊处理:可以使用坐席工作台,但是不具备接待访客会话的能力。

只有对系统进行初始化,才能开始处理客户咨询,所以初始化主要是针对坐席管理的,也请先详细阅读 权限设计

在您了解了组织机构角色账号网页渠道的概念后,继续阅读一下内容。

春松客服刚搭建好后,合理的初始化顺序是:1)创建组织机构;2)创建角色;3)创建账号;4)账号添加到组织机构;5)账号添加到角色。 在使用过程中,也可以灵活调整。

默认的账号信息

在系统部署后,得到默认的:

登录账号密码角色
adminadmin1234系统超级管理员
zhangsanagent1234客服坐席人员
  • 系统超级管理员【admin】, 密码:admin1234

  • 角色【管理员】【高级坐席】【初级坐席】

    • 初级坐席:仅具备坐席服务的基本资源读写权限
    • 高级坐席:在初级坐席基础上,支持【坐席监控】等高级功能
    • 管理员:可以查看【系统管理】并对管理员所在的组织机构和附属组织机构进行人员、设置等
  • 组织机构【售前坐席A组】, 及其从属

    • 角色【普通坐席】
    • 坐席账号【zhangsan】,属于角色【普通坐席】, 密码:agent1234
    • 网站渠道【localhost】, 该聊天控件可以在 http(s)://CSKEFU_IP:CSKEFU_PORT/testclient.html 体验

需要强调的是,为了系统安全起见,您可以按照一下顺序删除网站渠道【localhost】【zhangsan】【普通坐席】【售前坐席A组】

修改默认账号密码

为了安全起见,在系统部署后,完成密码修改并妥善保管密码。

修改【admin】账号

使用系统超级管理员 admin,点击右上角【个人资料】。

个人资料

设置新密码并保存。

设置

修改【zhangsan】账号

使用系统超级管理员 admin 进入【售前坐席 A 组】,再进入系统管理,账号管理,找到zhangsan,点击编辑进行修改。

修改账号

创建组织机构

参考组织机构管理,为企业建设一个树形的组织架构。针对坐席小组,设定为 技能组

创建角色

参考角色管理,创建角色并授予相应的权限,客服人员主要需要的资源就是坐席对话全部客户全部联系人,此处全部客户全部联系人是限定在该坐席所在的组织机构和下属组织机构而言的。

创建角色

若果该角色需要能干预其他坐席人员的会话,则可授予会话监控,此处也是监控该坐席所在的组织机构和下属组织机构的。

一个春松客服登陆用户,具体有什么资源的访问,看到哪些数据,是通过其所在的组织机构及其下属组织机构,和该登陆用户的角色授予情况来判断的,因为一个资源,即有资源名称,又属于一个组织机构。

创建账号

参考账号管理创建账号后,将账号添加到组织机构和角色

下一步

坐席工作台的使用注意事项

创建网页聊天控件

配置机器人客服

春松客服系统维护:升级、备份、回退等

常见问题

#463

https://github.com/chatopera/cskefu/issues/463

问题:客户端点开客服每次都进入的排队 ,发现只有刷新后台的页面才会正常接入客服


解决:进入【系统设置-网页渠道-接入】,在【客服信息】中绑定单一技能组。

#378

https://github.com/chatopera/cskefu/issues/378

问题:访客打开网页聊天控件,提示等待


解决:没有坐席在线,需要按照上述建立有效的坐席人员,并有坐席人员登陆。春松客服部署好以后,默认只有`超级管理员`,这时直接建立网页渠道访问,超级管理员在线,就会出现提示等待。
- + \ No newline at end of file diff --git a/docs/v7/monitoring/index.html b/docs/v7/monitoring/index.html index 39f0d652..51e8331f 100644 --- a/docs/v7/monitoring/index.html +++ b/docs/v7/monitoring/index.html @@ -4,13 +4,13 @@ 坐席监控 | 春松客服 - +
版本:v7

坐席监控

查看历史会话

左侧菜单 -> 会话历史 -> 历史会话

查看历史会话

查看当前会话

左侧菜单 -> 会话历史 -> 当前会话

查看排队队列

左侧菜单 -> 会话历史 -> 排队队列

查看访客留言

左侧菜单 -> 会话历史 -> 访客留言

查看满意度统计

左侧菜单 -> 统计功能 -> 满意度统计

查看满意度

查看全部坐席

左侧菜单 -> 会话历史 -> 坐席信息 -> 全部坐席

坐席监控

左侧菜单 -> 坐席监控

查看坐席监控

- + \ No newline at end of file diff --git a/docs/v7/osc/contribution/index.html b/docs/v7/osc/contribution/index.html index d932bee2..01246a0f 100644 --- a/docs/v7/osc/contribution/index.html +++ b/docs/v7/osc/contribution/index.html @@ -4,13 +4,13 @@ 提交代码 | 春松客服 - +
版本:v7

提交代码

春松客服一直会坚持 Apache 2.0 许可证,在保持开放的情况下,团结起来,一起做好开源客服系统,既然大家都在用春松客服,合作才会成为大赢家。

提交代码,就是变更春松客服项目库中的内容,比如增加文档、变更代码、配置等。给春松客服提交代码是成为一个春松客服开发者的标志。相对于其它类型的贡献,提交代码需要更多的努力,因此,给春松客服提交代码,也是开源合作共赢精神的证明。

成为春松客服开发者

春松客服有很多用户,企业或独立开发者在使用春松客服,作为要不断优化的企业软件,春松客服得到很多的反馈建议,包括 BUG、需求、文档等。作为开源软件,可作为贡献者工作的也主要是三项:发现问题、分析问题和解决问题。现在,春松客服开源社区运作不平衡,很多人发现问题,少部分的人分析问题,解决问题的主要还是发布者。但是从另外一方面,也有一些春松客服用户在做变更,比如 dph5199278/wit@621c949

如果大家做的变更公开了,但是却没有提交到春松客服 OSC 分支(春松客服源码的主分支),可能是缺少一份说明文档。这是本文档的作用:详细的说明如何提交代码到春松客服。

我们诚挚的邀请春松客服用户提交 PR,成为春松客服的开发者:春松客服属于贡献者。

以下内容为具体介绍,建议先全文读一遍再进行实践。

提交代码的过程,可以简述为:1)确定工作内容;2)搭建开发环境;3)完成开发和测试;4)推送代码;5)提交 PR 到春松客服。在合并到春松客服 OSC 分支前,可能还会根据 Code Review 进行沟通和优化。

确定工作的内容

工作的内容记录在春松客服的工单(Issue)中,可以创建根据您自己的需要创建工单,或者选择一个已有的工单。

在工单中,对工作进行准确和清晰的定义,讨论,设计是非常有必要的,这个过程可以体现工作成熟度。

高手解决问题,在大脑中完成,动手实现只是完成确定无疑的事情。聪明的人,不断的完善头脑中创造的能力。“少用脑,多用手”会一直停留在菜鸟的阶段。

搭建开发环境

开发环境搭建,包括下载源码、安装 IDE、启动数据库和配置项目等。

详细内容,参考文档开发环境搭建

完成开发和测试

在对工单进行思考后,开始着手实现,下面探讨两项相关内容。

Git 使用概述

Git 用于版本管理,使用 Git 时,一个文件有三个可能存在的地方:indexed(索引区),staged(暂存区) 和 workarea(工作区)。indexed 文件就是被索引了(提交了);staged 就是被临时的保存了(暂未提交,保护一下);workarea,在编辑器中打开的这份。

Git 使用概述

上图中 master 所在区就是 indexed。

Git 的版本管理,就是指这三个层面同一个文件的差异。

Git add: 从 workarea 添加到 staged

Git commit: 从 staged 到 indexed

当然还有不同的方向,这构成了 git checkout, git stash, git restore, git reset, git clean 等命令。

当本地的 Git 库和它的远程的 Git 库同步时,就涉及使用 git push 和 git pull。

以上是对 Git 的简要介绍,快速入门 Git,首先熟悉它的远离,比如以上;其次,做一些练习,比如使用 practice-git

即便还没有理解,也可以按照下面的命令完成代码提交。

管理工作区

首先,创建本次工作的分支,创建分支是非常有必要的。保持工作区的清爽,方便多人协作。

cd cskefu.osc  # 在第2步,搭建开发环境中,有描述,克隆代码后,得到该路径
git checkout -b ${名称}
# 比如,git checkout -b issue7

然后,开始修改代码,进行测试。

成为一个优秀的开发者

要从工作中获得更多快乐,同时也为了不断涨薪,就需要不断的前进,依赖于:1)心态;2)技能。

关于心态

这是一个比提升技能更需要时间和重视的部分,一个好的开发者的心态,可以和一个觉悟者相提并论了,那些个看不到、摸不着的字节,完成你的复杂的逻辑,需要你保持稳定和理性的状态。

这方面有很多好的读物,比如《程序员修炼之道:从小工到专家》《冥想》《程序员的自我修养——链接、装载与库》。这几本书,值得常看,常看可以常新。尤其是《冥想》,每天早晚各十分钟冥想,坚持 90 天,保证你成为程序员中的大师!

关于技能

春松客服社区发布了《春松客服大讲堂》,快速的入门以及熟悉开发技能。

在《春松客服大讲堂》中,有很多知识内容,而单元测试、AOP 变成、自动化测试等也涉及,内容丰富。

推送代码

通过测试后,进行代码推送。推送代码,一方面是为了备份,一方面是为了协作。

cd cskefu.osc
git add --all # 添加全部的变更
# 也可以使用 git add ${文件路径} 来指定


git commit -m "#7 foo bar, some description" # 在 Commit Message 中添加 #ISSUE_NUMBER 是一个好习惯,可以 Git log 日志整洁,易于维护
git push origin ${YOUR_BRANCH_NAME} # ${YOUR_BRANCH_NAME} 就是分支名称
# 比如 git push origin issue7

执行过程中,交互类似:

推送代码

在 git push 命令,执行后,也可以看到,git 提示您,可以提交一个 PR(Pull Request):

remote: Resolving deltas: 100% (1/1), completed with 1 local object.
remote:
remote: Create a pull request for 'issue7' on GitHub by visiting:
remote: https://github.com/hailiang-wang/cskefu/pull/new/issue7
remote:
To github.com:hailiang-wang/cskefu.git
* [new branch] issue7 -> issue7

这里的日志说的 remote, 就是指您远程的 GitHub 仓库,这里我的仓库地址是:

https://github.com/hailiang-wang/cskefu

提交 PR 到春松客服

上一步,已经提示,推送代码到 remote,可以打开提示 URL 地址,比如

https://github.com/hailiang-wang/cskefu/pull/new/issue7

进行 PR 提交,PR 提交是指将您的变更通知春松客服开源仓库,仓库的维护人员,可以查看、评价和合并您的变更。

在浏览器中,打开 https://github.com/hailiang-wang/cskefu/pull/new/issue7 ,得到如下页面:

创建 PR

在该页面,确认希望提交的代码分支是正确的,合并的方向是从【源库:branch】到【目标库:branch】。然后,对变更添加标题和描述正文。

在春松客服中,使用了模板,根据模板进行填写。在模板中,添加工单的 Issue Number, 比如使用 #7

进行这些步骤,点击【Create pull request】。

本步骤完成,提交 PR 的工作就完成了,春松客服开源社区的其它贡献者会尽快的处理,完成交流和合并工作。

恭喜您

发布代码到春松客服是值得骄傲的事情,您的变更在合并的路上!

PR 被 Merge 后

PR 被合并后,是指代码进入到了春松客服的OSC 分支,一个被 Merge 的 PR 状态显示为【Merged】,比如 PR 666

同步代码

现在,Upstream 已经有了最新的代码,但是您的远程仓库还没有最新的代码,也就是您的 OSC 分支还没有更新,此时需要做下面的操作。

在本地 Git 库同步 Upstream

cd cskefu.osc
git checkout osc # 如果此时在 local 有变更,不是 clean 的状态,使用 git stash 缓存,或使用 git clean -f . 放弃
git pull upstream osc
git push origin osc # 推送到您的远程 Git 仓库

在本地删除临时的 Branch

假如现在工单的工作已经完成,那么可以删除本地的临时的分支。

git branch -d issue7

自豪的

春松客服是最流行的开源客服系统,现在已经在企业部署超过 17,000 次,为数百政府机构、事业单位和企业上线智能客服系统,现在您是春松客服的开发者一员了!

春松客服会尽快的将您添加到贡献者列表!

- + \ No newline at end of file diff --git a/docs/v7/osc/engineering/index.html b/docs/v7/osc/engineering/index.html index d0e741ff..a76c0704 100644 --- a/docs/v7/osc/engineering/index.html +++ b/docs/v7/osc/engineering/index.html @@ -4,14 +4,14 @@ 开发环境搭建 | 春松客服 - +
版本:v7

开发环境搭建

本文介绍如何完成春松客服开发环境的搭建,面向企业/开发者提供关于春松客服二次开发的相关知识,从入门到掌握全部开发技能请学习《春松客服大讲堂》

本文档针对春松客服 v7 版本,该版本对应的代码参考链接

依赖

开发环境依赖,提前准备好:

以上安装,也涉及环境变量 PATH 配置,比如 java, mvngit 等在命令行终端中可以使用,在不同的依赖安装文档中也有。 在 Windows 上,命令行终端使用 Git Bash,安装 Git 时会默认包括。

提示:

  1. Docker 或 Docker compose 可以安装到 Linux/Windows/Mac 上,Docker 在开发阶段用来启动数据库、中间件。

安装 Java SDK

春松客服使用Amazon Corretto SDK 11,原因:

  • 兼容 OpenJDK 标准
  • 良好的开源社区,可长期商业友好的使用,Amazon 发布,James Gosling 领导
  • 适应不同操作系统

春松客服不使用其它版本的 JDK,如有其它 JDK 诉求自行测试:理论上,所有 OpenJDK 11 的 JVM 都是可以运行春松客服的。

配置 Maven

确保在 pom.xml 中存在如下的 maven 库,Chatopera Nexus是代理 Maven Central,Alibaba Maven Repo 等节点的混合 Maven Repository,使用 Chatopera Nexus 不会影响项目使用其它公共包(Artifacts)。

<repositories><repository>内存在:

    <repositories>
<repository>
<id>chatopera</id>
<name>Chatopera Inc.</name>
<url>https://nexus.chatopera.com/repository/maven-public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>

配置文件的示例见 pom.xml

如配置后不能下载,请参考配置文件

克隆项目

准备 GitHub 账号

注册地址,该注册依赖于邮箱。注册完成后,进行登录。

添加 SSH Key:

  • 在 Terminal 命令行终端(Git Bash, Windows)执行命令 ssh-keygen,得到文件 ~/.ssh/id_rsa.pub 并复制其文本内容到粘贴板。

  • 打开 SSH Keys 管理地址,点击【New SSH Key】,使用粘贴板内容创建一个 SSH KEY。

Fork 源码

在浏览器中,打开春松客服项目地址,在右上角,找到【Fork】按钮,点击【Fork】,根据提示选择空间,该项目源码将被复制到该空间。

Fork 源码

克隆后,新的项目地址类似如下:

https://github.com/${YOUR_SPACE}/cskefu  # ${YOUR_SPACE} 代表您的空间名称

下载源码

克隆项目,就是将上面新建的项目的源码,下载到计算机,使用命令行终端执行:

git clone https://github.com/${YOUR_SPACE}/cskefu.git cskefu
# 默认为 develop 分支, develop 分支为当前发行版本的维护分支;master 分支为发行版本的稳定分支;next 为下一个版本的研发分支
# 以下,使用 cskefu 代表源码所在路径

添加 Upstream

Upstream 指春松客服 GitHub Repo(https://github.com/cskefu/cskefu),就是春松客服的项目库核心分支。添加 Upstream 的目的,是之后从春松客服项目拉取更新代码。

cd cskefu
git remote add upstream git@github.com:cskefu/cskefu.git

完成以上步骤,克隆项目完毕。也请给春松客服点赞,使用【Fork】旁边的【Star】按钮。

![给春松客服点赞](../images/products/cosin/g4.jpg]

文件目录介绍

文件目录介绍

目录说明
_m2用于 Dockerfile 中,构建镜像
admin各种脚本
app源代码
config数据库文件
data数据库数据
logs日志

春松客服是基于 Java 开发到,使用 Maven 维护项目声明周期。使用 Maven 命令,生成项目,方便导入到 IDE 中。

配置启动参数

春松客服是基于 Spring Boot Release 1.5.22.RELEASE 开发,配置文件是

cskefu/contact-center/app/src/main/resources/application.properties

数据库(后文介绍搭建数据库)连接等其他信息,参考该文件。使用自定义值覆盖默认值,有以下两个方式:

1)使用 application-dev.properties;

2)使用环境变量。

使用 Profile 文件

使用 application-dev.properties 覆盖默认配置。

  • 设置环境变量
SPRING_PROFILES_ACTIVE=dev
  • 创建 application-dev.properties
touch contact-center/app/src/main/resources/application-dev.properties

内容如下:

# MySQL
spring.datasource.url=jdbc:mysql://192.168.2.217:7111/cosinee?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123456

# Redis服务器连接端口
spring.redis.host=localhost
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=

# ActiveMQ
spring.activemq.broker-url=tcp://192.168.2.217:9007
spring.activemq.user=admin
spring.activemq.password=123456

# Elasticsearch
spring.data.elasticsearch.cluster-nodes=192.168.2.217:7201

此处可以覆盖 application.properties 中的任何值。

环境变量

application.properties 中的每一项都可以用环境变量配置,通过环境变量方式映射配置信息,实现覆盖 application.properties 中等配置,其映射方式为 propery 的键转为大写同时.-转为_。部分环境变量:

SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/contactcenter?useUnicode=true&characterEncoding=UTF-8
SPRING_DATASOURCE_USERNAME=root
SPRING_DATASOURCE_PASSWORD=123456

比如,SPRING_DATASOURCE_URL 就是对应了 properties 文件中的 spring.datasource.url。同时,环境变量的值优先级高于 properties 文件。

提示:在生产环境部署,建议使用环境变量方式配置。

春松客服 Docker 容器的配置,使用了环境变量的方式,参考文件docker-compose.yml

数据库搭建

在源码中,默认使用 docker-compose 启动服务的描述文件 docker-compose.yml,用于快速准备开发环境。

为了减少开发环境搭建可能遇到的问题,使用 docker-compose.yml 中的 docker 镜像启动以下服务,尤其是春松客服对于一些软件的版本有要求,我们强烈建议开发者在入门春松客服开发的阶段,安装 docker 和 docker-compose,并按照下面的步骤配置开发环境。

这几个数据库,可以用一行命令启动:

cd cskefu
docker-compose up -d mysql elasticsearch activemq redis

另外,以下几个数据库服务可以运行在不同的计算机,以节省开发机器的资源;如果使用了不同的计算机运行。以下也给出如何逐个启动,如何修改配置文件。

Elasticsearch

春松客服依赖 Elasticsearch 服务,用下面的方式创建。

cd cskefu
docker-compose up -d elasticsearch

Elasticsearch 的配置项在 application.properties 是

spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300

将 cluster-nodes 配置为开发服务地址,默认为"YOUR_IP:9300"。

Elasticsearch 的数据浏览和管理,使用 elasticsearch-head

ActiveMQ

春松客服依赖 ActiveMQ 服务,如果没有 ActiveMQ 服务,可以用下面的方式创建。

cd cskefu
docker-compose up -d activemq

ActiveMQ 的配置项在 application.properties 是

spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.user=admin
spring.activemq.password=admin
spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=50

将以上值修改为 ActiveMQ 的实际地址和密码。

ActiveMQ 管理工具,使用浏览器打开,http://YOUR_ACTIVEMQ_IP:PORT。PORT 默认是 8051,即环境变量 ACTIVEMQ_PORT1

ActiveMQ 管理工具

点击【Manage ActiveMQ broker】,用户名 admin, 密码 admin。

MySQL

春松客服依赖 MySQL 服务,如果没有 MySQL 服务,可以用下面的方式创建。

cd cskefu
docker-compose up -d mysql

MySQL 容器启动后,还需要创建春松客服数据库,该过程是在数据库上执行 SQL 文件(contact-center/config/sql/cosinee-MySQL-slim.sql)完成的。

连接 MySQL 服务

安装 DBMS 管理工具 MySQL Workbench,下载地址:

https://dev.mysql.com/downloads/workbench/

MySQL Workbench 下载

在 Windows 上,MySQL Workbench 依赖 Visual C++ Redistributable,需要提前安装。

使用docker-compose启动的 MySQL 服务,其连接认证信息如下:

IP用户名密码端口
localhostroot1234568037

MySQL Workbench 安装

MySQL 数据字典

在线浏览数据字典

春松客服数据字典

SQL 快速入门

参考《春松客服大讲堂》之春松客服开发基础知识 SQL 快速入门

Redis

春松客服依赖 Redis 服务,如果没有 Redis 服务,可以用下面的方式创建。

docker-compose up -d redis

Redis 启动后就可以,不需要其他操作。

Redis 管理工具,推荐 AnotherRedisDesktopManager for Windows, medis for macOS

安装春松客服插件

春松客服的一些定制化需求是通过插件的形式发布的,插件让非通用需求和定制化开发的功能的源码与基础代码分离。一些插件是付费的,一些插件是免费的,比如机器人客服插件就是免费开源的。

插件的安装和源码参考:https://github.com/cskefu/cskefu/tree/osc/public/plugins

配置 IDE

春松客服开发支持的 IDE,包括所有的支持 Spring Boot 的 IDE,以下仅提供部分工具的文档。

配置完成后,需要继续完成以下内容。

初始化系统

启动调试服务,如果要定制化客服接待访客的代码,需要按照系统初始化文档做更多配置。

春松客服代码规范

为提升合作和可维护性,共同做好开源客服系统,修改春松客服代码,需要符合一定规范,这是对春松客服开源社区开发者的一致要求。

配置好开发环境后,阅读《春松客服代码规范》

模拟访客端测试

介绍如何测试网页端访客程序,假设服务是自动在本地 http://localhost:8035 端口。

创建网站渠道

http://localhost:8035/
用户名:admin
密码:admin1234

保证有下面的一条网站渠道:

网站渠道

注意:网站地址为 localhost

设计网页端样式

在网站列表中,从右侧操作中点击“设计”。

设计网页

按照需求配置各种属性。

配置

访问测试程序

浏览器打开

http://localhost:8035/testclient.html

测试

网站留言

如果当前系统中没有"在线"并且"就绪"的客服人员,则进入留言。

嵌入代码到网站中

在目标接入访客聊天控件的网站中,网页 HTML 的 header 中加入一行代码,就可以访问了,代码:

<script defer="true" src="http://春松客服地址[:端口]/im/网站渠道标识.html"></script>

注意:如果使用 80 或 443 端口,可省略端口;请将网页放在 HTTP 服务器上,如果从浏览器中以本地文件打开因为安全限制会无法加载聊天控件。

HTML 示例:

<!DOCTYPE html>
<html lang="zh">

<head>
<!-- META -->
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script defer="true" src="http://cc.chatopera.com/im/104eac.html"></script>
</head>
<body>
春松客服演示客户端

</body>
</html>

接下来

- + \ No newline at end of file diff --git a/docs/v7/osc/ide_eclipse/index.html b/docs/v7/osc/ide_eclipse/index.html index df9c0099..ba3a07a5 100644 --- a/docs/v7/osc/ide_eclipse/index.html +++ b/docs/v7/osc/ide_eclipse/index.html @@ -4,7 +4,7 @@ IDE 使用之 Eclipse IDE | 春松客服 - + @@ -12,7 +12,7 @@
版本:v7

IDE 使用之 Eclipse IDE

<< 回到上一步:开发环境搭建

安装和下载 Eclipse

下载安装包

安装 Eclipse:https://www.eclipse.org/downloads/ 本文下载时,版本为:Eclipse IDE 2021‑09

下载 Eclipse

下载过程大约需要 10 mins。

安装 Eclipse

双击安装包,按照提示进行安装。

安装 Eclipse

安装 STS

STS 最简单的安装方式,就是启动 Eclipse 后,在 Eclipse Marketplace 中安装。

打开 Marketplace。

Marketplace。

搜索,Spring Tool Suite。

Spring Tool Suite

点击【Install】。

Install

至少选择以上几项,在授权声明页面,选择 【I accept】,点击【Finish】。 安装过程可能会持续半个小时,视网络情况。

STS 安装完成,下一步导入项目。

导入项目

初始化 Contact Center 项目描述文件

春松客服提供初始化脚本,在命令行执行:

cd cskefu.osc/contact-center
./admin/gen-eclipse.sh

完成后有如下提示:

导入项目

该命令生成了被 Eclipse 识别的项目导入文件。

导入到 Eclipse

打开 Eclipse,选择 File - Import, 导航到 cskefu.osc/contact-center/app,点击 【Select Folder】。

导入到 Eclipse

在提示界面,选择 Projects: contact-center.

选择项目

导入完成。

导入完成

启动和调试

设置 JDK 为 Corretto 8 或 11

在上一篇《开发环境搭建》文档中,介绍安装 Corretto 8 或 11,此时,需要将该 JDK 设置为 Eclipse 中 contact-center 项目依赖的 JDK,方法如下:

首先,在左侧 contact-center 右键,选择 Build path, configure Build Path ...

设置 Build path

然后,选择 Add Library, JRE System Library。

Add Library

然后,添加 JDK 8 路径。

设置路径

点击 【Finish】。确认依赖 JDK。

添加完成,回到 Java Build Path 配置页面,确认 Libraries 中,依赖了 Corretto JDK。

确认 SDK

修改配置文件

在目录中添加 application-dev.properties 文件

具体操作,复制 contact-center/src/main/resources/application.properties 为 /contact-center/src/main/resources/application-dev.properties。

根据数据库信息,或其它信息进行必要的更改。

参考上一篇《开发环境搭建》里的内容。

创建项目 debug 调试

点击 Debug 启动按钮下拉中的 Debug Configurations, 在左侧找到 Spring Boot App,右键,选择新建配置。

启动 Debug

在配置页面,填写应用名称:contact-center - Application,project 选择 contact-center, Main Type 选择 com.chatopera.cc.Application。

然后点击 Environment,点击 Add 添加:Name - SPRING_PROFILES_ACTIVE, Value - dev,字符串无空格。

设置环境变量

点击【Apply】。然后点击【Debug】。

此时,滚动出大量的日志。

查看日志

调试项目

在项目提示: c.c.socketio.SocketIOServer - SocketIO server started at port,代表项目启动成功。

断点调试的基本知识

第一步: 设置断点:在该行最前面边框双击 或快捷键:Ctrl + Shift + B

第二步: Debug 运行启动

第三部: 运行到断点后,使用快捷键F5,F6,F7单步执行。

  • F5 - Step into/跳入方法/进入该行的函数内部;
  • F6 - Step over/向下逐行调试/一行一行执行;
  • F7 - Step return/跳出方法/退出当前的函数;
  • F8 - 直接跳转到下一个断点。

更多相关内容参考网络文章

Trouble Shooting

报错:com.sun.net.ssl.internal.ssl.Provider

日志

解决办法:

日志

  • 修改 Project JRE 为前面安装的 Java8 JRE

修正中文显示

解决办法详细介绍

显示中文

下一步

回到上一步:开发环境搭建完成后续步骤。

- + \ No newline at end of file diff --git a/docs/v7/osc/ide_intelij_idea/index.html b/docs/v7/osc/ide_intelij_idea/index.html index 677f8b77..3cd7afc5 100644 --- a/docs/v7/osc/ide_intelij_idea/index.html +++ b/docs/v7/osc/ide_intelij_idea/index.html @@ -4,13 +4,13 @@ IDE 使用之 IntelliJ IDEA | 春松客服 - +
版本:v7

IDE 使用之 IntelliJ IDEA

<< 回到上一步

春松客服团队使用 IntelliJ IDEA 作为集成开发环境,它因为更加智能而大幅提升了开发者的工作效率,我们也强烈推荐 Java 开发者使用这个工具。本文使用IntelliJ IDEA介绍搭建过程。

生成项目描述文件

在命令行终端,执行:

cd cskefu.osc
cd contact-center
./admin/gen-idea.sh

按照 IDEA 提示,导入 contact-center/app 目录。

配置执行及调试

配置运行方式为 Spring,应用为 com.chatopera.cc.app.Application

设置 Main Class

配置环境变量

设置环境变量

运行及调试

运行及调试

点击"执行"或"调试",服务启动,然后访问 http://localhost:8035 确定服务正常运行了。

登录

用户名:admin 密码:admin1234

热更新

在开发过程中,修改了代码,更新正在以 “调试” 模式运行服务,点击"执行旁边的锤子"。

构建

更新成功后,提示

断点

另外, “调试” 模式下,也支持断点调试。

下一步

回到开发环境搭建完成后续步骤。

- + \ No newline at end of file diff --git a/docs/v7/osc/index.html b/docs/v7/osc/index.html index 7dde611a..05bfe86b 100644 --- a/docs/v7/osc/index.html +++ b/docs/v7/osc/index.html @@ -4,13 +4,13 @@ 开源社区 | 春松客服 - +
版本:v7

开源社区

GitHub Stargazers GitHub Forks License GitHub Issues GitHub Issues Closed Docker Tags Docker Pulls Docker Stars

开源许可协议

春松客服采用 Apache 2.0 开源许可协议,详细了解该协议内容:

开源许可协议

加入春松客服开源社区

如何加入春松客服开源社区,参考文档

源码仓库

开源项目地址:

Github | Gitee | CodeChina

以上不同地址的代码同步,在上面的地址,您可以:

  • 下载项目开源码
  • 通过 README.md 了解更多项目信息
  • 通过 Wiki 获得开发文档
  • 通过 Issue 提问
  • 通过 Pullrequest 贡献代码
  • 通过 Issue 了解开发状态

在项目地址中,有详细的入门说明,如果使用遇到问题,第一时间阅读文档,第二时间搜索历史 Issues,如果无法解决,加入社区提问。

邮件列表

春松客服邮件列表通过邮件服务沟通,跟踪最新的开发动态:

https://lists.cskefu.com/cgi-bin/mailman/listinfo/dev

博客专栏

《春松客服专栏》火热 🔥 更新中,订阅关注,及时获得最新的信息。

春松客服拥抱开源

为春松客服点赞

您的关注、鼓励是开源项目的工作动力之一,请给春松客服点赞 👍!

点赞春松客服

- + \ No newline at end of file diff --git a/docs/v7/osc/license/index.html b/docs/v7/osc/license/index.html index 919a36bb..7a61704a 100644 --- a/docs/v7/osc/license/index.html +++ b/docs/v7/osc/license/index.html @@ -4,7 +4,7 @@ 开源许可协议 | 春松客服 - + @@ -12,7 +12,7 @@
版本:v7

开源许可协议

春松客服开源以来,完成了超过 17,000 次官网 Docker 镜像部署,超过 1,000 家企业使用,得到社会各界关注。我们收到来自于开发者、企业、IT 集成商、其他开源社区的对春松客服的发展情况、开源社区治理的数千次咨询,尤其是有意于使用春松客服上线客服系统的企业或开发者。

很多人惊叹于春松客服的功能、代码质量和文档,在认可春松客服之后,大家关心最多的就是:春松客服的开源许可协议。因为站在用户角度,开源协议明确回答了:

  • 作为春松客服使用者,我得到代码和软件安装包后,我有哪些权力;
  • 作为春松客服使用者,我成为贡献者、开发者有哪些好处;
  • 作为春松客服发布者和维护者的你们,对我有什么要求。

开源软件(OpenSource Software)是伴随着自由软件(Free Software)商业化过程中出现的术语。没有开源软件就没有今天数字化生活,互联网时代。开源许可协议就是围绕软件制作、软件销售、软件产权的契约。 这个契约有关各方的权力、义务和回报。 这个契约因为有法律约束力,它将软件发布者、软件维护者、软件用户、软件销售者凝聚在一起,促进这个集体的合作,创造价值。 了解这个契约,就会认识开源的魅力;认识了开源的魅力,就会认可开源的精神;认可开源的精神,就会受到鼓舞,参与开源社区的建设;参与开源社区的建设,就会带来精神和物质的回报;有了丰富的精神和物质生活,就是我们实现了开源的初心:自由的人做自由的软件。虽然我们会谈到钱,但自由的价值是无法衡量的。所以,作为开源客服系统春松客服的发布者,我期待下载春松客服的源码的人,可以读到这篇文章: 让我们共同的遵守这个契约,一起做好开源客服系统

春松客服使用的开源许可协议是 Apache 2.0,该协议文件在春松客服源码文件的头部和代码库的 LICENSE 文件中,都有携带,受限于以上形式的篇幅,不能详细描述,本文将对内容进行展开,用更简单的语言,口语化的描述。

春松客服采用的开源许可协议详细阐述分为五个部分:

  • 称呼定义
  • 用户必须遵守什么
  • 用户可以做什么
  • 用户如果想提交代码
  • 对违反协议的用户

一、称呼定义

以下“用户”、“您”泛指所有和春松客服有关联的人或组织,包括但不限于:源码或安装包的使用者、开发者、维护者、报告(缺陷、性能、瓶颈、文档、需求、建议、测试)者、发布者、集成商、继承春松客服衍生的企业软件的开发者。开发者指独立的人、企业、机构等。

以下“我”、“开发者”泛指所有提交源代码到春松客服软件库的人或组织。

二、用户必须遵守什么

2.1 保留春松客服的开源许可协议声明

在您使用春松客服的源码、软件及衍生作品时,必须保留春松客服的声明。

  • 2.1.2 在源文件的头部

服务端声明示例:

客户端声明示例:

  • 2.1.3 在引用春松客服时进行说明

您可以引用“春松客服”及其 LOGO 以表述春松客服和春松客服开源社区,当您使用春松客服及其安装包,对外提供基于春松客服和其衍生作品时,必须声明春松客服及其官网地址:https://www.cskefu.com 或 官网源代码仓库 https://github.com/chatopera/cskefu

2.2 不许使用春松客服作为您的产品的商标

作为用户,不允许您使用“春松客服”及春松客服 LOGO 作为您的商品名、商标、服务标志或产品名。

三、用户可以做什么

在遵守前述条件情况下,您享有下面的权力。

3.1 享受自有的版权

作为用户,您可以免费复制、使用、修改、再许可、分发本作品及衍生作品,该作品的源代码可以不公开。

3.2 享受自有的专利

作为用户,我在此授予您专利许可:即使您的专利涉及我的专利、我的潜在专利,您也可以永久性地免费使用您的专利,用于制作、使用、出售、转让春松客服相关的作品,包括衍生于春松客服的作品;但是,如果您利用您的专利告春松客服侵犯了您的权益,那么您的专利许可,在您告我那天,我授予您的专利许可被我收回,您的专利将不具备法律基础。

3.3 销售

作为用户,您可以销售春松客服、您修改后的春松客服、或其它衍生于春松客服的作品。

四、用户如果想提交代码

4.1 参与贡献

作为用户,您可以提交代码到春松客服源码库,成为春松客服开发者。

  • 4.1.1 改动文件

作为春松客服开发者,在您的改动文件中,应带有您的修改的声明;或者不声明,默认就是春松客服采用的 Apache 2.0 协议。

改动的声明,比如在文件最开头,添加 Modifications copyright:

/*
* Copyright (C) 2018-2022 Chatopera Inc, <https://www.chatopera.com>
* Modifications copyright (C) {YEAR} {YOUR NAME}
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
  • 4.1.2 新增文件

作为春松客服开发者,在您新增的文件中,应带有您的声明;如果不声明,默认就是春松客服采用的 Apache 2.0 协议。

4.2 免责

作为用户,您使用、销售春松客服过程中,遇到任何的麻烦,不要认为春松客服的发布者、维护者应承担法律责任。任何春松客服开发者提交到开源社区的代码,都是出于优化增强软件的目的,但是不保证没有 BUG、缺陷、瓶颈等,我们不对春松客服给您造成的任何经济损失承担责任。除非您和春松客服的开发者、维护者另外签订了协议,那么该开发者、维护者将承担潜在的责任和法律风险。

五、对违反协议的用户

春松客服采用的开源许可协议是开放、商业友好、宽松的,充分的表达了我们的心声:合作共赢。但是如果,如果我们发现使用春松客服源码的人,有违反春松客服采用的开源许可协议,我们将:

  • 诉诸法律 - 您需要承担法律责任,并承担一切诉讼费用、我方经济损失和您的违法所得

  • 诉诸媒体 - 将您的行为公布于开源社区,成为不遵守知识产权的案例

同时,在遵守我国法律的前提下,我们不放弃任何可以惩治您的方法:对于那些不遵守我们立的契约而伤害我们权益的人,我们是不宽容的。

引用及参考文献

  1. 逐句深扒 Apache 许可协议原文,一文看懂!

  2. 开源定义是什么?为什么OSI不接受SSPL?

  3. 如何选择开源许可证?

  4. 一文看懂开源许可证,能不能商用再也不抓瞎

  5. 了解开源的许可证GPL、LGPL、BSD、Apache 2.0的区别

  6. 一文看懂开源许可证丨开源知识科普

  7. 详细介绍 Apache Licence 2.0 协议

  8. 开源许可违反:案例说明(Apache License 2.0)

  9. Open Source Licenses 101: Apache License 2.0

附件

Apache 2.0 中文协议(法律声明)

Apache License, Version 2.0 的官方文本地址:https://www.apache.org/licenses/LICENSE-2.0.html

以下内容为 Apache 2.0 协议条款的中文翻译版。

Apache License 2.0 版,2004 年 1 月 http://www.apache.org/licenses/

使用,复制和分发的条款和条件

定义

“许可”是指本文档第 1 至 9 节定义的使用,复制和分发的条款和条件。

“许可人”是指版权所有者或授予许可的版权所有者授权的实体。

“法律实体”是指行为实体与控制该实体,由该实体控制或受其共同控制的所有其他实体的联合。就本定义而言,“控制”是指(i)不论是通过 Contract 还是其他方式直接或间接引起该实体的指示或 Management 的权力,或(ii)百分之五十(50%)的所有权或更多的已发行股票,或(iii)该实体的实益拥有权。

“您”(或“您的”)是指行使本许可授予的许可的个人或法人实体。

“源”形式是指进行修改的首选形式,包括但不限于软件源代码,文档源和配置文件。

“对象”形式是指源形式的机械转换或翻译产生的任何形式,包括但不限于已编译的目标代码,生成的文档以及对其他媒体类型的转换。

“作品”是指根据许可获得的著作权作品,无论是源形式还是对象形式,均应包含在该作品中或随附于其上的版权声明所指示(以下附录中提供了一个示例)。

“衍生作品”是指基于(或衍生自)该作品的任何作品(无论是源形式还是对象形式),并且其编辑修订,注解,细化或其他修改从整体上代表原始作品的作者身份。就本许可而言,衍生作品不应包括与该作品及其衍生作品保持分离或仅链接(或按名称绑定)的作品。

“贡献”是指版权拥有者,个人或个人有意向许可人提交以包括在作品中的任何创作作品,包括作品的原始版本以及对该作品或其衍生作品的任何修改或增补。授权代表版权所有者提交的法人实体。就此定义而言,“已提交”是指发送给许可方或其代表的任何形式的电子,口头或书面通讯,包括但不限于有关电子邮件列表,源代码控制系统和问题跟踪系统的通讯,由许可方或代表许可方 Management,以讨论和改进本作品,但不包括版权拥有者明显标记或以其他方式书面指定为“非贡献”的通信。

“贡献者”是指许可人以及许可人已经代表其收到贡献并随后合并到作品中的任何个人或法人实体。

版权许可的授予

在遵守本许可的条款和条件的前提下,每位贡献者特此向您授予永久性的,Global 性的,非排他性的,免费的,免版税的,不可撤销的版权许可,以复制,准备衍生产品以来源或客体形式对作品及此类衍生作品进行公开展示,公开表演,再许可和分发的作品。

专利许可的授予

在遵守本许可的条款和条件的前提下,每位贡献者特此向您授予永久,Global 性,非排他性,免费,免版税,不可撤销的许可(本节中所述除外) )制作,制作,使用,提供要约,出售,import,以及以其他方式转让作品的专利许可,但该许可仅适用于该贡献者应许可的专利索赔,而这些专利索赔仅因其贡献而受到侵犯或将他们的贡献与提交的作品相结合。如果您针对任何实体(包括诉讼中的交叉索赔或反索赔)提起专利诉讼,指称该作品或该作品中包含的贡献构成直接或共同的专利侵权,则根据本许可授予您的任何专利许可该工作应在提起诉讼之日终止。

再分发

只要您满足以下条件,您可以在任何媒介中以修改或不修改的形式,以源或对象的形式复制和分发作品或衍生作品的副本
  • 您必须向该作品或衍生作品的任何其他接收者提供本许可的副本;和

  • 您必须使所有修改过的文件带有明显的声明,表明您已更改文件;和

  • 您必须以您分发的任何衍生作品的“源”形式保留该作品“源”形式的所有版权,专利,商标和出处声明,但与这些衍生作品的任何部分无关的那些声明除外;和

  • 如果作品包含“注意”文本文件作为其分发的一部分,则您分发的任何衍生作品都必须包括该通知文件中包含的署名声明的可读副本,但不包括与声明的任何部分无关的那些声明。衍生作品,至少应位于以下至少一个位置:在作为衍生作品一部分分发的 NOTICE 文本文件中;在原始表格或文档中(如果与衍生作品一起提供);或在“衍生作品”产生的显示中,通常在任何时候出现此类第三方通知的地方。注意文件的内容仅供参考,请勿修改许可证。您可以在您分发的衍生作品中添加您自己的归属通知,在作品的“通知”文本旁边或作为附录,前提是此类附加归属通知不能被解释为修改许可。

您可以在自己的修改中添加您自己的版权声明,并可以提供其他或不同的许可条款和条件,以使用,复制或分发您的修改,或任何此类衍生作品作为一个整体,前提是您使用,复制和分发了否则,作品应符合本许可中规定的条件

贡献的提交

除非您另有明确说明,否则您主动提交给许可人的包括在作品中的任何贡献均应符合本许可的条款和条件,没有任何其他条款或条件。尽管有上述规定,本文中的任何内容都不能取代或修改您可能与许可方签署的有关此类贡献的任何单独许可协议的条款。

商标

本许可不授予许可使用许可人的商标名称,商标,服务标记或产品名称的权利,除非在描述作品的来源和复制作品的内容时合理合理地使用是必需的 NOTICE 文件。

免责声明

除非适用法律要求或书面同意,否则许可方将按“原样”提供工作(每个贡献者均应提供其贡献),而没有任何形式的保证或条件,无论是明示的还是明示的。隐含(包括但不限于)标题,非侵权,可贸易性或特定目的适用性的任何保证或条件。您应独自负责确定使用或重新分发作品的适当性,并承担与您行使本许可下的许可有关的任何风险。

责任限制

在任何情况下,在任何法律理论上,无论是侵权(包括过失),Contract 还是其他形式,除非适用法律要求(例如故意和严重过失的行为)或书面同意,任何贡献者均应对您承担赔偿责任,包括由于本许可或由于使用或无法使用本作品而引起的任何性质的任何直接,间接,特殊,偶然或后果性损害(包括但不限于商誉损失,停工,计算机故障或故障,或任何及所有其他商业损失或损害赔偿),即使已告知该贡献者此类损失的可能性。

接受保修或其他责任

在重新分发其作品或衍生作品时,您可以选择提供支持,保证,赔偿或其他责任义务和/或与此相一致的权利并收取费用。License。但是,在接受此类义务时,您只能代表您自己并独自承担责任,不能代表任何其他贡献者,并且仅在您同意赔偿,捍卫每个贡献者并使他们不承担任何责任的情况下,或由于您接受任何此类保证或其他责任而针对该贡献者提出的索赔。

条款和条件的结尾

附录:如何将 Apache 许可证应用于您的工作

要将 Apache 许可证应用于您的工作,请附上以下样板声明,并用括号“ []”括起来的字段替换为您自己的标识信息。 (不包括方括号!)文本应包含在文件格式的相应 Comments 语法中。我们还建议在与版权声明相同的“印刷页面”中包含文件或类名以及用途说明,以便在第三方 Files 中更容易识别。

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
- + \ No newline at end of file diff --git a/docs/v7/osc/maintainence/index.html b/docs/v7/osc/maintainence/index.html index 96dc8852..3ac1e2c0 100644 --- a/docs/v7/osc/maintainence/index.html +++ b/docs/v7/osc/maintainence/index.html @@ -4,14 +4,14 @@ 系统维护 | 春松客服 - +
版本:v7

系统维护

以下文档基于《春松客服私有部署》文档部署的案例,进行运维管理。

假设春松客服部署目录为:ROOT_PATH/cskefu.develop。以下脚本假设部署服务器为 Linux 或包含 Bash 环境的 Windows 服务器,使用 Bash Shell 运行脚本。

注意事项及官方声明

!!! 如果您在使用其它部署方案,或者在官方基础上更新过春松客服的源代码,以下文档并不一定适用。

运维需谨慎,尽量了解每个步骤的目的和结果,在操作前,如果使用虚拟化环境,请给服务器做快照!!!

作为一个给开发者社区提供的维护文档,我们的维护指南不承担法律责任,不承担经济责任。如需要专业的商业支持,请联系春松客服官方团队

关于春松客服版本号

ROOT_PATH/cskefu.osc/.env(以下简称 .env) 文件作为配置春松客服版本和环境变量的文件,也记录着 Docker 启动春松客服的版本信息,该文件在部署阶段创建。

CC_IMAGE=chatopera/contact-center:develop

在开源版本中,镜像的名字是 chatopera/contact-center,默认的版本是 develop,所有可选的版本在 GitHub 中可以浏览到:

版本管理

https://github.com/chatopera/cskefu/commits/develop

为了方便管理,春松客服 Git Commit Short ID 也是春松客服 Docker 镜像的 Tag,也常用 Docker 镜像版本号来指代。在 GitHub Commit 历史中,有对号的版本就是完成了对应的 Docker 镜像发布的版本,develop 标签就是已经发布的最近的版本。

比如,在上图中,chatopera/contact-center:develop 就代表 chatopera/contact-center:4b70d05chatopera/contact-center:develop 对应的 Docker 容器会变化,但是用 Commit Short ID 的版本号对应的容器和代码一一对应,是不变的。

在春松客服实例中,也可以得到版本信息。作为春松客服系统用户登录,并在右上角用户名下拉菜单中,打开【关于产品】。

查看版本信息

build 的最后几位字符串就是版本号。

系统备份

设置版本号到配置文件

设置春松客服容器版本到 .env。

cd ROOT_PATH/cskefu.develop
vi .env # 使用文本编辑器编辑

找到修改或添加

CC_IMAGE=chatopera/contact-center:YOUR_VERSION

YOUR_VERSION 替换为春松客服版本号,此处不要使用 develop,而必须是 Git Commit Short ID,原因见上文。

运行脚本

作为备份的文件,是和春松客服 Docker 容器版本绑定的,在完成了以上步骤后,执行下面的脚本。

TIMESTAMP=$(date +%Y%m%d_%H%M)
cd ROOT_PATH/cskefu.develop
docker-compose down # 停止服务
cd ../ # 来到父级目录
tar czfp cskefu.osc.$TIMESTAMP.tgz cskefu.osc # 打包备份

其中,tar 命令执行了将应用文件夹归档为【保留文件访问权限】的压缩包。

系统升级

基于 Docker 容器的系统升级,过程也很简单,因为春松客服发布的版本中,每次重启,都会校验数据库的版本匹配,自动维护数据库的表结构,比如新版本中增加了字段、删除了字段等,都会自动完成。这也是 Chatopera 团队推荐开发者/企业使用春松客服官方镜像的主要原因:部署、运维更简单。

系统备份

春松客服升级为【就地升级/ In Place Upgrade】,首先按照系统备份过程备份,以防升级后遇到问题无法回退。

获取最新的春松客服版本

参考前文【关于春松客服版本号】获得春松客服最新的版本信息,然后执行以下操作。

cd ROOT_PATH/cskefu.develop
docker-compose down # 停止服务
vi .env # 打开配置文件

找到修改或添加

CC_IMAGE=cskefu/contact-center:YOUR_VERSION

YOUR_VERSION 替换为春松客服新的版本号。

cd ROOT_PATH/cskefu.develop
docker-compose up -d # 重启服务,此时,docker 会自动拉取新版本的镜像

回滚到系统备份

假设备份文件压缩包的位置是:/root/cskefu.develop.202107001.tgz

cd ROOT_PATH/cskefu.develop
docker-compose down
cd ..
mv cskefu.develop cskefu.develop.backup # 将当前的文件存放在临时位置(万一还会用到,只是以防有可能用到)
tar xzfp /root/cskefu.develop.202107001.tgz # 备份文件被解压到 ROOT_PATH/cskefu.osc
cd ROOT_PATH/cskefu.develop
docker-compose up -d # 启动服务
docker-compose logs -f contact-center # 查看日志

在春松客服运行后,在浏览器内访问并验证服务正常。升级完毕。 当系统可以稳定运行,比如 2 个月,再酌情删除 cskefu.develop.backup

下一步

- + \ No newline at end of file diff --git a/docs/v7/osc/restapi/index.html b/docs/v7/osc/restapi/index.html index c68af6ea..080349e9 100644 --- a/docs/v7/osc/restapi/index.html +++ b/docs/v7/osc/restapi/index.html @@ -4,13 +4,13 @@ REST APIs | 春松客服 - +
版本:v7

REST APIs

春松客服目前具备 30 余个 RESTful API 接口,包括联系人管理,授权,获得访客会话列表等,方便企业/开发者从不同系统中集成春松客服。

安装 Postman

查看、测试和体验春松客服 API 需要安装 Postman, 并导入春松客服 API Collection 文件。

Postman 支持各种操作系统,免费下载安装包并使用:

https://www.postman.com/

导入 Collection

导入春松客服 API Collection,下载Chatopera_cc_v1.postman_collection.20200312.zip

将 zip 文件解压,得到 Chatopera_cc_v1.postman_collection.json

打开 Postman,执行导入

导入 Postman

每个 API 在 Postman 中都有PathBodyHeaders等的设置,可查看示例和发送请求,对于开发人员来说非常友好。

API 认证

导入 collection 文件后,从左侧找到 Chatopera_cc_v1

找到 Collection

认证接口:

# 获得Token
POST http://IP:PORT/tokens?username=USERNAME&password=PASSWORD
key描述
IP春松客服 IP
PORT春松客服端口
USERNAME用户名
PASSWORD密码

回复结果为一个字符串,即 Auth token。

API 请求

在请求其它 API 时,在 header 中设置authorization为 Auth token 就可以,如下:

发送 API 请求

部分接口:

  • 获得登录用户

  • 联系人笔记:创建/删除/更新

  • 机器人客服:创建/查询

针对每个接口的描述,此处不赘述,请直接用 Postman 查看。

注意事项

  • 每个 token 有效期为 24 小时,认证失败会有相应提醒
  • 登录用户的权限有限制,API 访问受此约束
- + \ No newline at end of file diff --git a/docs/v7/osc/training/index.html b/docs/v7/osc/training/index.html index f44ef579..cddb1a1c 100644 --- a/docs/v7/osc/training/index.html +++ b/docs/v7/osc/training/index.html @@ -4,13 +4,13 @@ 春松客服大讲堂 | 春松客服 - +
版本:v7

春松客服大讲堂

😉 春松客服大讲堂,面向开发者、软件工程师及运维人员的在线课程。

  • 基于春松客服定制客服系统,紧紧围绕春松客服开发技能
  • 由浅入深的介绍春松客服上线智能客服系统、运营客服工作
  • 全面介绍春松客服插件、机器人客服的等原理和使用

春松客服大讲堂 2019

该课程有发布到两个地址:Bilibili 和 腾讯课堂

Bilibili 视频免费观看,腾讯课堂为付费,有条件的观众请在腾讯课堂购买,以视对我们工作的支持和鼓励 💗,做好开源客服系统。

Bilibili 站点地址,PPT 见课件库地址kejian2019

小节时长(时:分:秒)课件
一、春松客服的介绍如何使用Java开发智能客服系统0:32:11PPT
春松客服在企业的落地0:30:41PPT
春松客服的技术介绍1:09:30PPT
二、客服相关的基本知识客服的日常工作0:57:35PPT
客服的基本知识0:46:48PPT
账号体系-权限,部门和角色0:42:06PPT
坐席会话的工具-拉黑,服务小结和转接0:33:00PPT
即时通信及坐席自动分配0:56:50PPT
企业聊天与人工质检0:35:12PPT
统计报表和满意度评价0:37:18PPT
三、春松客服的上线及维护春松客服的编译和部署0:38:27PPT
春松客服的运维管理1:00:37PPT
春松客服的自动化系统测试(1)0:32:45PPT
春松客服的自动化系统测试(2)0:49:20PPT
春松客服的压力测试(1)0:42:33PPT
春松客服的压力测试(2)0:40:39PPT
四、春松客服的机器人客服Chatopera 云服务介绍0:28:01PPT
机器人的知识库管理0:47:56PPT
机器人的多轮对话及富文本消息类型0:43:32PPT
五、春松客服开发基础知识SQL快速入门0:46:39PPT
春松客服数据库表及管理0:45:30PPT
Java编程基础(1)0:45:24PPT
Java编程基础(2)1:37:53PPT
Maven项目管理0:46:18PPT
搭建春松客服开发环境1:10:28PPT
SpringBoot快速入门0:45:50PPT
项目源码讲解1:09:40PPT
六、春松客服的插件插件机制设计0:45:51PPT
春松客服机器人插件解读0:41:20PPT
七、总结春松客服团队介绍及课程总结0:32:11PPT

  1. 春松客服大讲堂地址,https://github.com/chatopera/cskefu.djt
- + \ No newline at end of file diff --git a/docs/v7/reports/index.html b/docs/v7/reports/index.html index 4bd4f069..66b60e01 100644 --- a/docs/v7/reports/index.html +++ b/docs/v7/reports/index.html @@ -4,13 +4,13 @@ 会话历史 | 春松客服 - +
版本:v7

会话历史

会话历史作为客服主管的运营工具,主要展示客服业务的数据和报表,同时也有一些数据是实时的,或通过时间选择器自定义时间段,形成数据分析和汇总。在角色中,可以配置权限,指定登录用户的访问【会话历史】的权限。

历史会话

查看:左侧菜单 → 会话历史 → 历史会话

历史会话

当前会话

查看:左侧菜单 → 会话历史 → 当前会话

当前会话

排队队列

查看:左侧菜单 → 会话历史 → 排队队列

排队队列

访客留言

查看:左侧菜单 → 会话历史 → 访客留言

访客留言

满意度统计

查看:左侧菜单 → 统计功能 → 满意度统计

满意度统计

客服坐席

查看:左侧菜单 → 统计功能 → 客服坐席

客服坐席

服务小结

查看:左侧菜单 → 服务小结 → 多媒体客服

服务小结

已处理服务小结

查看:左侧菜单 → 服务小结 → 已处理多媒体客服

已处理服务小结

满意度评价

查看:左侧菜单 → 满意度评价 → 在线客服

满意度评价

在线坐席

查看:左侧菜单 → 坐席信息 → 在线坐席

在线坐席

全部坐席

查看:左侧菜单 → 坐席信息 → 全部坐席

全部坐席

常见问题

GH-395

问题 历史会话不显示数据

解决方案 需要在网站渠道中启用技能组模式,并绑定单一技能组。

- + \ No newline at end of file diff --git a/docs/v7/sla/index.html b/docs/v7/sla/index.html index 8f47a92d..e02beba3 100644 --- a/docs/v7/sla/index.html +++ b/docs/v7/sla/index.html @@ -4,7 +4,7 @@ 服务水平协议 | 春松客服 - + @@ -13,7 +13,7 @@ 第三方未经批准的使用用户的账户或更改用户的数据; 用户对本公司服务的误解; 任何非因本公司的原因而引起的与本公司服务有关的其它损失。

特别提示:在受限于本协议其他规定的前提下,为更好的提供服务,本公司将定期或不定期的对本公司平台进行功能及(或)页面上的改造及(或)升级。本公司会通过本公司平台或其他有效方式将相关事项及用户注意事项告知用户,经上述告知,本公司不对因用户未能遵守相关注意事项而造成的损失承担任何责任,本公司经改造及(或)升级后,对于用户因操作习惯性而引起的损失,本公司不承担任何责任

受限于本协议其他规定的前提下,因本公司平台中接入的其他方的支付渠道与用户就支付关系发生任何争议的,与本公司无关,本公司不承担任何责任

当出现来自或针对客户网站的互联网攻击行为或者接到政府相关部门的监管要求时,本公司将通知客户立即进行处理,对未按照要求及时处理的,本公司有权采取相应措施,以避免网络或内容安全事件的进一步扩大;当出现紧急网络或内容安全事件(例如内容涉及国家监管部门禁止范围,被国家监管部门如网监勒令封闭 IP 等事件)时,为保护广大用户的合法权益,本公司有权在事先不通知对方的情况下采取相应措施。本公司对上述紧急网络或内容安全事件的处理措施免于承担责

用户接入第三方服务,比如百度统计等,并不是本公司负责安全保护,如果造成用户财产损失,与本公司无关,本公司不承担任何责任

2018 年 10 月 北京华夏春松科技有限公司

- + \ No newline at end of file diff --git a/docs/v7/usage/index.html b/docs/v7/usage/index.html index 820cc689..62a7e9b7 100644 --- a/docs/v7/usage/index.html +++ b/docs/v7/usage/index.html @@ -4,13 +4,13 @@ 访问统计 | 春松客服 - +
版本:v7

访问统计

页面统计是针对坐席控制台的 Web 页面的使用情况进行统计,按照页面打开次数、登录地址和入口页面等内容进行计数。目前只支持接入百度统计,请注册百度统计帐号【百度统计-站长版】使用。

获得百度统计 Key

登录,新增网站,https://tongji.baidu.com/

新增网站

  • 网站域名:春松客服系统域名,必须是你安装的实际地址(假设你安装在 cc.example.com,则填写 cc.example.com)

  • 网站首页:春松客服首页 (https://cc.example.com)

拷贝 YOUR_SITE_KEY: 登录 -> 管理 -> 新增网站 -> 代码获取 -> 拷贝 SiteKey

hm.src = "https://hm.baidu.com/hm.js?YOUR_SITE_KEY";

统计代码获取

得到YOUR_SITE_KEY后继续设置环境变量

设置环境变量

设置环境变量 TONGJI_BAIDU_SITEKEY,可以在 .env 文件或 docker-compose.yml 文件中添加,参考部署文档:

https://docs.chatopera.com/products/cskefu/deploy.html

TONGJI_BAIDU_SITEKEY=YOUR_SITE_KEY

示例

TONGJI_BAIDU_SITEKEY=585cbac007x12es81b517031e9ec29c56e

重启服务

docker-compose restart contact-center

重启完成后,回到百度统计站点,在网站栏内,点击:代码安装检查,代码检查成功表示安装成功;注意网站域名等一致,数据收集有延迟。

报告

进入百度统计主页,选择站点“查看报告”

示例:

示例代码

注意事项

  • 该功能开发者/企业自行设置

  • 开源代码中没有后门、追踪程序、统计等

  • 不设置环境变量不进行统计,该统计报告只开发者/企业在百度网站内能查看

  • 开发者/企业自行衡量和保护百度统计账号,因百度账号泄漏等原因造成企业/开发者财产损失,春松客服不承担任何责任,见服务水平协议

- + \ No newline at end of file diff --git a/docs/v7/work-chatbot/bot-agent/index.html b/docs/v7/work-chatbot/bot-agent/index.html index acaac7d5..74ecb636 100644 --- a/docs/v7/work-chatbot/bot-agent/index.html +++ b/docs/v7/work-chatbot/bot-agent/index.html @@ -4,13 +4,13 @@ 集成机器人客服 | 春松客服 - +
版本:v7

集成机器人客服

创建聊天机器人

首先,创建聊天机器人,登录Chatopera 云服务,注册并在【控制台】中创建聊天机器人。

创建聊天机器人

项目描述
机器人名称小 C机器人的名字,创建后不能变更
描述机器人客服机器人的描述
语言zh_CN机器人的语言为中文

机器人具有多轮对话和知识库两个管理对话能力的组件,在创建好机器人后,创建一个问答对作为测试示例。点击【知识库】图标,点击【新建问题】。

新建问答对

项目描述
问题缴费年期变更后,佣金如何计算?问题的文本
答案变更后仍有佣金的,按照变更后的年期对应的提佣率计算佣金。问题的答案

点击【确定】。

集成机器人的方式是通过 SDK 创建机器人实例,使用机器人接口进行对话和查询等。机器人实例的认证和授权是通过ClientIdSecret完成,点击【设置】查看ClientIdSecret

查看 ClientId 和 Secret

绑定机器人

然后,以管理员身份进入系统设置,在左侧菜单中导航至【智能机器人-新建机器人】,按照如下内容填入创建表单。

项目描述
网站渠道localhost根据网站地址选择网站渠道
ClientIdxxxChatopera 云服务 ClientId
SecretxxxChatopera 云服务 Secret
工作模式机器人客服优先目前支持【机器人客服优先】或【人工客服优先】两种类型
描述机器人客服对机器人的简要介绍

集成机器人客服

点击【保存】创建机器人,返回机器人列表页面,可以找到刚刚创建的机器人客服。

开启机器人客服

测试机器人客服

提示:春松客服访客测试端地址

http[s]://春松客服IP[:PORT]/testclient.html

使用浏览器打开春松客服访客测试端,并点击【在线客服】。在知识库设置好后,当访客在客户端问问题,匹配了知识库的问题后,机器人就自动回复。

比如输入:缴费年期变更后,佣金如何计算?,能得到在知识库中设置的答案。

访客端和机器人对话

如果想使机器人变得更加智能,需要参考关于Chatopera 云服务的更多介绍。

- + \ No newline at end of file diff --git a/docs/v7/work-chatbot/index.html b/docs/v7/work-chatbot/index.html index 1cacb6f6..5b41764e 100644 --- a/docs/v7/work-chatbot/index.html +++ b/docs/v7/work-chatbot/index.html @@ -4,13 +4,13 @@ 机器人客服 | 春松客服 - +
版本:v7

机器人客服

痛点

企业需要快速回复客服问题,当前市场上,存在很多厂商能提供全渠道智能客服系统,相对来说,渠道对接已经非常成熟,集成起来容易。在机器人客服上,用户体验参差不齐。在 Chatopera,我们主要关注智能机器人,追求最好的机器人客服体验:快速实现符合业务需求的聊天机器人,效果稳定。

用户服务环节

解决方案

场景描述

在 Chatopera,机器人客服将加入到聊天室中,它有两种参与客户服务的方式:

  • 管聊天室,直接和消费者沟通

机器人客服

具体地说,在排队阶段,引导消费者问问题,借助Chatopera 机器人平台,进行意图识别,如果意图匹配到了智能问答引擎中的对话,就启动多轮对话,完成服务;未匹配到多轮对话则继续排队,在客服人员接入会话时,机器人客服针对消费者的问题,给客服人员建议回复。

针对不同企业客户的需求,机器人客服的服务方式也可以调整,最主要的是,机器人客服可以利用多轮对话和知识库,提高用户满意度,提高效率,人工坐席专注于更加棘手的问题。

  • 辅助客服人员

机器人辅助坐席

功能设计

考虑到上述痛点,春松客服的机器人客服推出两个主要功能:机器人客服的主要功能包括:1)智能客服,接待访客;2)知识库建议,包括知识库联想和知识库快捷。

智能客服:在开启状态下,在访客端可以看到智能客服对话窗口并与机器人客服对话。 在管理页面,可切换工作状态,比如机器人客服优先、人工坐席优先或仅机器人客服。

知识库建议:包括知识库联想知识库快捷知识库联想:当坐席与访客进行对话过程中,坐席输入消息时是否得到机器人的建议回复;知识库快捷:当坐席与访客进行对话过程中,坐席收到访客的消息时是否得到机器人的建议回复。

利用机器人知识库,可以支持坐席即时获得建议回复,得到标准、准确、体贴的回复内容,提升用户体验,大幅度提升工作效率。在春松客服中,支持使用知识库完成:知识库快捷和知识库联想,详细内容阅读下文。

可以在 Chatopera 机器人平台的管理页面设置这些功能的开启状态,在右上角菜单进入机器人管理和使用统计情况查看页面。

视频教程

机器人客服是春松客服的特色功能之一,机器人客服设计的目标是自动完成固定话术和固定话术的问答。春松客服的机器人客服是从客服人员和访客两个角度展开的,提升生产力和客户满意度,比如智能建议回复、知识库问答和多轮对话。

建议先看视频教程,再看本文剩余内容。

视频地址:https://ke.qq.com/course/475430

下一步

计费和发票

春松客服里机器人客服的收费标准,对于使用 Chatopera 云服务 而言,参考 《计费和发票》;同时,Chatopera 机器人平台可为企业客户私有部署,洽谈合作参考 《联系我们》

话术助手

考虑到客服工作目前分布在不同渠道,而且每隔一段时间还会出现新的渠道,有没有一个好的知识库工具能适应不同渠道呢?

Chatopera 发布 话术助手 来适应差异较大的不同渠道,将机器人知识库发挥更大作用。

话术助手将知识库的效益最大化,适合作为企业知识库管理、网络聊天快捷语等场景。

- + \ No newline at end of file diff --git a/docs/v7/work-chatbot/install/index.html b/docs/v7/work-chatbot/install/index.html index 2b01ab3d..fad55fb3 100644 --- a/docs/v7/work-chatbot/install/index.html +++ b/docs/v7/work-chatbot/install/index.html @@ -4,13 +4,13 @@ 安装配置 | 春松客服 - +
版本:v7

安装配置

机器人客服

只有超级管理员可以在【系统设置】中配置机器人客服,超级管理员权限介绍参考账号与权限

安装好机器人插件

配置环境变量

在机器人客服问答中,会从 Chatopera 云服务检索答案,答案有时候也包含多条记录,怎么回答访客的问题按照如下策略。

1、 首先,每个答案包含与访客问题的相似度,该相似度在[0,1]区间,值越大二者越相似。

2、 最高的相似度的答案如何大于或等于 最佳回复阀值 时,机器人客服将直接发送答案给访客。

3、 如何 (2)中没有得到答案,那么则将相似度大于或等于 建议回复阀值 的记录,作为一个列表发送给访客。

建议回复列表

4、(2) 和 (3)都没有答案,则回复兜底回复。

以上,我们引入了 最佳回复阀值建议回复阀值 的概念,这两个值的默认值分别为 0.8 和 0.6。在启动服务时,也可以通过环境变量修改他们,其中 最佳回复阀值 需要大于 建议回复阀值

  • 环境变量
BOT_PROVIDER                 # Chatopera 机器人平台地址,支持私有部署,默认为 Chatopera 云服务 https://bot.chatopera.com
BOT_THRESHOLD_FAQ_BEST_REPLY # 最佳回复阀值
BOT_THRESHOLD_FAQ_SUGG_REPLY # 建议回复阀值

如果部署是按照文档春松客服私有部署进行,可以在 .env 中设置配置项,参考 sample.env

创建网站渠道

以管理员身份登录春松客服坐席工作台,导航【系统-客服接入-网站列表-创建新网站】,按照如下内容设置网站渠道。

项目描述
网站名称localhost任意字符串
网站地址localhost网站的域名或 IP

创建网站渠道

点击【立即提交】保存。

- + \ No newline at end of file diff --git a/docs/v7/work-chatbot/message-types/index.html b/docs/v7/work-chatbot/message-types/index.html index 3ddff5af..2b7343fb 100644 --- a/docs/v7/work-chatbot/message-types/index.html +++ b/docs/v7/work-chatbot/message-types/index.html @@ -4,7 +4,7 @@ 消息类型 | 春松客服 - + @@ -13,7 +13,7 @@ 在春松客服里,为了支持各种丰富的对话场景,这些功能都是使用多轮对话配置。接下来的介绍假设您已经学习了多轮对话设计器的内容,如果您还没有学习这部分内容,建议先完成,大约需要 30 分钟时间

下面是支持在问候语中展示热门问题,进行导航的方法,这种形式比只有一段文本的【普通问候语】更加友好。

  • 下载安装多轮对话设计器

下载多轮对话设计器

下载连接也可以通过多轮对话设计器使用教程获得。

  • 新建聊天机器人

新建聊天机器人

  • 新建对话技能

新建对话技能

此处,对话名称可以使用字母、数字和下划线组成的字符串填写。

  • 粘贴技能脚本

在该机器人的技能列表中,点击刚刚创建的技能的“编辑”按钮,并在新打开的编辑窗口中,选择“脚本”,将下面的几行内容粘贴到编辑窗口中。

// FAQ Hotlist
+ __faq_hot_list
- {keep} ^get_greetings()

点击【保存】,在编辑窗口中,如图。

粘贴技能脚本

该规则__faq_hot_list将保证在访客和机器人连接成功后, 机器人发送函数get_greetings返回的内容。此处__faq_hot_list是固定的,get_greetings函数名和下面的技能函数名保持一致便可。

__faq_hot_list 是春松客服与 Chatopera 机器人平台之间约定的一个钩子。

{keep} 的作用是机器人记忆中,可重复的使用一个回复,参考文档

  • 粘贴技能函数
// 问候语中关联常见问题
exports.get_greetings = async function() {
return {
text: "请问有什么可以帮到您?",
params: [{
label: "1. 产品列表",
type: "qlist",
text: "产品列表"
}, {
label: "2. 当季热销产品",
type: "qlist",
text: "当季热销产品"
}, {
label: "3. 退换货咨询",
type: "qlist",
text: "退换货咨询"
}]
};
}

点击【保存】,在编辑窗口中,如图。

粘贴技能函数

在函数中,可以自定义热门问题的文字,顺序。文字即访客看到的文本内容,通过label设定,当访客点击一个问题时,聊天机器人将收到 text设定的文本。您可以在知识库或多轮对话中,设置该文本的回复内容。

访客对于热门问题列表,可以点击多次。

  • 导出聊天机器人

多轮对话设计器是智能对话机器人的设计环境,Chatopera 云服务智能问答引擎是机器人的运行时环境。

发布并导出对话应用

导出后,多轮对话设计将该机器人多轮对话保存为一个.c66 后缀的文件。

  • 发布聊天机器人

登录 Chatopera 云服务,在目标机器人的多轮对话管理面板中,导入对话应用(.c66)文件。

导入Chatopera云服务

  • 上线后使用

在导入成功后,在春松客服中,访客再次登录聊天窗口,就会收到带有热门问题的问候语。

按钮消息

另外一种情况是机器人客服回答一个选择列表,访客点选按钮进行选择。

按钮消息

  • 粘贴技能脚本

可以在上面步骤中建立的技能中,添加新的规则:

+ (*) 产品列表 (*)
- ^get_products()

该规则将保证在访客的问题中有 产品列表时,发送函数get_products返回的内容。

  • 粘贴技能函数
// 按钮选择消息
exports.get_products = async function() {
return {
text: "您对下面哪个产品感兴趣",
params: [{
label: "上衣",
type: "button",
text: "介绍一下上衣"
},
{
label: "服装",
type: "button",
text: "介绍一下鞋帽"
}
]
}
}

在脚本中,只需要设定params中的内容作为选型,其他保持默认。

图文消息

春松客服还支持的一类消息是图文消息,通过是分享一个链接,展示链接的图片和简介。

按钮消息

  • 粘贴技能脚本

可以在上面步骤中建立的技能中,添加新的规则:

+ 介绍一下上衣
- ^get_shangyi()

该规则将保证在访客的问题中有 介绍一下上衣时,发送函数get_shangyi返回的内容。

  • 粘贴技能函数
// 图文消息
exports.get_shangyi = async function() {
return {
text: "{CLEAR} 图文消息",
params: [{
type: 'card',
title: "秋冬上衣优选",
thumbnail: "https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=277597165,2202071991&fm=15&gp=0.jpg",
summary: "秋冬上衣优选秋冬上衣优选秋冬上衣优选秋冬上衣优选秋冬上衣优选秋冬上衣优选秋冬上衣优选秋冬上衣优选",
hyperlink: "https://www.1688.com/huo/B6F9CDAFD7B0C5AEBAA2CDE2CCD7BCD3BAF1C9CFD2C2C7EFB6AC.html"
}]
}
}

其中,title代表大标题,thumbnail是图片,summary是简介,hyperlink是点击图文消息后,跳转的链接,这几项是用户可以自定义的,其它项就使用默认值,比如type的值必须是card

文本消息、热门问题、按钮消息和图文消息是春松客服支持的在线机器人客服消息类型,更多知识进入 Chatopera 机器人平台文档查看。

在掌握了知识库、脚本语法和函数后,用户可以支持各种客服场景。

快速开始

在上面的介绍中,Chatopera 的多轮聊天机器人通过c66文件进行分发,Chatopera 提供了在问候语中关联热门问题的多轮对话应用示例文件(小松.1.0.7.c66),您可以点击下载链接获得这个应用。

该对话可以导入到多轮对话设计器中,进行浏览脚本和函数;也可以直接导入到 Chatopera 云服务,然后在春松客服中进行体验。

- + \ No newline at end of file diff --git a/docs/v7/work/index.html b/docs/v7/work/index.html index 7f48018d..beed5fb1 100644 --- a/docs/v7/work/index.html +++ b/docs/v7/work/index.html @@ -4,13 +4,13 @@ 坐席工作台 | 春松客服 - +
版本:v7

坐席工作台

坐席工作台,是坐席人员服务访客的主要工具,在左侧导航菜单可进入坐席工作台页面。进入坐席工作台后,客服人员可查看服务中、排队的访客,和访客交谈等。

客服工作状态

客服人员和消费者建立连接,并完成对话的聊天室,是客服系统的核心之一。参考以下内容,避免出现使用错误。

聊天室的状态

聊天室的状态

聊天室的状态

注意事项

客服人员状态设置应注意以下事项:

  1. 登录后设定为“在线”,默认为“就绪置闲”。

  2. 坐席设定“置忙”或“非就绪”。

  3. 坐席只能单点登录,后续的登录会将早前的登录踢出。

  4. 坐席可以在登录后打开多个 Tab 页。

  5. 坐席关闭所有 Tab 页后:如果在 10 秒内没有打开新的 Tab 页,则系统自动设定该坐席为“非就绪”状态;如果坐席在 10 秒内打开新的 tab 页,则保持关闭 tab 页前的状态。

  6. 坐席没有关闭所有 Tab 页,则保持关闭前的状态。

  7. 坐席刷新 Tab 页,保持刷新前的状态:此处如果坐席持续不断的刷新 Tab 页,则有可能被系统设定到“非就绪状态”,这个符合客观事实,连续不断的刷就是非就绪。

  8. 坐席登出,设定为离线状态。离开电脑超过 1 个小时,坐席人员应设定为非就绪状态或置忙;在下班前,应登出春松客服。

  9. 坐席每次登录,有最大时效为 24 小时,超过 24 小时需要重新登录,否则执行转接等操作时会提醒并回到登录页面。

访客会话状态流转

在访客与人工坐席的会话中,状态流转如下:

聊天室的状态

排队:人工坐席繁忙,消费者接入聊天室时没有空闲的客服人员接起会话,这时,消费者往往会等待,在等待的过程中输入问题。此时消费者不能断开,断开后重连有可能重新排队。

活动:人工坐席加入会话,开始和消费者聊天,解答问题,并且有可能进行几句寒暄。

转接:当前服务人员有时会需要其他工作人员协助,往往也会直接将消费者转接到另外一名客服人员。这时,聊天室就被另外一名客服人员接管。

关闭:聊天结束后的一种状态,代表服务未顺利完成,很可能对消费者问题没有解决或消费者离开聊天室。

完成:聊天结束后的一种状态,代表服务顺利完成,比如消费者得到了满意的回答,关闭聊天室。

当该渠道集成了机器人客服时,对该流程有影响,参考机器人客服

客服坐席设置

  • 确保需要作为坐席的用户具有“多媒体坐席”的权限;系统->系统管理->用户和组->用户账号->选中该用户->编辑,就可以设置“多媒体坐席

聊天室的状态

  • 需要把 “坐席工作台” 授权给此用户;

聊天室的状态

  • 保证该坐席用户已经登录系统,并且将自己的坐席状态设置为”就绪”。

聊天室的状态

- + \ No newline at end of file diff --git a/docs/work-chatbot/bot-agent/index.html b/docs/work-chatbot/bot-agent/index.html index 11de0784..cb3f4c86 100644 --- a/docs/work-chatbot/bot-agent/index.html +++ b/docs/work-chatbot/bot-agent/index.html @@ -4,13 +4,13 @@ 集成机器人客服 | 春松客服 - +
版本:v8

集成机器人客服

创建聊天机器人

首先,创建聊天机器人,登录Chatopera 云服务,注册并在【控制台】中创建聊天机器人。

创建聊天机器人

项目描述
机器人名称小 C机器人的名字,创建后不能变更
描述机器人客服机器人的描述
语言zh_CN机器人的语言为中文

机器人具有多轮对话和知识库两个管理对话能力的组件,在创建好机器人后,创建一个问答对作为测试示例。点击【知识库】图标,点击【新建问题】。

新建问答对

项目描述
问题缴费年期变更后,佣金如何计算?问题的文本
答案变更后仍有佣金的,按照变更后的年期对应的提佣率计算佣金。问题的答案

点击【确定】。

集成机器人的方式是通过 SDK 创建机器人实例,使用机器人接口进行对话和查询等。机器人实例的认证和授权是通过ClientIdSecret完成,点击【设置】查看ClientIdSecret

查看 ClientId 和 Secret

绑定机器人

然后,以管理员身份进入系统设置,在左侧菜单中导航至【智能机器人-新建机器人】,按照如下内容填入创建表单。

项目描述
网站渠道localhost根据网站地址选择网站渠道
ClientIdxxxChatopera 云服务 ClientId
SecretxxxChatopera 云服务 Secret
工作模式机器人客服优先目前支持【机器人客服优先】或【人工客服优先】两种类型
描述机器人客服对机器人的简要介绍

集成机器人客服

点击【保存】创建机器人,返回机器人列表页面,可以找到刚刚创建的机器人客服。

开启机器人客服

测试机器人客服

提示:春松客服访客测试端地址

http[s]://春松客服IP[:PORT]/testclient.html

使用浏览器打开春松客服访客测试端,并点击【在线客服】。在知识库设置好后,当访客在客户端问问题,匹配了知识库的问题后,机器人就自动回复。

比如输入:缴费年期变更后,佣金如何计算?,能得到在知识库中设置的答案。

访客端和机器人对话

如果想使机器人变得更加智能,需要参考关于Chatopera 云服务的更多介绍。

- + \ No newline at end of file diff --git a/docs/work-chatbot/index.html b/docs/work-chatbot/index.html index 67203b71..f6518ca6 100644 --- a/docs/work-chatbot/index.html +++ b/docs/work-chatbot/index.html @@ -4,13 +4,13 @@ 机器人客服 | 春松客服 - +
版本:v8

机器人客服

痛点

企业需要快速回复客服问题,当前市场上,存在很多厂商能提供全渠道智能客服系统,相对来说,渠道对接已经非常成熟,集成起来容易。在机器人客服上,用户体验参差不齐。在 Chatopera,我们主要关注智能机器人,追求最好的机器人客服体验:快速实现符合业务需求的聊天机器人,效果稳定。

用户服务环节

解决方案

场景描述

在 Chatopera,机器人客服将加入到聊天室中,它有两种参与客户服务的方式:

  • 管聊天室,直接和消费者沟通

机器人客服

具体地说,在排队阶段,引导消费者问问题,借助Chatopera 机器人平台,进行意图识别,如果意图匹配到了智能问答引擎中的对话,就启动多轮对话,完成服务;未匹配到多轮对话则继续排队,在客服人员接入会话时,机器人客服针对消费者的问题,给客服人员建议回复。

针对不同企业客户的需求,机器人客服的服务方式也可以调整,最主要的是,机器人客服可以利用多轮对话和知识库,提高用户满意度,提高效率,人工坐席专注于更加棘手的问题。

  • 辅助客服人员

机器人辅助坐席

功能设计

考虑到上述痛点,春松客服的机器人客服推出两个主要功能:机器人客服的主要功能包括:1)智能客服,接待访客;2)知识库建议,包括知识库联想和知识库快捷。

智能客服:在开启状态下,在访客端可以看到智能客服对话窗口并与机器人客服对话。 在管理页面,可切换工作状态,比如机器人客服优先、人工坐席优先或仅机器人客服。

知识库建议:包括知识库联想知识库快捷知识库联想:当坐席与访客进行对话过程中,坐席输入消息时是否得到机器人的建议回复;知识库快捷:当坐席与访客进行对话过程中,坐席收到访客的消息时是否得到机器人的建议回复。

利用机器人知识库,可以支持坐席即时获得建议回复,得到标准、准确、体贴的回复内容,提升用户体验,大幅度提升工作效率。在春松客服中,支持使用知识库完成:知识库快捷和知识库联想,详细内容阅读下文。

可以在 Chatopera 机器人平台的管理页面设置这些功能的开启状态,在右上角菜单进入机器人管理和使用统计情况查看页面。

视频教程

机器人客服是春松客服的特色功能之一,机器人客服设计的目标是自动完成固定话术和固定话术的问答。春松客服的机器人客服是从客服人员和访客两个角度展开的,提升生产力和客户满意度,比如智能建议回复、知识库问答和多轮对话。

建议先看视频教程,再看本文剩余内容。

视频地址:https://ke.qq.com/course/475430

下一步

计费和发票

春松客服里机器人客服的收费标准,对于使用 Chatopera 云服务 而言,参考 《计费和发票》;同时,Chatopera 机器人平台可为企业客户私有部署,洽谈合作参考 《联系我们》

话术助手

考虑到客服工作目前分布在不同渠道,而且每隔一段时间还会出现新的渠道,有没有一个好的知识库工具能适应不同渠道呢?

Chatopera 发布 话术助手 来适应差异较大的不同渠道,将机器人知识库发挥更大作用。

话术助手将知识库的效益最大化,适合作为企业知识库管理、网络聊天快捷语等场景。

- + \ No newline at end of file diff --git a/docs/work-chatbot/install/index.html b/docs/work-chatbot/install/index.html index 060ac54c..0e6aa0dd 100644 --- a/docs/work-chatbot/install/index.html +++ b/docs/work-chatbot/install/index.html @@ -4,13 +4,13 @@ 安装配置 | 春松客服 - +
版本:v8

安装配置

机器人客服

只有超级管理员可以在【系统设置】中配置机器人客服,超级管理员权限介绍参考账号与权限

安装好机器人插件

配置环境变量

在机器人客服问答中,会从 Chatopera 云服务检索答案,答案有时候也包含多条记录,怎么回答访客的问题按照如下策略。

1、 首先,每个答案包含与访客问题的相似度,该相似度在[0,1]区间,值越大二者越相似。

2、 最高的相似度的答案如何大于或等于 最佳回复阀值 时,机器人客服将直接发送答案给访客。

3、 如何 (2)中没有得到答案,那么则将相似度大于或等于 建议回复阀值 的记录,作为一个列表发送给访客。

建议回复列表

4、(2) 和 (3)都没有答案,则回复兜底回复。

以上,我们引入了 最佳回复阀值建议回复阀值 的概念,这两个值的默认值分别为 0.8 和 0.6。在启动服务时,也可以通过环境变量修改他们,其中 最佳回复阀值 需要大于 建议回复阀值

  • 环境变量
BOT_PROVIDER                 # Chatopera 机器人平台地址,支持私有部署,默认为 Chatopera 云服务 https://bot.chatopera.com
BOT_THRESHOLD_FAQ_BEST_REPLY # 最佳回复阀值
BOT_THRESHOLD_FAQ_SUGG_REPLY # 建议回复阀值

如果部署是按照文档春松客服私有部署进行,可以在 .env 中设置配置项,参考 sample.env

创建网站渠道

以管理员身份登录春松客服坐席工作台,导航【系统-客服接入-网站列表-创建新网站】,按照如下内容设置网站渠道。

项目描述
网站名称localhost任意字符串
网站地址localhost网站的域名或 IP

创建网站渠道

点击【立即提交】保存。

- + \ No newline at end of file diff --git a/docs/work-chatbot/message-types/index.html b/docs/work-chatbot/message-types/index.html index e90c701d..3e935bd1 100644 --- a/docs/work-chatbot/message-types/index.html +++ b/docs/work-chatbot/message-types/index.html @@ -4,7 +4,7 @@ 消息类型 | 春松客服 - + @@ -13,7 +13,7 @@ 在春松客服里,为了支持各种丰富的对话场景,这些功能都是使用多轮对话配置。接下来的介绍假设您已经学习了多轮对话设计器的内容,如果您还没有学习这部分内容,建议先完成,大约需要 30 分钟时间

下面是支持在问候语中展示热门问题,进行导航的方法,这种形式比只有一段文本的【普通问候语】更加友好。

  • 下载安装多轮对话设计器

下载多轮对话设计器

下载连接也可以通过多轮对话设计器使用教程获得。

  • 新建聊天机器人

新建聊天机器人

  • 新建对话技能

新建对话技能

此处,对话名称可以使用字母、数字和下划线组成的字符串填写。

  • 粘贴技能脚本

在该机器人的技能列表中,点击刚刚创建的技能的“编辑”按钮,并在新打开的编辑窗口中,选择“脚本”,将下面的几行内容粘贴到编辑窗口中。

// FAQ Hotlist
+ __faq_hot_list
- {keep} ^get_greetings()

点击【保存】,在编辑窗口中,如图。

粘贴技能脚本

该规则__faq_hot_list将保证在访客和机器人连接成功后, 机器人发送函数get_greetings返回的内容。此处__faq_hot_list是固定的,get_greetings函数名和下面的技能函数名保持一致便可。

__faq_hot_list 是春松客服与 Chatopera 机器人平台之间约定的一个钩子。

{keep} 的作用是机器人记忆中,可重复的使用一个回复,参考文档

  • 粘贴技能函数
// 问候语中关联常见问题
exports.get_greetings = async function() {
return {
text: "请问有什么可以帮到您?",
params: [{
label: "1. 产品列表",
type: "qlist",
text: "产品列表"
}, {
label: "2. 当季热销产品",
type: "qlist",
text: "当季热销产品"
}, {
label: "3. 退换货咨询",
type: "qlist",
text: "退换货咨询"
}]
};
}

点击【保存】,在编辑窗口中,如图。

粘贴技能函数

在函数中,可以自定义热门问题的文字,顺序。文字即访客看到的文本内容,通过label设定,当访客点击一个问题时,聊天机器人将收到 text设定的文本。您可以在知识库或多轮对话中,设置该文本的回复内容。

访客对于热门问题列表,可以点击多次。

  • 导出聊天机器人

多轮对话设计器是智能对话机器人的设计环境,Chatopera 云服务智能问答引擎是机器人的运行时环境。

发布并导出对话应用

导出后,多轮对话设计将该机器人多轮对话保存为一个.c66 后缀的文件。

  • 发布聊天机器人

登录 Chatopera 云服务,在目标机器人的多轮对话管理面板中,导入对话应用(.c66)文件。

导入Chatopera云服务

  • 上线后使用

在导入成功后,在春松客服中,访客再次登录聊天窗口,就会收到带有热门问题的问候语。

按钮消息

另外一种情况是机器人客服回答一个选择列表,访客点选按钮进行选择。

按钮消息

  • 粘贴技能脚本

可以在上面步骤中建立的技能中,添加新的规则:

+ (*) 产品列表 (*)
- ^get_products()

该规则将保证在访客的问题中有 产品列表时,发送函数get_products返回的内容。

  • 粘贴技能函数
// 按钮选择消息
exports.get_products = async function() {
return {
text: "您对下面哪个产品感兴趣",
params: [{
label: "上衣",
type: "button",
text: "介绍一下上衣"
},
{
label: "服装",
type: "button",
text: "介绍一下鞋帽"
}
]
}
}

在脚本中,只需要设定params中的内容作为选型,其他保持默认。

图文消息

春松客服还支持的一类消息是图文消息,通过是分享一个链接,展示链接的图片和简介。

按钮消息

  • 粘贴技能脚本

可以在上面步骤中建立的技能中,添加新的规则:

+ 介绍一下上衣
- ^get_shangyi()

该规则将保证在访客的问题中有 介绍一下上衣时,发送函数get_shangyi返回的内容。

  • 粘贴技能函数
// 图文消息
exports.get_shangyi = async function() {
return {
text: "{CLEAR} 图文消息",
params: [{
type: 'card',
title: "秋冬上衣优选",
thumbnail: "https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=277597165,2202071991&fm=15&gp=0.jpg",
summary: "秋冬上衣优选秋冬上衣优选秋冬上衣优选秋冬上衣优选秋冬上衣优选秋冬上衣优选秋冬上衣优选秋冬上衣优选",
hyperlink: "https://www.1688.com/huo/B6F9CDAFD7B0C5AEBAA2CDE2CCD7BCD3BAF1C9CFD2C2C7EFB6AC.html"
}]
}
}

其中,title代表大标题,thumbnail是图片,summary是简介,hyperlink是点击图文消息后,跳转的链接,这几项是用户可以自定义的,其它项就使用默认值,比如type的值必须是card

文本消息、热门问题、按钮消息和图文消息是春松客服支持的在线机器人客服消息类型,更多知识进入 Chatopera 机器人平台文档查看。

在掌握了知识库、脚本语法和函数后,用户可以支持各种客服场景。

快速开始

在上面的介绍中,Chatopera 的多轮聊天机器人通过c66文件进行分发,Chatopera 提供了在问候语中关联热门问题的多轮对话应用示例文件(小松.1.0.7.c66),您可以点击下载链接获得这个应用。

该对话可以导入到多轮对话设计器中,进行浏览脚本和函数;也可以直接导入到 Chatopera 云服务,然后在春松客服中进行体验。

- + \ No newline at end of file diff --git a/docs/work/index.html b/docs/work/index.html index 281942e5..4b955c91 100644 --- a/docs/work/index.html +++ b/docs/work/index.html @@ -4,13 +4,13 @@ 坐席工作台 | 春松客服 - +
版本:v8

坐席工作台

坐席工作台,是坐席人员服务访客的主要工具,在左侧导航菜单可进入坐席工作台页面。进入坐席工作台后,客服人员可查看服务中、排队的访客,和访客交谈等。

客服工作状态

客服人员和消费者建立连接,并完成对话的聊天室,是客服系统的核心之一。参考以下内容,避免出现使用错误。

聊天室的状态

聊天室的状态

聊天室的状态

注意事项

客服人员状态设置应注意以下事项:

  1. 登录后设定为“在线”,默认为“就绪置闲”。

  2. 坐席设定“置忙”或“非就绪”。

  3. 坐席只能单点登录,后续的登录会将早前的登录踢出。

  4. 坐席可以在登录后打开多个 Tab 页。

  5. 坐席关闭所有 Tab 页后:如果在 10 秒内没有打开新的 Tab 页,则系统自动设定该坐席为“非就绪”状态;如果坐席在 10 秒内打开新的 tab 页,则保持关闭 tab 页前的状态。

  6. 坐席没有关闭所有 Tab 页,则保持关闭前的状态。

  7. 坐席刷新 Tab 页,保持刷新前的状态:此处如果坐席持续不断的刷新 Tab 页,则有可能被系统设定到“非就绪状态”,这个符合客观事实,连续不断的刷就是非就绪。

  8. 坐席登出,设定为离线状态。离开电脑超过 1 个小时,坐席人员应设定为非就绪状态或置忙;在下班前,应登出春松客服。

  9. 坐席每次登录,有最大时效为 24 小时,超过 24 小时需要重新登录,否则执行转接等操作时会提醒并回到登录页面。

访客会话状态流转

在访客与人工坐席的会话中,状态流转如下:

聊天室的状态

排队:人工坐席繁忙,消费者接入聊天室时没有空闲的客服人员接起会话,这时,消费者往往会等待,在等待的过程中输入问题。此时消费者不能断开,断开后重连有可能重新排队。

活动:人工坐席加入会话,开始和消费者聊天,解答问题,并且有可能进行几句寒暄。

转接:当前服务人员有时会需要其他工作人员协助,往往也会直接将消费者转接到另外一名客服人员。这时,聊天室就被另外一名客服人员接管。

关闭:聊天结束后的一种状态,代表服务未顺利完成,很可能对消费者问题没有解决或消费者离开聊天室。

完成:聊天结束后的一种状态,代表服务顺利完成,比如消费者得到了满意的回答,关闭聊天室。

当该渠道集成了机器人客服时,对该流程有影响,参考机器人客服

客服坐席设置

  • 确保需要作为坐席的用户具有“多媒体坐席”的权限;系统->系统管理->用户和组->用户账号->选中该用户->编辑,就可以设置“多媒体坐席

聊天室的状态

  • 需要把 “坐席工作台” 授权给此用户;

聊天室的状态

  • 保证该坐席用户已经登录系统,并且将自己的坐席状态设置为”就绪”。

聊天室的状态

- + \ No newline at end of file diff --git a/index.html b/index.html index 732a71b3..44928eaa 100644 --- a/index.html +++ b/index.html @@ -4,13 +4,13 @@ 春松客服 | 春松客服 - +

春松客服

迭代客服系统助力企业持续成长

Easy to Use

功能强大

春松客服是拥有坐席管理、渠道管理、机器人客服、数据分析、CRM 等功能于一身的新一代客服系统。

Focus on What Matters

安装简单

春松客服适应各种部署方式,支持云原生一键部署,提供 Docker 和 Docker compose 作为默认安装方案,适合体验、开发、测试和上线春松客服。

Powered by React

开源软件

春松客服使用的开源许可协议是 春松许可证 v1.0,春松客服目前坐拥中文开源客服系统之中最多的 Stars, 最多的下载次数,最多的用户反馈。

- + \ No newline at end of file diff --git a/markdown-page/index.html b/markdown-page/index.html index 1456459e..a962cd35 100644 --- a/markdown-page/index.html +++ b/markdown-page/index.html @@ -4,13 +4,13 @@ Markdown page example | 春松客服 - +

Markdown page example

You don't need React to write simple standalone pages.

- + \ No newline at end of file