#184 v1.21.7版本合入

Merged
avadesian merged 74 commits from V20210731 into develop 2 years ago
  1. +3
    -0
      .gitignore
  2. +184
    -0
      custom/public/css/git.openi.css
  3. +711
    -0
      custom/public/img/develop.svg
  4. +1
    -0
      custom/public/img/gitopeni-index-01.svg
  5. +1
    -0
      custom/public/img/gitopeni-index-02.svg
  6. BIN
      custom/public/img/i-code-pic.jpg
  7. BIN
      custom/public/img/i-data-pic.jpg
  8. +1
    -0
      custom/public/img/i-pic-01.svg
  9. +1
    -0
      custom/public/img/i-pic-02.svg
  10. +1
    -0
      custom/public/img/i-pic-03.svg
  11. +1
    -0
      custom/public/img/i-pic-04.svg
  12. +1
    -0
      custom/public/img/i-yunnao.svg
  13. BIN
      custom/public/img/icon-403@2x.png
  14. BIN
      custom/public/img/icon-404@2x.png
  15. BIN
      custom/public/img/icon-500@2x.png
  16. +1
    -0
      custom/public/img/logo-w.svg
  17. +1
    -0
      custom/public/img/logo.svg
  18. +7
    -3
      models/cloudbrain.go
  19. +12
    -0
      models/error.go
  20. +16
    -3
      modules/cloudbrain/resty.go
  21. +35
    -0
      modules/git/repo.go
  22. +7
    -2
      options/locale/locale_en-US.ini
  23. +7
    -3
      options/locale/locale_zh-CN.ini
  24. +1
    -0
      routers/org/home.go
  25. +14
    -1
      routers/repo/cloudbrain.go
  26. +59
    -0
      routers/repo/view.go
  27. +9
    -2
      routers/routes/routes.go
  28. +114
    -0
      routers/secure/user.go
  29. +11
    -2
      routers/user/auth.go
  30. +8
    -8
      templates/base/footer_content.tmpl
  31. +210
    -0
      templates/base/head_home.tmpl
  32. +2
    -2
      templates/base/head_navbar.tmpl
  33. +161
    -0
      templates/base/head_navbar_home.tmpl
  34. +1
    -1
      templates/explore/repo_list.tmpl
  35. +1
    -4
      templates/explore/repo_right.tmpl
  36. +174
    -230
      templates/home.tmpl
  37. +18
    -14
      templates/org/navber.tmpl
  38. +2
    -2
      templates/repo/create.tmpl
  39. +103
    -38
      templates/repo/home.tmpl
  40. +9
    -8
      templates/status/404.tmpl
  41. +9
    -12
      templates/status/500.tmpl
  42. +1
    -1
      web_src/js/components/MinioUploader.vue
  43. +2
    -2
      web_src/less/_base.less
  44. +1
    -1
      web_src/less/_dataset.less
  45. +2
    -0
      web_src/less/_repository.less
  46. +9
    -7
      web_src/less/openi.less

+ 3
- 0
.gitignore View File

@@ -95,3 +95,6 @@ prime/

# Make evidence files
/.make_evidence

/templates/home_bak.tmpl
/==bak

+ 184
- 0
custom/public/css/git.openi.css View File

@@ -0,0 +1,184 @@
.bg-gray{ background-color:#F8F8F8!important;}
.am-mb-0{ margin-bottom: 0 !important;}
.am-mb-05{ margin-bottom: 0.5rem !important;}
.am-mb-10{ margin-bottom: 1.0rem !important;}
.am-mb-15{ margin-bottom: 1.5rem !important;}
.am-mb-20{ margin-bottom: 2.0rem !important;}
.am-mb-30{ margin-bottom: 3.0rem !important;}
.am-mt-0{ margin-top: 0 !important;}
.am-mt-05{ margin-top: 0.5rem !important;}
.am-mt-10{ margin-top: 1.0rem !important;}
.am-mt-15{ margin-top: 1.5rem !important;}
.am-mt-20{ margin-top: 2.0rem !important;}
.am-mt-30{ margin-top: 3.0rem !important;}
.am-pb-0{ padding-bottom: 0 !important;}
.am-pb-05{ padding-bottom: 0.5rem !important;}
.am-pb-10{ padding-bottom: 1.0rem !important;}
.am-pb-15{ padding-bottom: 1.5rem !important;}
.am-pb-20{ padding-bottom: 2.0rem !important;}
.am-pb-30{ padding-bottom: 3.0rem !important;}
.am-pt-0{ padding-top: 0 !important;}
.am-pt-05{ padding-top: 0.5rem !important;}
.am-pt-10{ padding-top: 1.0rem !important;}
.am-pt-15{ padding-top: 1.5rem !important;}
.am-pt-20{ padding-top: 2.0rem !important;}
.am-pt-30{ padding-top: 3.0rem !important;}
.am-pl-30{ padding-left: 3.0rem !important;}
.am-ml-30{ margin-left: 3.0rem !important;}
.am-pr-30{ padding-right: 3.0rem !important;}
.am-mr-30{ margin-right: 3.0rem !important;}
.am-lh-18{ line-height: 1.8em;}

.opacity5{ opacity:0.5;}
.radius15{ border-radius:1.5rem !important; }
.radius10{ border-radius:1.0rem !important; }
.radius5{ border-radius:0.5rem !important; }
.am-shadow-1{
-webkit-box-shadow: 0 1px 2px 0 rgba(34,36,38,.15);
box-shadow: 0 1px 2px 0 rgba(34,36,38,.15);
}
.am-shadow-2{
-webkit-box-shadow: 0 2px 4px 0 rgba(34,36,38,.3);
box-shadow: 0 2px 4px 0 rgba(34,36,38,.3);
}


.ui.secondary.hometop.segment{
background: #DFE9F0;
padding-top: 0;
border: none;
margin-bottom: 90px;
}
.ui.secondary.hometop.segment #navbar{
z-index: 10;
}

.hometop .ui.secondary.menu .active.item{
color: #000;
background:none;
border-bottom: 1px solid #000;
}
.hometop .following.bar #navbar .brand{
padding-top: .78571429em;
}
.hometop .following.bar .brand .ui.mini.image {
height: 50px;
}

.homebanner{
position: relative;
padding: 100px 32px 80px;
z-index: 9;
}
.homebanner .ui.header .sub.header{
color: #3291F8;
}
.bannerpic{
position: absolute;
right: 50px;
bottom: -64px;
width: 560px;
}
.ui[class*="very padded"].segment.i-code{
padding-left: 6.0rem;
}
.i-code > .ui.blue.header{
color: #1678c2!important;
}
.i-code h2{
position: relative;
}
.i-code h2::before {
content: "";
position: absolute;
left: calc(-4.0rem + 6px);
top: 0.8rem;
width: 18px;
height: 18px;
border: 2px solid #505559;
border-radius: 50%;
background: #1b1c1d;
z-index: 9;
}
.i-code h2.am-bw::before{
background: #FFF;
}
.i-code-pic{
position: relative;
}
.i-code-pic > img{
margin-bottom: -3.0rem;
}
.i-env .ui.cards>.card>.image{
background: none;
}
.i-env .ui.cards>.card>.content{
border-top: none;
}
.leftline01{
position: absolute;
left: 3.0rem;
top: 0;
bottom: 0;
border-left: 2px solid #505559;
border-bottom: 2px solid #505559;
border-radius: 0 0 0 2.0rem;
width: 2.0rem;
}
.leftline02{
position: absolute;
left: 5rem;
top: calc(-5.0rem - 2px);
border-top: 2px solid #505559;
border-right: 2px solid #505559;
border-radius: 0 2.0rem 0 0;
width: 17.5rem;
height: 6.0rem;
}

@media only screen and (max-width: 767px) {
.am-mt-30{ margin-top: 1.5rem !important;}
.ui.secondary.hometop.segment{
margin-bottom: 2.0rem;
}
.bannerpic, .i-code-pic{
display: none;
}
.i-code h2::before {
left: calc(-5.0rem + 6px);
}
.i-code h2.am-bw::before{
left: calc(-4.0rem + 6px);
}
.leftline01{
width: calc(50% - 4.0rem);
}
.leftline02{
left: calc(50% - 1.0rem);
top: calc(-3.5rem - 2px);
}
}

@media only screen and (min-width: 768px) and (max-width: 991px) {
.bannerpic, .i-code-pic{
display: none;
}
.i-code h2::before {
left: calc(-5.0rem + 6px);
}
.i-code h2.am-bw::before{
left: calc(-4.0rem + 6px);
}
}

@media only screen and (min-width: 992px) and (max-width: 1199px) {

}

@media only screen and (min-width: 1200px) and (max-width: 1919px) {

}

@media only screen and (min-width: 1920px) {

}

+ 711
- 0
custom/public/img/develop.svg View File

@@ -0,0 +1,711 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.3.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 1216 416" style="enable-background:new 0 0 1216 416;" xml:space="preserve">
<style type="text/css">
.st0{fill:url(#SVGID_1_);stroke:#CBCFDE;stroke-width:2;stroke-dasharray:3;}
.st1{fill:#E5EAF3;stroke:#A5ADC1;stroke-width:0.5;}
.st2{fill:url(#SVGID_2_);}
.st3{fill:#FFFFFF;stroke:#A5ADC1;stroke-width:0.5;}
.st4{opacity:0.6;}
.st5{fill:none;stroke:#3A51C6;stroke-width:4;}
.st6{fill:#3A51C6;}
.st7{opacity:0.6;fill:#3A51C6;enable-background:new ;}
.st8{font-family:'MicrosoftYaHeiLight';}
.st9{font-size:14px;}
.st10{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;fill-opacity:0.4;stroke:#CBCFDE;}
.st11{fill:#252B3A;}
.st12{font-family:'MicrosoftYaHei';}
.st13{fill:none;}
.st14{fill-rule:evenodd;clip-rule:evenodd;fill:#D5E0F3;}
.st15{fill-rule:evenodd;clip-rule:evenodd;fill:#F7FAFF;}
.st16{fill-rule:evenodd;clip-rule:evenodd;fill:#F1F6FF;}
.st17{fill:none;stroke:#A5ADC1;stroke-width:0.5;}
.st18{fill:none;stroke:#555A6F;stroke-width:0.6232;}
.st19{fill-rule:evenodd;clip-rule:evenodd;fill:#E3EBF9;}
.st20{fill-rule:evenodd;clip-rule:evenodd;fill:#E8ECF3;}
.st21{fill-rule:evenodd;clip-rule:evenodd;fill:#E5EAF3;stroke:#A5ADC1;stroke-width:0.5;}
.st22{fill-rule:evenodd;clip-rule:evenodd;fill:url(#Fill-612_1_);}
.st23{fill-rule:evenodd;clip-rule:evenodd;fill:url(#Fill-19_1_);}
.st24{fill:none;stroke:#A5ADC1;stroke-width:0.5422;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.4994;}
.st25{fill-rule:evenodd;clip-rule:evenodd;fill:url(#形状结合_1_);}
.st26{fill:none;stroke:#555A6F;stroke-width:1.0843;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.4994;}
.st27{fill-rule:evenodd;clip-rule:evenodd;fill:url(#形状结合_2_);}
.st28{fill:url(#Oval-2_1_);}
.st29{fill:url(#Combined-Shape_1_);}
.st30{opacity:0.4017;fill:none;stroke:#7D849E;stroke-width:0.7429;enable-background:new ;}
.st31{fill:#A5ADC1;}
.st32{opacity:0.5012;fill:#A5ADC1;enable-background:new ;}
.st33{fill-rule:evenodd;clip-rule:evenodd;fill:url(#Fill-612_6_);}
.st34{fill-rule:evenodd;clip-rule:evenodd;fill:#EBEDF2;fill-opacity:0.4;stroke:#CBCFDE;}
.st35{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}
.st36{fill-rule:evenodd;clip-rule:evenodd;fill:url(#Fill-1_3_);}
.st37{fill-rule:evenodd;clip-rule:evenodd;fill:url(#Fill-3_3_);}
.st38{fill-rule:evenodd;clip-rule:evenodd;fill:url(#Fill-8_1_);}
.st39{fill-rule:evenodd;clip-rule:evenodd;fill:url(#Fill-5_1_);}
.st40{fill:none;stroke:#555A6F;}
.st41{fill-rule:evenodd;clip-rule:evenodd;fill:url(#路径-25_1_);}
.st42{fill-rule:evenodd;clip-rule:evenodd;fill:#A5ADC1;}
.st43{opacity:0.4319;fill-rule:evenodd;clip-rule:evenodd;fill:#A5ADC1;enable-background:new ;}
.st44{fill:none;stroke:#999FB6;stroke-width:0.5;}
.st45{fill-rule:evenodd;clip-rule:evenodd;fill:url(#路径-13_1_);}
.st46{opacity:0.506;fill-rule:evenodd;clip-rule:evenodd;fill:#7D849E;enable-background:new ;}
.st47{fill-rule:evenodd;clip-rule:evenodd;fill:#7D849E;}
.st48{fill-rule:evenodd;clip-rule:evenodd;fill:url(#形状结合_3_);}
.st49{opacity:0.6;enable-background:new ;}
.st50{fill-rule:evenodd;clip-rule:evenodd;fill:url(#Fill-1_4_);}
.st51{fill-rule:evenodd;clip-rule:evenodd;fill:url(#Fill-3_4_);}
.st52{fill-rule:evenodd;clip-rule:evenodd;fill:url(#Fill-8_6_);}
.st53{fill-rule:evenodd;clip-rule:evenodd;fill:url(#Fill-5_6_);}
.st54{font-family:'MicrosoftYaHei-Bold';}
.st55{fill:none;stroke:#CBCFDE;stroke-width:2;stroke-dasharray:3;}
</style>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="116.4526" y1="207.6249" x2="1210.4272" y2="207.6249">
<stop offset="0" style="stop-color:#FEFEFF"/>
<stop offset="1" style="stop-color:#F1F6FF"/>
</linearGradient>
<polygon class="st0" points="1210.4,207.6 1156.5,0 1156.5,24.6 116.5,24.6 116.5,390.7 1156.5,390.7 1156.5,415.2 "/>
<desc>Created with Sketch.</desc>
<g>
<circle class="st1" cx="47.3" cy="223.3" r="21.1"/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="29.2261" y1="223.2895" x2="65.3497" y2="223.2895">
<stop offset="0" style="stop-color:#FEFEFF"/>
<stop offset="1" style="stop-color:#F1F6FF"/>
</linearGradient>
<circle class="st2" cx="47.3" cy="223.3" r="18.1"/>
<g>
<circle class="st3" cx="47.3" cy="218.2" r="6"/>
<path class="st3" d="M47.3,224.3c-5.6,0-10.1,4.5-10.1,10.1h20.2C57.4,228.8,52.9,224.3,47.3,224.3z"/>
</g>
</g>
<g>
<g class="st4">
<line class="st5" x1="67.9" y1="223.3" x2="126.8" y2="223.3"/>
<g>
<polygon class="st6" points="118.9,233.1 117.2,231.3 125.9,223.3 117.2,215.2 118.9,213.5 129.4,223.3 "/>
</g>
</g>
</g>
<text transform="matrix(1 0 0 1 71.1347 209.8902)" class="st7 st8 st9">用户登录</text>
<g>
<path id="矩形备份-2_1_" class="st10" d="M272.5,185.6H130.4c-0.3,0-0.5,0.2-0.7,0.4c-0.2,0.3-0.3,0.6-0.3,1.1v76
c0,0.4,0.1,0.8,0.3,1.1c0.2,0.3,0.4,0.4,0.7,0.4h142.2c0.3,0,0.5-0.2,0.7-0.4c0.2-0.3,0.3-0.6,0.3-1.1v-76c0-0.4-0.1-0.8-0.3-1.1
C273,185.7,272.8,185.6,272.5,185.6z"/>
<text transform="matrix(1 0 0 1 199.7773 229.2355)" class="st11 st12 st9">创建项目</text>
<g id="电脑_2_" transform="translate(33.000000, 32.000000) scale(-1, 1) translate(-33.000000, -32.000000) translate(1.000000, 0.000000)">
<g>
<rect id="矩形_16_" x="-133.9" y="257.1" class="st13" width="64" height="-64"/>
<g id="电脑复制_1_" transform="translate(11.000000, 2.000000)">
<g id="编组_4_" transform="translate(5.371982, 40.317507)">
<polygon id="矩形_15_" class="st14" points="-120.8,209.4 -102.9,198.5 -102.9,201.4 -120.8,212.2 "/>
<polygon id="矩形_14_" class="st15" points="-112.2,193.1 -102.9,198.5 -120.8,209.4 -130.4,203.7 "/>
<polygon id="矩形_12_" class="st16" points="-133.4,202 -120.8,209.4 -120.8,212.3 -133.4,204.9 "/>
</g>
<g id="电脑-2_1_">
<g id="电脑_3_">
<g id="Group-616_1_" transform="translate(2.559524, 37.948718)">
<g id="编组_3_" transform="translate(6.786976, 7.749090)">
<path id="形状结合_4_" class="st17" d="M-124.8,204l17.9-10.9 M-124.8,204v2.6 M-124.8,204l-8.7-5.1"/>
</g>
<polygon id="路径-6_1_" class="st18" points="-118,214.7 -133.6,205.4 -112.7,193.5 -100.1,200.7 -100.1,203.8 "/>
</g>
<g id="Group-616-Copy_1_" transform="translate(16.380952, 37.948718)">
<polygon id="Fill-610_1_" class="st16" points="-132,199.1 -132,206.9 -133.5,206.1 -133.5,198.2 "/>
<polygon id="Fill-612_3_" class="st19" points="-132,199.1 -121.4,193.1 -121.4,200.7 -132,206.9 "/>
<polyline id="Path-3_1_" class="st18" points="-133.5,201.7 -133.5,206 -132,206.9 -121.4,200.7 -121.4,194.6 -132,200.9
-132,206.9 "/>
</g>
<g id="Group-2_1_">
<path id="Fill-8_2_" class="st20" d="M-92.3,195c0.1,0,0.1,0,0.2-0.1c0,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0
c0,0,0,0,0.1,0c0,0,0.1,0,0.1,0c0,0,0,0,0,0c0.1,0,0.1,0,0.2,0c0,0,0,0,0,0c0,0,0.1,0,0.1,0c0,0,0,0,0,0c0,0,0.1,0,0.1,0.1
l-2.7-1.6c0,0,0,0,0,0c0,0-0.1,0-0.1-0.1c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0-0.1,0c0,0,0,0-0.1,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0-0.1,0-0.1,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0-0.1,0-0.1,0c0,0,0,0,0,0c0,0,0,0-0.1,0c0,0,0,0-0.1,0c0,0,0,0-0.1,0
c0,0-0.1,0-0.1,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0-0.1,0-0.2,0.1c0,0,0,0-0.1,0c0,0,0,0,0,0c-0.1,0-0.2,0.1-0.3,0.1l-36.2,21.1
c-0.1,0.1-0.2,0.1-0.3,0.2c0,0,0,0-0.1,0c-0.1,0.1-0.2,0.2-0.3,0.3c0,0,0,0,0,0c0,0,0,0,0,0c0,0-0.1,0.1-0.1,0.2c0,0,0,0,0,0
c0,0,0,0,0,0c0,0-0.1,0.1-0.1,0.1c0,0,0,0-0.1,0.1c0,0,0,0,0,0.1c0,0,0,0.1-0.1,0.1c0,0,0,0,0,0.1c0,0,0,0.1-0.1,0.1
c0,0,0,0,0,0.1c0,0,0,0,0,0c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0.1-0.1,0.1c0,0,0,0,0,0.1s0,0,0,0.1
c0,0,0,0,0,0.1c0,0.1,0,0.1-0.1,0.2c0,0,0,0,0,0c0,0,0,0,0,0c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0c0,0,0,0,0,0.1
c0,0,0,0.1,0,0.1c0,0,0,0.1,0,0.1c0,0,0,0.1,0,0.1c0,0,0,0,0,0.1c0,0,0,0.1,0,0.1c0,0,0,0.1,0,0.1c0,0,0,0,0,0
c0,0,0,0.1,0,0.1c0,0.1,0,0.1,0,0.2c0,0,0,0,0,0c0,0,0,0,0,0c0,0.1,0,0.3,0,0.4l0.1,26.3c0,0.7,0.2,1.2,0.6,1.4l2.7,1.6
c-0.4-0.2-0.6-0.7-0.6-1.4L-131,220c0-0.1,0-0.3,0-0.4c0,0,0-0.1,0-0.1c0-0.1,0-0.1,0-0.2c0,0,0-0.1,0-0.1c0,0,0-0.1,0-0.1
c0-0.1,0-0.1,0-0.2c0,0,0-0.1,0-0.1c0-0.1,0-0.1,0.1-0.2c0,0,0,0,0-0.1c0-0.1,0.1-0.2,0.1-0.2c0,0,0,0,0,0
c0-0.1,0.1-0.1,0.1-0.2c0,0,0,0,0-0.1c0-0.1,0.1-0.1,0.1-0.2c0,0,0,0,0,0c0-0.1,0.1-0.1,0.1-0.2c0,0,0,0,0-0.1
c0-0.1,0.1-0.1,0.1-0.2c0,0,0-0.1,0.1-0.1c0,0,0.1-0.1,0.1-0.1c0,0,0.1-0.1,0.1-0.1c0,0,0.1-0.1,0.1-0.1
c0-0.1,0.1-0.1,0.1-0.2c0,0,0,0,0.1-0.1c0.1-0.1,0.2-0.2,0.3-0.3c0,0,0,0,0.1,0c0.1-0.1,0.2-0.2,0.3-0.2l36.2-21.1
C-92.6,195.2-92.5,195.1-92.3,195C-92.4,195.1-92.4,195-92.3,195"/>
<path id="Fill-6_3_" class="st21" d="M-91.1,196.8c0-0.8-0.3-1.3-0.8-1.6c-0.2-0.1-0.5-0.2-0.8-0.2c-0.3,0-0.6,0.1-0.9,0.3
l-35.8,21.1c-1.3,0.7-2.3,2.5-2.3,4l0.1,25.5c0,0.8,0.3,1.3,0.8,1.6c0.2,0.1,0.5,0.2,0.8,0.2c0.3,0,0.6-0.1,0.9-0.3
l35.8-20.7c1.3-0.7,2.3-2.5,2.3-4L-91.1,196.8z"/>
<linearGradient id="Fill-612_1_" gradientUnits="userSpaceOnUse" x1="389.5026" y1="739.7053" x2="389.117" y2="739.0089" gradientTransform="matrix(-35.3958 0 0 -45.873 13684.2344 34133.2852)">
<stop offset="0" style="stop-color:#FEFEFF"/>
<stop offset="1" style="stop-color:#F1F6FF"/>
</linearGradient>
<polygon id="Fill-612_2_" class="st22" points="-128.8,218.9 -93.5,198.3 -93.7,223.5 -128.9,244.1 "/>
<path id="Combined-Shape_3_" class="st18" d="M-94.4,193.3L-94.4,193.3c0.1,0,0.1,0,0.3,0c0,0,0,0,0.2,0.1c0,0,0.1,0,0.1,0.1
l0,0l1.8,1.5c0.4,0.2,0.7,0.7,0.7,1.4l0.1,26.3c0,1.4-1,3-2.1,3.7l-36.2,21.1c-0.6,0.4-1.2,0.4-1.6,0.1l0,0l-1.8-1.5
c-0.4-0.2-0.6-0.6-0.6-1.2l0-0.2l-0.1-26.3c0-0.1,0-0.3,0-0.5c0-0.1,0-0.1,0.1-0.3c0,0,0-0.1,0.1-0.3c0,0,0-0.1,0-0.2
c0,0,0-0.1,0.1-0.2c0-0.1,0.1-0.1,0.1-0.2c0-0.1,0-0.1,0.1-0.2c0,0,0,0,0.1-0.2c0,0,0-0.1,0.1-0.2c0-0.1,0.1-0.1,0.1-0.2
c0,0,0,0,0,0l0.1-0.1c0,0,0,0,0.1-0.1c0,0,0,0,0.1-0.1c0,0,0.1-0.1,0.2-0.2c0-0.1,0.1-0.1,0.2-0.2c0.1-0.1,0.2-0.2,0.4-0.3
c0.1-0.1,0.2-0.2,0.3-0.2l0,0l36.2-21.1c0.1-0.1,0.2-0.1,0.4-0.2c0.1,0,0.1,0,0.2-0.1c0,0,0.1,0,0.1,0
C-94.6,193.4-94.6,193.4-94.4,193.3C-94.4,193.3-94.4,193.3-94.4,193.3L-94.4,193.3z"/>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
<g>
<path id="矩形备份-2_3_" class="st10" d="M434,96.7H291.8c-0.3,0-0.5,0.2-0.7,0.4c-0.2,0.3-0.3,0.6-0.3,1.1v76
c0,0.4,0.1,0.8,0.3,1.1c0.2,0.3,0.4,0.4,0.7,0.4H434c0.3,0,0.5-0.2,0.7-0.4c0.2-0.3,0.3-0.6,0.3-1.1v-76c0-0.4-0.1-0.8-0.3-1.1
C434.4,96.9,434.2,96.7,434,96.7z"/>
<text transform="matrix(1 0 0 1 361.2133 140.4023)" class="st11 st12 st9">模型代码</text>
<g id="dms_1_">
<rect id="矩形_18_" x="301.3" y="108.8" class="st13" width="52.3" height="52.3"/>
<g>
<rect id="矩形_17_" x="301.3" y="108.8" class="st13" width="52.3" height="52.3"/>
<g transform="translate(1.000000, 8.000000)">
<g>
<g id="Group_1_">
<linearGradient id="Fill-19_1_" gradientUnits="userSpaceOnUse" x1="-341.2138" y1="733.8543" x2="-340.639" y2="733.6519" gradientTransform="matrix(59.0908 0 0 -36.0906 20474.3906 26604.4609)">
<stop offset="0" style="stop-color:#F9FBFF"/>
<stop offset="1" style="stop-color:#F1F6FF"/>
</linearGradient>
<polygon id="Fill-19_3_" class="st23" points="350.6,122.7 350.6,126.4 335.1,137.1 327.9,137.1 302.3,120.8 302.3,117.3
318.6,107.6 325,107.6 "/>
<polyline id="Fill-19_2_" class="st24" points="350.7,132.3 334.5,141.9 328,141.9 302,126.5 "/>
<linearGradient id="形状结合_1_" gradientUnits="userSpaceOnUse" x1="-340.5574" y1="733.4007" x2="-341.7036" y2="733.4007" gradientTransform="matrix(59.9948 0 0 -33.8879 20792.1914 24986.5918)">
<stop offset="0" style="stop-color:#CBD3E0"/>
<stop offset="0.1516" style="stop-color:#AEBACD"/>
<stop offset="0.2692" style="stop-color:#B9C0CD"/>
<stop offset="0.3557" style="stop-color:#B9C1CF"/>
<stop offset="0.3934" style="stop-color:#CAD1DC"/>
<stop offset="0.3987" style="stop-color:#C1C9D5"/>
<stop offset="0.4191" style="stop-color:#C3CBD7"/>
<stop offset="0.4339" style="stop-color:#C5CDD9"/>
<stop offset="0.445" style="stop-color:#C9D1DD"/>
<stop offset="0.464" style="stop-color:#D7DDE9"/>
<stop offset="0.4788" style="stop-color:#DDE4EE"/>
<stop offset="0.5501" style="stop-color:#D2D8E2"/>
<stop offset="0.6178" style="stop-color:#D8DFE9"/>
<stop offset="0.6932" style="stop-color:#DCE0E8"/>
<stop offset="1" style="stop-color:#EBEEF2"/>
</linearGradient>
<path id="形状结合_7_" class="st25" d="M351,136.2l-0.8,1.6l-15.6,9.3h-7.1l-25-14.7l-0.6-1.5l0-11.5l0,0.2
c0.1,0.4,0.3,0.8,0.5,1.1c0.4,0.5,8.7,5.4,24.6,15c0.5,0.3,1.2,0.5,2.2,0.6c1.4,0.2,2.5,0.2,2.7,0.2c0.1,0,0.6,0,1.3-0.1
c0.8-0.1,1.5-0.4,2.1-0.7c0.6-0.3,5.6-3.4,15-9.1c0.3-0.3,0.5-0.8,0.6-1.3l0,0V136.2z"/>
</g>
<path id="路径-29_1_" class="st24" d="M301.8,126.2l25.2,14.9c1,0.5,1.9,0.8,2.5,0.8s1.8,0,3.5,0c1.2-0.1,2.4-0.4,3.7-1.2
c1.3-0.7,6-3.7,14.3-9"/>
<path id="Path-9_1_" class="st26" d="M323.6,107.2h-3.9c-0.8,0-1.6,0.2-2.3,0.6l-13.7,8.1c-1.1,0.7-1.8,1.9-1.8,3.2v11.3
c0,1,0.5,2,1.4,2.5l23,13.6c1.1,0.6,2.3,1,3.5,1h3c1.3,0,2.5-0.4,3.6-1l12.8-7.8c1.1-0.7,1.8-1.9,1.8-3.2v-11.2
c0-1-0.5-2-1.4-2.5l-23.3-13.7C325.5,107.5,324.6,107.2,323.6,107.2z"/>
</g>
</g>
</g>
</g>
<linearGradient id="形状结合_2_" gradientUnits="userSpaceOnUse" x1="-328.252" y1="733.1469" x2="-327.6247" y2="732.8809" gradientTransform="matrix(27.5169 0 0 -15.6984 9349.4238 11636.0732)">
<stop offset="0" style="stop-color:#828BB3"/>
<stop offset="1" style="stop-color:#555A6F"/>
</linearGradient>
<path id="形状结合_5_" class="st27" d="M336.6,127.9c1.2,0.7,1.3,1.8,0,2.5l-8,4.6c-1.2,0.7-3.2,0.7-4.5,0l-8.2-4.7
c-1.2-0.7-1.3-1.8,0-2.5l8-4.6c1.2-0.7,3.2-0.7,4.5,0L336.6,127.9z M333.2,131l-10.2-5.8l-5.8,3.3c-0.5,0.3-0.5,0.8-0.1,1.1
l0.1,0.1l8.2,4.7c0.6,0.3,1.5,0.3,2,0L333.2,131z M327.9,129.6c0.5,0,0.9,0.2,0.9,0.5l0,1.8l0,0.1c-0.1,0.2-0.4,0.4-0.8,0.4l-3.2,0
l-0.1,0c-0.4,0-0.7-0.2-0.7-0.5l0-0.1c0.1-0.2,0.4-0.4,0.8-0.4l2.4,0l0-1.4l0-0.1C327.1,129.7,327.5,129.6,327.9,129.6z
M325.5,128.2c0,0.2-0.3,0.4-0.7,0.5l-0.1,0l-2.4,0l0,1.4c0,0.2-0.3,0.4-0.7,0.5l-0.1,0c-0.4,0-0.8-0.2-0.9-0.4l0-0.1l0-1.8
c0-0.2,0.3-0.4,0.7-0.5l0.1,0l3.2,0C325.1,127.7,325.5,127.9,325.5,128.2z M335.4,128.6l-8.2-4.7c-0.6-0.3-1.5-0.3-2,0l-1,0.6
l10.2,5.8l1-0.6C335.9,129.5,336,129,335.4,128.6L335.4,128.6z"/>
</g>
<g>
<path id="矩形备份-2_6_" class="st10" d="M434,273.2H291.8c-0.3,0-0.5,0.2-0.7,0.4c-0.2,0.3-0.3,0.6-0.3,1.1v76
c0,0.4,0.1,0.8,0.3,1.1c0.2,0.3,0.4,0.4,0.7,0.4H434c0.3,0,0.5-0.2,0.7-0.4c0.2-0.3,0.3-0.6,0.3-1.1v-76c0-0.4-0.1-0.8-0.3-1.1
C434.4,273.4,434.2,273.2,434,273.2z"/>
<text transform="matrix(1 0 0 1 361.2133 316.8983)" class="st11 st12 st9">上传数据</text>
<g id="编组-7_1_" transform="translate(516.000000, 64.000000)">
<rect id="矩形_19_" x="-217.5" y="219.8" class="st13" width="57.8" height="57.8"/>
<g id="编组-2_1_" transform="translate(10.000000, 2.000000)">
<g id="智能配送_1_">
<g id="分组-5_1_">
<g id="Group-9-Copy_1_" transform="translate(0.000000, 0.431581)">
<g id="Group-6_1_">
<linearGradient id="Oval-2_1_" gradientUnits="userSpaceOnUse" x1="-873.7617" y1="659.7869" x2="-873.203" y2="659.5386" gradientTransform="matrix(43.1523 0 0 -24.5174 37494.2148 16404.498)">
<stop offset="0" style="stop-color:#FEFEFF"/>
<stop offset="1" style="stop-color:#F1F6FF"/>
</linearGradient>
<ellipse id="Oval-2_5_" class="st28" cx="-198.4" cy="231.3" rx="19.5" ry="11.1"/>
<linearGradient id="Combined-Shape_1_" gradientUnits="userSpaceOnUse" x1="-872.9349" y1="670.6534" x2="-873.8142" y2="670.6534" gradientTransform="matrix(43.1523 0 0 -47.9385 37494.2109 32401.2207)">
<stop offset="0" style="stop-color:#CBD3E0"/>
<stop offset="0.2354" style="stop-color:#90A1BD"/>
<stop offset="0.4664" style="stop-color:#DCE0E8"/>
<stop offset="0.6916" style="stop-color:#CAD1DC"/>
<stop offset="1" style="stop-color:#EBEEF2"/>
</linearGradient>
<path id="Combined-Shape_5_" class="st29" d="M-179,229.5L-179,229.5l0,32.7h0c-0.6,5.9-9.1,10.6-19.4,10.6
s-18.9-4.7-19.4-10.6h0v-32.7h0c0,0.2,0,0.4,0,0.7c0,6.2,8.7,11.3,19.5,11.3s19.5-5.1,19.5-11.3
C-179,229.9-179,229.7-179,229.5z"/>
<path id="Oval-2_4_" class="st30" d="M-217.4,252.7c0,6,8.5,10.8,19,10.8s19-4.8,19-10.8"/>
<path id="Combined-Shape_4_" class="st26" d="M-178.6,229.6h0.1v32.8h-0.1c-1.1,5.6-9.6,9.9-19.8,9.9s-18.7-4.2-19.8-9.9
h-0.1v-32.8h0.1c1.1-5.6,9.6-9.9,19.8-9.9S-179.7,224-178.6,229.6z"/>
<polygon id="Rectangle_7_" class="st31" points="-214.8,253.2 -213.3,254.4 -213.3,257.3 -214.8,256.1 "/>
<polygon id="Rectangle_6_" class="st32" points="-211.8,255.3 -210.2,256.5 -210.2,259.4 -211.8,258.2 "/>
<path id="Oval-2_3_" class="st30" d="M-217.4,241.9c0,6,8.5,10.8,19,10.8s19-4.8,19-10.8"/>
<polygon id="Rectangle_5_" class="st31" points="-214.8,242.3 -213.3,243.6 -213.3,246.5 -214.8,245.2 "/>
<polygon id="Rectangle_4_" class="st32" points="-211.8,244.4 -210.2,245.7 -210.2,248.5 -211.8,247.3 "/>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
<g>
<g class="st4">
<path class="st5" d="M433.7,135.5h67.2c12.2,0,22.2,10,22.2,22.2V183"/>
<g>
<polygon class="st6" points="513.3,175 515.1,173.4 523.1,182.1 531.2,173.4 532.9,175 523.1,185.6 "/>
</g>
</g>
</g>
<g>
<g class="st4">
<path class="st5" d="M433.7,314.6h67.2c12.2,0,22.2-10,22.2-22.2v-25.2"/>
<g>
<polygon class="st6" points="532.9,275.1 531.2,276.8 523.1,268.1 515.1,276.8 513.3,275.1 523.1,264.6 "/>
</g>
</g>
</g>
<g>
<path id="矩形备份-2_8_" class="st10" d="M589.2,185.6H447c-0.3,0-0.5,0.2-0.7,0.4c-0.2,0.3-0.3,0.6-0.3,1.1v76
c0,0.4,0.1,0.8,0.3,1.1c0.2,0.3,0.4,0.4,0.7,0.4h142.2c0.3,0,0.5-0.2,0.7-0.4c0.2-0.3,0.3-0.6,0.3-1.1v-76c0-0.4-0.1-0.8-0.3-1.1
C589.7,185.7,589.4,185.6,589.2,185.6z"/>
<text transform="matrix(1 0 0 1 523.1293 229.2355)" class="st11 st12 st9">创建任务</text>
<g id="电脑_4_" transform="translate(33.000000, 32.000000) scale(-1, 1) translate(-33.000000, -32.000000) translate(1.000000, 0.000000)">
<g>
<rect id="矩形_26_" x="-453.5" y="256.9" class="st13" width="64" height="-64"/>
<g id="电脑复制_2_" transform="translate(11.000000, 2.000000)">
<g id="编组_6_" transform="translate(5.371982, 40.317507)">
<polygon id="矩形_25_" class="st14" points="-440.4,209.2 -422.5,198.3 -422.5,201.1 -440.4,212 "/>
<polygon id="矩形_20_" class="st15" points="-431.8,192.9 -422.5,198.3 -440.4,209.2 -450,203.5 "/>
<polygon id="矩形_13_" class="st16" points="-453,201.8 -440.4,209.2 -440.4,212.1 -453,204.7 "/>
</g>
<g id="电脑-2_2_">
<g id="电脑_5_">
<g id="Group-616_2_" transform="translate(2.559524, 37.948718)">
<g id="编组_5_" transform="translate(6.786976, 7.749090)">
<path id="形状结合_6_" class="st17" d="M-444.4,203.8l17.9-10.9 M-444.4,203.8v2.6 M-444.4,203.8l-8.7-5.1"/>
</g>
<polygon id="路径-6_2_" class="st18" points="-437.6,214.5 -453.1,205.2 -432.3,193.3 -419.7,200.5 -419.7,203.6
"/>
</g>
<g id="Group-616-Copy_2_" transform="translate(16.380952, 37.948718)">
<polygon id="Fill-610_2_" class="st16" points="-451.6,198.9 -451.6,206.7 -453.1,205.8 -453.1,198 "/>
<polygon id="Fill-612_5_" class="st19" points="-451.6,198.9 -441,192.9 -441,200.5 -451.6,206.7 "/>
<polyline id="Path-3_2_" class="st18" points="-453.1,201.4 -453.1,205.8 -451.6,206.7 -441,200.5 -441,194.4 -451.6,200.7
-451.6,206.7 "/>
</g>
<g id="Group-2_2_">
<path id="Fill-8_3_" class="st20" d="M-411.9,194.8c0.1,0,0.1,0,0.2-0.1c0,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0
c0,0,0,0,0.1,0c0,0,0.1,0,0.1,0c0,0,0,0,0,0c0.1,0,0.1,0,0.2,0c0,0,0,0,0,0c0,0,0.1,0,0.1,0c0,0,0,0,0,0c0,0,0.1,0,0.1,0.1
l-2.7-1.6c0,0,0,0,0,0c0,0-0.1,0-0.1-0.1c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0-0.1,0c0,0,0,0-0.1,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0-0.1,0-0.1,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0-0.1,0-0.1,0c0,0,0,0,0,0c0,0,0,0-0.1,0c0,0,0,0-0.1,0c0,0,0,0-0.1,0
c0,0-0.1,0-0.1,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0-0.1,0-0.2,0.1c0,0,0,0-0.1,0c0,0,0,0,0,0c-0.1,0-0.2,0.1-0.3,0.1l-36.2,21.1
c-0.1,0.1-0.2,0.1-0.3,0.2c0,0,0,0-0.1,0c-0.1,0.1-0.2,0.2-0.3,0.3c0,0,0,0,0,0c0,0,0,0,0,0c0,0-0.1,0.1-0.1,0.2c0,0,0,0,0,0
c0,0,0,0,0,0c0,0-0.1,0.1-0.1,0.1c0,0,0,0-0.1,0.1c0,0,0,0,0,0.1c0,0,0,0.1-0.1,0.1c0,0,0,0,0,0.1c0,0,0,0.1-0.1,0.1
c0,0,0,0,0,0.1c0,0,0,0,0,0c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0.1-0.1,0.1c0,0,0,0,0,0.1c0,0,0,0,0,0.1
c0,0,0,0,0,0.1c0,0.1,0,0.1-0.1,0.2c0,0,0,0,0,0c0,0,0,0,0,0c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0c0,0,0,0,0,0.1
c0,0,0,0.1,0,0.1c0,0,0,0.1,0,0.1c0,0,0,0.1,0,0.1c0,0,0,0,0,0.1c0,0,0,0.1,0,0.1c0,0,0,0.1,0,0.1c0,0,0,0,0,0
c0,0,0,0.1,0,0.1c0,0.1,0,0.1,0,0.2c0,0,0,0,0,0c0,0,0,0,0,0c0,0.1,0,0.3,0,0.4l0.1,26.3c0,0.7,0.2,1.2,0.6,1.4l2.7,1.6
c-0.4-0.2-0.6-0.7-0.6-1.4l-0.1-26.3c0-0.1,0-0.3,0-0.4c0,0,0-0.1,0-0.1c0-0.1,0-0.1,0-0.2c0,0,0-0.1,0-0.1c0,0,0-0.1,0-0.1
c0-0.1,0-0.1,0-0.2c0,0,0-0.1,0-0.1c0-0.1,0-0.1,0.1-0.2c0,0,0,0,0-0.1c0-0.1,0.1-0.2,0.1-0.2c0,0,0,0,0,0
c0-0.1,0.1-0.1,0.1-0.2c0,0,0,0,0-0.1c0-0.1,0.1-0.1,0.1-0.2c0,0,0,0,0,0c0-0.1,0.1-0.1,0.1-0.2c0,0,0,0,0-0.1
c0-0.1,0.1-0.1,0.1-0.2c0,0,0-0.1,0.1-0.1c0,0,0.1-0.1,0.1-0.1c0,0,0.1-0.1,0.1-0.1c0,0,0.1-0.1,0.1-0.1
c0-0.1,0.1-0.1,0.1-0.2c0,0,0,0,0.1-0.1c0.1-0.1,0.2-0.2,0.3-0.3c0,0,0,0,0.1,0c0.1-0.1,0.2-0.2,0.3-0.2l36.2-21.1
C-412.2,194.9-412.1,194.9-411.9,194.8C-412,194.9-412,194.8-411.9,194.8"/>
<path id="Fill-6_4_" class="st21" d="M-410.6,196.6c0-0.8-0.3-1.3-0.8-1.6c-0.2-0.1-0.5-0.2-0.8-0.2c-0.3,0-0.6,0.1-0.9,0.3
l-35.8,21.1c-1.3,0.7-2.3,2.5-2.3,4l0.1,25.5c0,0.8,0.3,1.3,0.8,1.6c0.2,0.1,0.5,0.2,0.8,0.2c0.3,0,0.6-0.1,0.9-0.3
l35.8-20.7c1.3-0.7,2.3-2.5,2.3-4L-410.6,196.6z"/>
<linearGradient id="Fill-612_6_" gradientUnits="userSpaceOnUse" x1="398.5316" y1="739.7098" x2="398.146" y2="739.0134" gradientTransform="matrix(-35.3958 0 0 -45.873 13684.2344 34133.2852)">
<stop offset="0" style="stop-color:#FEFEFF"/>
<stop offset="1" style="stop-color:#F1F6FF"/>
</linearGradient>
<polygon id="Fill-612_4_" class="st33" points="-448.4,218.7 -413.1,198.1 -413.3,223.3 -448.5,243.9 "/>
<path id="Combined-Shape_6_" class="st18" d="M-414,193.1L-414,193.1c0.1,0,0.1,0,0.3,0c0,0,0,0,0.2,0.1c0,0,0.1,0,0.1,0.1
l0,0l1.8,1.5c0.4,0.2,0.7,0.7,0.7,1.4l0.1,26.3c0,1.4-1,3-2.1,3.7l-36.2,21.1c-0.6,0.4-1.2,0.4-1.6,0.1l0,0l-1.8-1.5
c-0.4-0.2-0.6-0.6-0.6-1.2l0-0.2l-0.1-26.3c0-0.1,0-0.3,0-0.5c0-0.1,0-0.1,0.1-0.3c0,0,0-0.1,0.1-0.3c0,0,0-0.1,0-0.2
c0,0,0-0.1,0.1-0.2c0-0.1,0.1-0.1,0.1-0.2c0-0.1,0-0.1,0.1-0.2c0,0,0,0,0.1-0.2c0,0,0-0.1,0.1-0.2c0-0.1,0.1-0.1,0.1-0.2
c0,0,0,0,0,0l0.1-0.1c0,0,0,0,0.1-0.1c0,0,0,0,0.1-0.1c0,0,0.1-0.1,0.2-0.2c0-0.1,0.1-0.1,0.2-0.2c0.1-0.1,0.2-0.2,0.4-0.3
c0.1-0.1,0.2-0.2,0.3-0.2l0,0l36.2-21.1c0.1-0.1,0.2-0.1,0.4-0.2c0.1,0,0.1,0,0.2-0.1c0,0,0.1,0,0.1,0
C-414.2,193.1-414.2,193.1-414,193.1C-414,193.1-414,193.1-414,193.1L-414,193.1z"/>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
<g>
<path id="矩形备份-2_9_" class="st34" d="M790.4,185.6H648.3c-0.3,0-0.5,0.2-0.7,0.4c-0.2,0.3-0.3,0.6-0.3,1.1v76
c0,0.4,0.1,0.8,0.3,1.1c0.2,0.3,0.4,0.4,0.7,0.4h142.2c0.3,0,0.5-0.2,0.7-0.4c0.2-0.3,0.3-0.6,0.3-1.1v-76c0-0.4-0.1-0.8-0.3-1.1
C790.9,185.7,790.7,185.6,790.4,185.6z"/>
<text transform="matrix(1 0 0 1 724.3945 229.2355)" class="st11 st12 st9">调试环境</text>
<g id="云竖_2_" transform="translate(516.000000, 320.000000)">
<g>
<rect id="矩形_21_" x="147.6" y="-121" class="st13" width="48.8" height="48.8"/>
<g id="编组-6_2_" transform="translate(2.000000, 6.000000)">
<path id="Path-15_5_" class="st35" d="M168.1-83.8c1.7,0.9,3.7,2.1,6.2,0.5c2.4-1.6,15.5-8.8,16.9-9.7c1.9-0.9,3.6-8.5-4.3-15.5
c-0.4-5-6.8-16.2-14-13.6c-2,1.1-7.3,4.3-16.1,9.3c-0.7,0.4-1.3,0.7-1.8,1c-0.2,0.1-0.8,0.6-1.2,1.2c-0.5,0.4-1.7,1.1-3.5,2.3
c-2,0.8-2.9,2.2-2.9,4.4c0,3.5,1.5,7.7,5.5,10.8C156.8-90.4,166.4-84.7,168.1-83.8z"/>
<linearGradient id="Fill-1_3_" gradientUnits="userSpaceOnUse" x1="-850.8792" y1="407.687" x2="-851.0427" y2="407.7502" gradientTransform="matrix(27.8283 0 0 -13.8442 23834.3965 5530.2881)">
<stop offset="0" style="stop-color:#B2B7BF"/>
<stop offset="0.1064" style="stop-color:#E2EBFD"/>
<stop offset="0.2734" style="stop-color:#F8FAFF"/>
<stop offset="0.4104" style="stop-color:#D8E0EE"/>
<stop offset="1" style="stop-color:#F1F6FF"/>
</linearGradient>
<path id="Fill-1_2_" class="st36" d="M151-108.5c0.3,0,0.7,0,1,0.1c0,0,0,0,0,0c0.4,0.1,0.7,0.2,1.1,0.4l17.2-10
c-0.1,0-0.2-0.1-0.2-0.1c-0.1,0-0.2-0.1-0.3-0.1c-0.1,0-0.2-0.1-0.3-0.1c-0.1,0-0.2-0.1-0.3-0.1c0,0,0,0-0.1,0c0,0,0,0,0,0
c-0.1,0-0.1,0-0.2,0c-0.1,0-0.2,0-0.3,0c-0.1,0-0.2,0-0.3,0c-0.1,0-0.2,0-0.3,0c0,0,0,0,0,0c0,0,0,0,0,0c-0.1,0-0.2,0-0.4,0
c-0.1,0-0.3,0-0.4,0.1c0,0-0.1,0-0.1,0c0,0-0.1,0-0.1,0c-0.1,0-0.2,0-0.2,0.1c-0.2,0.1-0.4,0.2-0.6,0.3l-17.2,10
c0.2-0.1,0.5-0.2,0.8-0.3c0,0,0.1,0,0.1,0C150.3-108.4,150.6-108.5,151-108.5C151-108.5,151-108.5,151-108.5z"/>
<linearGradient id="Fill-3_3_" gradientUnits="userSpaceOnUse" x1="-852.3721" y1="416.4146" x2="-852.6138" y2="416.8685" gradientTransform="matrix(30.367 0 0 -33.6775 26067.5156 13933.0166)">
<stop offset="0" style="stop-color:#C0CBDC"/>
<stop offset="1.654118e-02" style="stop-color:#B3C0D4"/>
<stop offset="0.1143" style="stop-color:#A9B8D1"/>
<stop offset="0.1737" style="stop-color:#BEC9DB"/>
<stop offset="0.3293" style="stop-color:#E0E5F0"/>
<stop offset="0.5383" style="stop-color:#D9DEE6"/>
<stop offset="0.5471" style="stop-color:#D6DBE4"/>
<stop offset="0.6916" style="stop-color:#CAD1DC"/>
<stop offset="1" style="stop-color:#EBEEF2"/>
</linearGradient>
<path id="Fill-3_2_" class="st37" d="M192.9-97.7c0-0.1,0-0.2,0-0.3c0-0.1,0-0.2,0-0.3c0-0.1,0-0.1,0-0.2c0,0,0,0,0,0
c0,0,0-0.1,0-0.1c0-0.1,0-0.2-0.1-0.3c0-0.1,0-0.2-0.1-0.4c0-0.1-0.1-0.2-0.1-0.4c0-0.1-0.1-0.2-0.1-0.4c0,0,0,0,0,0
c0,0,0,0,0,0c0-0.1-0.1-0.2-0.1-0.3c0-0.1-0.1-0.2-0.1-0.4c0-0.1-0.1-0.2-0.1-0.3c0-0.1-0.1-0.2-0.1-0.3c0-0.1-0.1-0.1-0.1-0.2
c0,0,0,0,0,0l0-0.1c0-0.1-0.1-0.2-0.1-0.3c0-0.1-0.1-0.2-0.2-0.3c-0.1-0.1-0.1-0.2-0.2-0.4c-0.1-0.1-0.1-0.3-0.2-0.4
c0,0,0,0,0,0c0,0,0,0,0,0c-0.1-0.2-0.2-0.4-0.3-0.5c-0.2-0.3-0.4-0.6-0.5-0.9c0,0,0,0,0,0l0,0c-0.1-0.2-0.2-0.4-0.4-0.5
c-0.1-0.1-0.2-0.3-0.3-0.4c-0.1-0.1-0.2-0.2-0.3-0.3c0,0,0,0-0.1-0.1c0,0,0,0,0,0c-0.1-0.1-0.1-0.1-0.2-0.2
c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.1-0.2-0.2-0.3-0.3c0,0-0.1-0.1-0.1-0.1c0,0,0,0,0,0
c-0.1-0.1-0.1-0.1-0.2-0.2c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.1-0.2-0.2-0.3-0.2c-0.1-0.1-0.2-0.2-0.3-0.2c0,0-0.1-0.1-0.1-0.1
l-17.2,10c0.4,0.3,0.8,0.6,1.2,1c0,0,0,0,0,0c0.4,0.4,0.8,0.8,1.1,1.2c0,0,0,0,0,0c0.3,0.4,0.7,0.9,1,1.3c0,0,0,0,0,0
c0.3,0.5,0.6,0.9,0.9,1.4c0,0,0,0,0,0c0.3,0.5,0.5,1,0.7,1.5c0,0,0,0,0,0c0.2,0.5,0.4,1,0.5,1.6c0,0,0,0,0,0
c0.1,0.5,0.3,1,0.3,1.6c0,0,0,0,0,0c0.1,0.5,0.1,1,0.1,1.5c0,0.3,0,0.5,0,0.7c0,0,0,0,0,0.1c0,0.2-0.1,0.4-0.1,0.6
c0,0,0,0.1,0,0.1c0,0.2-0.1,0.4-0.1,0.6c0,0,0,0.1,0,0.1c-0.1,0.2-0.1,0.3-0.2,0.5c0,0,0,0,0,0c-0.1,0.2-0.2,0.3-0.3,0.5
c-0.1,0.2-0.3,0.4-0.5,0.6c0,0-0.1,0.1-0.1,0.1c-0.2,0.2-0.4,0.3-0.6,0.4l17.2-10c0.2-0.1,0.4-0.3,0.6-0.4c0,0,0.1-0.1,0.1-0.1
c0.2-0.2,0.3-0.4,0.5-0.6c0,0,0,0,0,0c0.1-0.1,0.2-0.3,0.3-0.5c0,0,0,0,0,0c0,0,0,0,0,0c0-0.1,0.1-0.2,0.1-0.3
c0-0.1,0-0.1,0.1-0.2c0,0,0-0.1,0-0.1c0,0,0-0.1,0-0.1c0-0.1,0.1-0.2,0.1-0.3c0,0,0-0.1,0-0.1c0,0,0-0.1,0-0.1c0,0,0-0.1,0-0.1
c0-0.1,0-0.2,0-0.3c0-0.1,0-0.1,0-0.2c0,0,0,0,0-0.1c0,0,0-0.1,0-0.1c0-0.1,0-0.2,0-0.3c0-0.1,0-0.2,0-0.3c0,0,0,0,0,0
c0-0.1,0-0.2,0-0.3C192.9-97.5,192.9-97.6,192.9-97.7z"/>
<linearGradient id="Fill-8_1_" gradientUnits="userSpaceOnUse" x1="-856.3117" y1="415.72" x2="-856.7656" y2="416.3181" gradientTransform="matrix(41.218 0 0 -31.5976 35478.3477 13034.8008)">
<stop offset="0" style="stop-color:#CBD3E0"/>
<stop offset="0.2302" style="stop-color:#D7DCE6"/>
<stop offset="0.3076" style="stop-color:#C2CBDA"/>
<stop offset="0.4132" style="stop-color:#DCE0E8"/>
<stop offset="0.5076" style="stop-color:#EBEDF1"/>
<stop offset="0.5317" style="stop-color:#F2F3F6"/>
<stop offset="0.6002" style="stop-color:#FDFBFB"/>
<stop offset="0.6687" style="stop-color:#F8F9FA"/>
<stop offset="0.7321" style="stop-color:#D6DBE1"/>
<stop offset="1" style="stop-color:#EBEEF2"/>
</linearGradient>
<path id="Fill-8_5_" class="st38" d="M163.7-109.7C163.7-109.7,163.7-109.7,163.7-109.7c0.2,0.2,0.5,0.5,0.7,0.8c0,0,0,0,0,0
c0.2,0.2,0.4,0.5,0.6,0.7c0,0,0,0,0,0c0.2,0.2,0.4,0.5,0.6,0.7c0,0,0,0,0,0c0.2,0.2,0.3,0.4,0.5,0.7c0.1,0.1,0.2,0.2,0.2,0.3
c0.1,0.1,0.2,0.3,0.3,0.4c0.2,0.2,0.3,0.5,0.5,0.7c0.1,0.1,0.1,0.2,0.2,0.3c0,0.1,0.1,0.2,0.1,0.2c0.1,0.2,0.2,0.5,0.4,0.7
c0,0,0,0.1,0,0.1c0.1,0.3,0.3,0.6,0.4,0.9c0,0,0,0,0,0c0.1,0.3,0.3,0.6,0.4,0.9c0,0,0,0,0,0.1c0.1,0.3,0.2,0.6,0.3,0.9l0,0.1
c0.1,0.3,0.2,0.6,0.2,0.8c0,0,0,0.1,0,0.1c0.1,0.3,0.1,0.6,0.2,0.9c0,0,0,0.1,0,0.1c0.1,0.3,0.1,0.6,0.1,0.9l17.2-10
c0-0.1,0-0.3-0.1-0.4c0-0.1,0-0.3-0.1-0.4c0,0,0-0.1,0-0.1c0,0,0-0.1,0-0.1c0-0.1,0-0.2-0.1-0.3c0-0.1-0.1-0.3-0.1-0.4
c0,0,0-0.1,0-0.1c0,0,0-0.1,0-0.1c0-0.1,0-0.1-0.1-0.2c0-0.1-0.1-0.3-0.1-0.4c0-0.1,0-0.1-0.1-0.2c0,0,0-0.1,0-0.1
c0-0.1,0-0.1-0.1-0.2c0-0.1-0.1-0.3-0.1-0.4c0-0.1-0.1-0.2-0.1-0.3c0,0,0,0,0-0.1c0,0,0-0.1,0-0.1c-0.1-0.1-0.1-0.3-0.2-0.4
c-0.1-0.1-0.1-0.3-0.2-0.4c0,0,0,0,0,0c0,0,0,0,0,0c-0.1-0.1-0.1-0.2-0.2-0.4c-0.1-0.1-0.1-0.3-0.2-0.4c0,0,0,0,0-0.1
c0,0,0-0.1,0-0.1c-0.1-0.1-0.1-0.2-0.2-0.3c-0.1-0.1-0.1-0.2-0.2-0.4c0-0.1-0.1-0.2-0.1-0.2c0,0,0-0.1-0.1-0.1
c0-0.1-0.1-0.1-0.1-0.2c-0.2-0.3-0.3-0.5-0.5-0.7c0-0.1-0.1-0.1-0.1-0.2c-0.1-0.1-0.1-0.2-0.2-0.3c-0.1-0.1-0.2-0.2-0.2-0.3
c0-0.1-0.1-0.1-0.1-0.2c-0.1-0.2-0.2-0.3-0.4-0.5c0,0,0,0,0,0c0,0,0,0,0,0c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.1-0.2-0.3-0.3-0.4
c0,0,0,0,0,0c0,0,0,0,0,0c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.1-0.2-0.2-0.3-0.4l0,0c0,0,0,0,0,0c-0.1-0.1-0.2-0.2-0.3-0.3
c-0.1-0.1-0.2-0.2-0.4-0.3c0,0,0,0,0,0l0,0c-0.1-0.1-0.2-0.2-0.4-0.3c-0.1-0.1-0.2-0.2-0.4-0.3c0,0,0,0,0,0
c-0.1-0.1-0.2-0.2-0.4-0.3c-0.1-0.1-0.2-0.2-0.4-0.3c0,0,0,0,0,0l0,0c-0.1-0.1-0.2-0.1-0.3-0.2c-0.1-0.1-0.2-0.1-0.4-0.2
c0,0-0.1,0-0.1,0c-0.1-0.1-0.2-0.1-0.3-0.1c-0.1-0.1-0.2-0.1-0.3-0.2c-0.1,0-0.1-0.1-0.2-0.1c0,0,0,0-0.1,0c0,0,0,0-0.1,0
c-0.1-0.1-0.2-0.1-0.3-0.1c-0.1,0-0.2-0.1-0.3-0.1c0,0,0,0-0.1,0c0,0,0,0-0.1,0c-0.1,0-0.1-0.1-0.2-0.1c-0.1,0-0.2-0.1-0.3-0.1
c-0.1,0-0.1,0-0.2,0c0,0-0.1,0-0.1,0c0,0-0.1,0-0.1,0c-0.1,0-0.2,0-0.4-0.1c-0.1,0-0.2,0-0.2,0c0,0-0.1,0-0.1,0c0,0,0,0-0.1,0
c-0.1,0-0.3,0-0.4,0c-0.1,0-0.1,0-0.2,0c0,0-0.1,0-0.1,0c0,0-0.1,0-0.1,0c-0.2,0-0.3,0-0.5,0.1c0,0,0,0,0,0c0,0-0.1,0-0.1,0
c-0.2,0-0.3,0.1-0.4,0.1c0,0,0,0,0,0c-0.2,0.1-0.4,0.2-0.6,0.3l-17.2,9.9c0.2-0.1,0.4-0.2,0.6-0.3c0.2-0.1,0.3-0.1,0.5-0.1
c0,0,0.1,0,0.1,0c0.2,0,0.4-0.1,0.6-0.1c0,0,0.1,0,0.1,0c0.2,0,0.4,0,0.6,0c0,0,0.1,0,0.1,0c0.2,0,0.5,0.1,0.7,0.1
c0,0,0.1,0,0.1,0c0.2,0.1,0.5,0.1,0.7,0.2c0,0,0,0,0.1,0c0.3,0.1,0.5,0.2,0.8,0.3c0,0,0,0,0.1,0c0.3,0.1,0.6,0.3,0.8,0.4
c0.3,0.1,0.5,0.3,0.8,0.5c0,0,0,0,0,0c0.3,0.2,0.5,0.4,0.7,0.6C163.2-110.1,163.4-109.9,163.7-109.7z"/>
<linearGradient id="Fill-5_1_" gradientUnits="userSpaceOnUse" x1="-855.4323" y1="417.6272" x2="-855.1285" y2="417.117" gradientTransform="matrix(37.419 0 0 -39.8938 32166.1191 16556.9258)">
<stop offset="0" style="stop-color:#FCFDFF"/>
<stop offset="1" style="stop-color:#EFF1F6"/>
</linearGradient>
<path id="Fill-5_5_" class="st39" d="M169.7-98.3c3.4,2.4,6,7.3,6,11.3c0,4.3-3.1,6.1-6.8,3.9l-15-8.7
c-3.8-2.2-6.8-7.5-6.8-11.8c0-4,2.6-5.8,6-4.3c0.7-4.2,2.9-6.2,8.4-3.4C166.2-108.3,169.1-103.3,169.7-98.3z"/>
<path id="Fill-5_4_" class="st17" d="M164.4-117.4c1.6-1.1,4-0.9,6.6,0.6c4.2,2.4,7.6,8,8.3,12.9c3.4,2.4,6,7.3,6,11.3
c0,2.1-0.6,3.6-1.8,4.3"/>
<path id="Path-15_4_" class="st40" d="M172.7-122.3c-2,1.1-7.3,4.2-16.1,9.3c-0.8,0.4-1.4,0.7-1.8,1.1c-0.2,0.1-0.8,0.6-1.3,1.3
c-0.5,0.4-1.7,1.1-3.4,2.2c-1,0.4-1.8,1-2.3,1.8c-0.5,0.8-0.8,1.8-0.8,2.9c0,3.6,1.6,7.9,5.6,11.2c4,2.6,13.6,8.3,15.5,9.3
c1,0.6,2.2,1.2,3.4,1.3c0.9,0.1,1.9-0.1,3-0.9c1.5-1,6.8-3.9,11.1-6.4c2.8-1.6,5.2-2.9,5.8-3.3c0.7-0.3,1.4-1.5,1.7-3.2
c0.2-1.3,0.2-2.9-0.3-4.6c-0.7-2.5-2.3-5.4-5.4-8.2c-0.3-3-2.6-7.9-5.9-11.1c-1.3-1.3-2.8-2.2-4.3-2.7
C175.7-122.9,174.3-122.9,172.7-122.3z"/>
</g>
</g>
</g>
</g>
<g>
<g class="st4">
<line class="st5" x1="590.1" y1="226" x2="644.7" y2="226"/>
<g>
<polygon class="st6" points="636.8,235.8 635.1,234 643.8,226 635.1,217.9 636.8,216.2 647.3,226 "/>
</g>
</g>
</g>
<text transform="matrix(1 0 0 1 603.4565 209.8904)" class="st7 st8 st9">推送</text>
<g>
<path id="矩形备份-2_11_" class="st10" d="M978.3,185.7H849.4c-0.2,0-0.4,0.2-0.6,0.4c-0.2,0.3-0.2,0.6-0.2,1.1v76
c0,0.4,0.1,0.8,0.2,1.1c0.2,0.3,0.4,0.4,0.6,0.4h128.9c0.2,0,0.4-0.2,0.6-0.4c0.2-0.3,0.2-0.6,0.2-1.1v-76c0-0.4-0.1-0.8-0.2-1.1
C978.7,185.8,978.5,185.7,978.3,185.7z"/>
<text transform="matrix(1 0 0 1 925.62 229.3147)" class="st11 st12 st9">模型库</text>
<g>
<g id="database_3_">
<g>
<rect id="矩形_22_" x="859.9" y="198.5" class="st13" width="55.8" height="55.8"/>
<g transform="translate(2.000000, 8.000000)">
<linearGradient id="路径-25_1_" gradientUnits="userSpaceOnUse" x1="-340.618" y1="731.4043" x2="-341.5138" y2="731.4182" gradientTransform="matrix(60.476 0 0 -36.6097 21513.0371 27000.8066)">
<stop offset="0" style="stop-color:#CBD3E0"/>
<stop offset="9.337495e-02" style="stop-color:#ACB8CD"/>
<stop offset="0.1911" style="stop-color:#97A7C1"/>
<stop offset="0.3147" style="stop-color:#AAB4C4"/>
<stop offset="0.3631" style="stop-color:#BBC4D5"/>
<stop offset="0.3762" style="stop-color:#C2CBD9"/>
<stop offset="0.4187" style="stop-color:#E2E5EC"/>
<stop offset="0.6689" style="stop-color:#DBDFE7"/>
<stop offset="0.7262" style="stop-color:#D8DDE5"/>
<stop offset="0.8284" style="stop-color:#CDD4DE"/>
<stop offset="0.8558" style="stop-color:#D3D9E3"/>
<stop offset="0.8813" style="stop-color:#F6F6F7"/>
<stop offset="0.9502" style="stop-color:#DBE0E8"/>
<stop offset="1" style="stop-color:#EBEEF2"/>
</linearGradient>
<polygon id="路径-25_3_" class="st41" points="910.6,214 904.4,218.9 894.8,224.7 890.9,225.8 869.8,222.5 865.9,217.8
863.5,211.3 861.4,208 860,209.4 859.6,213.7 859.6,220.1 865.9,233.5 867.2,235.4 868.8,236.2 892.8,239.9 911.3,229.1
912.2,226.9 912.4,217.1 "/>
<polygon id="Fill-6_9_" class="st42" points="889.1,235.5 889.1,237.6 887.3,237.4 887.3,235.3 "/>
<polygon id="Fill-6-Copy_7_" class="st43" points="886.1,235.1 886.1,237.2 884.3,236.9 884.3,234.8 "/>
<polygon id="Fill-6-Copy-2_7_" class="st42" points="883.1,234.6 883.1,236.7 881.3,236.5 881.3,234.4 "/>
<path id="路径-26_3_" class="st44" d="M859.6,215.3l6.4,12.9c0.4,0.5,1.2,1,2.4,1.4s8.7,1.8,22.3,4c1.4,0.2,2.6,0,3.8-0.4
c1.3-0.5,3.2-1.6,4.7-2.5c3.4-2.1,7.8-4.8,13.2-8.2"/>
<linearGradient id="路径-13_1_" gradientUnits="userSpaceOnUse" x1="-340.6088" y1="730.8391" x2="-340.151" y2="730.7928" gradientTransform="matrix(57.2286 0 0 -34.5361 20368.2871 25452.4648)">
<stop offset="0" style="stop-color:#FEFEFF"/>
<stop offset="1" style="stop-color:#F1F6FF"/>
</linearGradient>
<path id="路径-13_7_" class="st45" d="M877.6,198.3l-14.4,8.4c-2,1.2-2.7,3.7-1.7,5.7l4.8,9.6c0.6,1.3,1.8,2.1,3.2,2.3
l22,3.4c1,0.2,2,0,2.9-0.6l14.4-8.5c1.9-1.1,2.7-3.5,1.8-5.6l-4.3-9.4c-0.6-1.3-1.8-2.3-3.3-2.5l-22.5-3.6
C879.5,197.6,878.5,197.8,877.6,198.3z"/>
<path id="路径-13_6_" class="st40" d="M860.1,221.2l5.9,12.6c0.6,1.3,1.8,2.2,3.3,2.5l22.3,3.5c1,0.2,2,0,2.9-0.5l15.8-9.3
c1.3-0.8,2.2-2.2,2.2-3.8v-8c0-0.6-0.1-1.3-0.4-1.8l-5.7-12.4c-0.6-1.3-1.8-2.3-3.3-2.5l-22.5-3.5c-1-0.2-2,0-2.9,0.5
l-15.8,9.2c-1.3,0.8-2.2,2.2-2.2,3.8v8.1C859.6,219.9,859.8,220.6,860.1,221.2z"/>
</g>
</g>
<polygon id="Fill-6_8_" class="st42" points="911.6,234 911.6,236.1 909.8,237.1 909.8,235.1 "/>
<polygon id="Fill-6-Copy_6_" class="st46" points="908.6,235.8 908.6,237.8 906.8,238.9 906.8,236.8 "/>
<polygon id="Fill-6-Copy-2_6_" class="st47" points="905.6,237.5 905.6,239.6 903.8,240.7 903.8,238.6 "/>
</g>
<g id="形状结合-2_3_" transform="translate(17.000000, 18.000000)">
<linearGradient id="形状结合_3_" gradientUnits="userSpaceOnUse" x1="-342.2407" y1="708.4328" x2="-341.5711" y2="708.1635" gradientTransform="matrix(27 0 0 -15 10101 10826)">
<stop offset="0" style="stop-color:#828BB3"/>
<stop offset="1" style="stop-color:#555A6F"/>
</linearGradient>
<path id="形状结合_9_" class="st48" d="M863.9,199.4c1.4,0.8,1.4,2.1,0,3c-0.3,0.2-0.5,0.3-0.9,0.4c0.2,0.9,1,1.8,2.1,2.4
c0.4,0.2,0.9,0.4,1.3,0.6c0.5,0.2,0.7,0.6,0.3,0.9c-0.3,0.3-1,0.4-1.5,0.2c-0.6-0.2-1.2-0.5-1.7-0.8c-1.5-0.8-2.4-1.9-2.7-3.1
c-0.7,0-1.4-0.2-1.9-0.5l-0.2-0.1c-1.4-0.8-1.4-2.1,0-3c1.4-0.8,3.5-0.9,4.9-0.1L863.9,199.4z M880.3,202
c-0.1,1.4-1.1,2.8-2.8,3.8c-0.4,0.3-0.9,0.5-1.4,0.7c0.4,0.7,0.1,1.5-0.9,2.1c-1.4,0.8-3.5,0.9-4.9,0.1l-0.2-0.1
c-1.4-0.8-1.4-2.1,0-3c1.3-0.8,3.3-0.8,4.7-0.2c0.4-0.2,0.8-0.3,1.2-0.6c1.4-0.8,2.2-1.9,2.2-3c0-0.3,0.5-0.6,1.1-0.6
C879.8,201.4,880.3,201.7,880.3,202z M862.4,200.3c-0.6-0.3-1.5-0.3-2,0c-0.6,0.3-0.6,0.9,0,1.2c0.6,0.3,1.5,0.3,2,0
C862.9,201.1,862.9,200.6,862.4,200.3z M873.6,206.6c-0.6-0.3-1.5-0.3-2,0c-0.6,0.3-0.6,0.9,0,1.2c0.6,0.3,1.5,0.3,2,0
c0.5-0.3,0.6-0.7,0.2-1C873.7,206.8,873.7,206.7,873.6,206.6C873.6,206.6,873.6,206.6,873.6,206.6z M880.2,196.8
c1.4,0.8,1.4,2.1,0,3c-1.4,0.8-3.5,0.9-4.9,0.1l-0.2-0.1c-0.8-0.5-1.2-1.1-1-1.8c-2.2-0.7-4.9-0.6-7.1,0.1
c-0.5,0.2-1.2,0.1-1.5-0.2s-0.1-0.7,0.5-0.9c2.8-0.9,6.2-0.9,9.1-0.1c0,0,0,0,0,0c1.4-0.8,3.5-0.9,4.9-0.1L880.2,196.8z
M878.7,197.7c-0.6-0.3-1.5-0.3-2,0c-0.6,0.3-0.6,0.9,0,1.2s1.5,0.3,2,0C879.3,198.6,879.3,198,878.7,197.7z"/>
</g>
</g>
</g>
<text transform="matrix(1 0 0 1 805.6185 198.5263)" class="st49"><tspan x="0" y="0" class="st6 st8 st9">模型</tspan><tspan x="0" y="16.8" class="st6 st8 st9">存储</tspan></text>
<g>
<path id="矩形备份-2_13_" class="st34" d="M1179.1,183.7h-142.2c-0.3,0-0.5,0.2-0.7,0.4c-0.2,0.3-0.3,0.6-0.3,1.1v76
c0,0.4,0.1,0.8,0.3,1.1c0.2,0.3,0.4,0.4,0.7,0.4h142.2c0.3,0,0.5-0.2,0.7-0.4c0.2-0.3,0.3-0.6,0.3-1.1v-76c0-0.4-0.1-0.8-0.3-1.1
C1179.6,183.9,1179.3,183.7,1179.1,183.7z"/>
<text transform="matrix(1 0 0 1 1113.0444 227.3935)" class="st11 st12 st9">推理环境</text>
<g id="云竖_1_" transform="translate(516.000000, 320.000000)">
<g>
<rect id="矩形_23_" x="535.8" y="-119.6" class="st13" width="48.8" height="48.8"/>
<g id="编组-6_1_" transform="translate(2.000000, 6.000000)">
<path id="Path-15_3_" class="st35" d="M556.3-82.3c1.7,0.9,3.7,2.1,6.2,0.5c2.4-1.6,15.5-8.8,16.9-9.7c1.9-0.9,3.6-8.5-4.3-15.5
c-0.4-5-6.8-16.2-14-13.6c-2,1.1-7.3,4.3-16.1,9.3c-0.7,0.4-1.3,0.7-1.8,1c-0.2,0.1-0.8,0.6-1.2,1.2c-0.5,0.4-1.7,1.1-3.5,2.3
c-2,0.8-2.9,2.2-2.9,4.4c0,3.5,1.5,7.7,5.5,10.8C545-88.9,554.6-83.2,556.3-82.3z"/>
<linearGradient id="Fill-1_4_" gradientUnits="userSpaceOnUse" x1="-836.9307" y1="407.5797" x2="-837.0942" y2="407.6429" gradientTransform="matrix(27.8283 0 0 -13.8442 23834.3965 5530.2881)">
<stop offset="0" style="stop-color:#B2B7BF"/>
<stop offset="0.1064" style="stop-color:#E2EBFD"/>
<stop offset="0.2734" style="stop-color:#F8FAFF"/>
<stop offset="0.4104" style="stop-color:#D8E0EE"/>
<stop offset="1" style="stop-color:#F1F6FF"/>
</linearGradient>
<path id="Fill-1_1_" class="st50" d="M539.1-107c0.3,0,0.7,0,1,0.1c0,0,0,0,0,0c0.4,0.1,0.7,0.2,1.1,0.4l17.2-10
c-0.1,0-0.2-0.1-0.2-0.1c-0.1,0-0.2-0.1-0.3-0.1c-0.1,0-0.2-0.1-0.3-0.1c-0.1,0-0.2-0.1-0.3-0.1c0,0,0,0-0.1,0c0,0,0,0,0,0
c-0.1,0-0.1,0-0.2,0c-0.1,0-0.2,0-0.3,0c-0.1,0-0.2,0-0.3,0c-0.1,0-0.2,0-0.3,0c0,0,0,0,0,0c0,0,0,0,0,0c-0.1,0-0.2,0-0.4,0
c-0.1,0-0.3,0-0.4,0.1c0,0-0.1,0-0.1,0c0,0-0.1,0-0.1,0c-0.1,0-0.2,0-0.2,0.1c-0.2,0.1-0.4,0.2-0.6,0.3l-17.2,10
c0.2-0.1,0.5-0.2,0.8-0.3c0,0,0.1,0,0.1,0C538.5-106.9,538.8-107,539.1-107C539.1-107,539.1-107,539.1-107z"/>
<linearGradient id="Fill-3_4_" gradientUnits="userSpaceOnUse" x1="-839.5898" y1="416.3705" x2="-839.8314" y2="416.8244" gradientTransform="matrix(30.367 0 0 -33.6775 26067.5156 13933.0166)">
<stop offset="0" style="stop-color:#C0CBDC"/>
<stop offset="1.654118e-02" style="stop-color:#B3C0D4"/>
<stop offset="0.1143" style="stop-color:#A9B8D1"/>
<stop offset="0.1737" style="stop-color:#BEC9DB"/>
<stop offset="0.3293" style="stop-color:#E0E5F0"/>
<stop offset="0.5383" style="stop-color:#D9DEE6"/>
<stop offset="0.5471" style="stop-color:#D6DBE4"/>
<stop offset="0.6916" style="stop-color:#CAD1DC"/>
<stop offset="1" style="stop-color:#EBEEF2"/>
</linearGradient>
<path id="Fill-3_1_" class="st51" d="M581-96.3c0-0.1,0-0.2,0-0.3c0-0.1,0-0.2,0-0.3c0-0.1,0-0.1,0-0.2c0,0,0,0,0,0
c0,0,0-0.1,0-0.1c0-0.1,0-0.2-0.1-0.3c0-0.1,0-0.2-0.1-0.4c0-0.1-0.1-0.2-0.1-0.4c0-0.1-0.1-0.2-0.1-0.4c0,0,0,0,0,0
c0,0,0,0,0,0c0-0.1-0.1-0.2-0.1-0.3c0-0.1-0.1-0.2-0.1-0.4c0-0.1-0.1-0.2-0.1-0.3c0-0.1-0.1-0.2-0.1-0.3c0-0.1-0.1-0.1-0.1-0.2
c0,0,0,0,0,0l0-0.1c0-0.1-0.1-0.2-0.1-0.3c0-0.1-0.1-0.2-0.2-0.3c-0.1-0.1-0.1-0.2-0.2-0.4c-0.1-0.1-0.1-0.3-0.2-0.4
c0,0,0,0,0,0c0,0,0,0,0,0c-0.1-0.2-0.2-0.4-0.3-0.5c-0.2-0.3-0.4-0.6-0.5-0.9c0,0,0,0,0,0l0,0c-0.1-0.2-0.2-0.4-0.4-0.5
c-0.1-0.1-0.2-0.3-0.3-0.4c-0.1-0.1-0.2-0.2-0.3-0.3c0,0,0,0-0.1-0.1c0,0,0,0,0,0c-0.1-0.1-0.1-0.1-0.2-0.2
c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.1-0.2-0.2-0.3-0.3c0,0-0.1-0.1-0.1-0.1c0,0,0,0,0,0
c-0.1-0.1-0.1-0.1-0.2-0.2c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.1-0.2-0.2-0.3-0.2c-0.1-0.1-0.2-0.2-0.3-0.2c0,0-0.1-0.1-0.1-0.1
l-17.2,10c0.4,0.3,0.8,0.6,1.2,1c0,0,0,0,0,0c0.4,0.4,0.8,0.8,1.1,1.2c0,0,0,0,0,0c0.3,0.4,0.7,0.9,1,1.3c0,0,0,0,0,0
c0.3,0.5,0.6,0.9,0.9,1.4c0,0,0,0,0,0c0.3,0.5,0.5,1,0.7,1.5c0,0,0,0,0,0c0.2,0.5,0.4,1,0.5,1.6c0,0,0,0,0,0
c0.1,0.5,0.3,1,0.3,1.6c0,0,0,0,0,0c0.1,0.5,0.1,1,0.1,1.5c0,0.3,0,0.5,0,0.7c0,0,0,0,0,0.1c0,0.2-0.1,0.4-0.1,0.6
c0,0,0,0.1,0,0.1c0,0.2-0.1,0.4-0.1,0.6c0,0,0,0.1,0,0.1c-0.1,0.2-0.1,0.3-0.2,0.5c0,0,0,0,0,0c-0.1,0.2-0.2,0.3-0.3,0.5
c-0.1,0.2-0.3,0.4-0.5,0.6c0,0-0.1,0.1-0.1,0.1c-0.2,0.2-0.4,0.3-0.6,0.4l17.2-10c0.2-0.1,0.4-0.3,0.6-0.4c0,0,0.1-0.1,0.1-0.1
c0.2-0.2,0.3-0.4,0.5-0.6c0,0,0,0,0,0c0.1-0.1,0.2-0.3,0.3-0.5c0,0,0,0,0,0c0,0,0,0,0,0c0-0.1,0.1-0.2,0.1-0.3
c0-0.1,0-0.1,0.1-0.2c0,0,0-0.1,0-0.1c0,0,0-0.1,0-0.1c0-0.1,0.1-0.2,0.1-0.3c0,0,0-0.1,0-0.1c0,0,0-0.1,0-0.1c0,0,0-0.1,0-0.1
c0-0.1,0-0.2,0-0.3c0-0.1,0-0.1,0-0.2c0,0,0,0,0-0.1c0,0,0-0.1,0-0.1c0-0.1,0-0.2,0-0.3c0-0.1,0-0.2,0-0.3c0,0,0,0,0,0
c0-0.1,0-0.2,0-0.3C581.1-96,581-96.1,581-96.3z"/>
<linearGradient id="Fill-8_6_" gradientUnits="userSpaceOnUse" x1="-846.8944" y1="415.673" x2="-847.3483" y2="416.2711" gradientTransform="matrix(41.218 0 0 -31.5976 35478.3477 13034.8008)">
<stop offset="0" style="stop-color:#CBD3E0"/>
<stop offset="0.2302" style="stop-color:#D7DCE6"/>
<stop offset="0.3076" style="stop-color:#C2CBDA"/>
<stop offset="0.4132" style="stop-color:#DCE0E8"/>
<stop offset="0.5076" style="stop-color:#EBEDF1"/>
<stop offset="0.5317" style="stop-color:#F2F3F6"/>
<stop offset="0.6002" style="stop-color:#FDFBFB"/>
<stop offset="0.6687" style="stop-color:#F8F9FA"/>
<stop offset="0.7321" style="stop-color:#D6DBE1"/>
<stop offset="1" style="stop-color:#EBEEF2"/>
</linearGradient>
<path id="Fill-8_4_" class="st52" d="M551.8-108.2C551.8-108.2,551.8-108.2,551.8-108.2c0.2,0.2,0.5,0.5,0.7,0.8c0,0,0,0,0,0
c0.2,0.2,0.4,0.5,0.6,0.7c0,0,0,0,0,0c0.2,0.2,0.4,0.5,0.6,0.7c0,0,0,0,0,0c0.2,0.2,0.3,0.4,0.5,0.7c0.1,0.1,0.2,0.2,0.2,0.3
c0.1,0.1,0.2,0.3,0.3,0.4c0.2,0.2,0.3,0.5,0.5,0.7c0.1,0.1,0.1,0.2,0.2,0.3c0,0.1,0.1,0.2,0.1,0.2c0.1,0.2,0.2,0.5,0.4,0.7
c0,0,0,0.1,0,0.1c0.1,0.3,0.3,0.6,0.4,0.9c0,0,0,0,0,0c0.1,0.3,0.3,0.6,0.4,0.9c0,0,0,0,0,0.1c0.1,0.3,0.2,0.6,0.3,0.9l0,0.1
c0.1,0.3,0.2,0.6,0.2,0.8c0,0,0,0.1,0,0.1c0.1,0.3,0.1,0.6,0.2,0.9c0,0,0,0.1,0,0.1c0.1,0.3,0.1,0.6,0.1,0.9l17.2-10
c0-0.1,0-0.3-0.1-0.4c0-0.1,0-0.3-0.1-0.4c0,0,0-0.1,0-0.1c0,0,0-0.1,0-0.1c0-0.1,0-0.2-0.1-0.3c0-0.1-0.1-0.3-0.1-0.4
c0,0,0-0.1,0-0.1c0,0,0-0.1,0-0.1c0-0.1,0-0.1-0.1-0.2c0-0.1-0.1-0.3-0.1-0.4c0-0.1,0-0.1-0.1-0.2c0,0,0-0.1,0-0.1
c0-0.1,0-0.1,0-0.2c0-0.1-0.1-0.3-0.1-0.4c0-0.1-0.1-0.2-0.1-0.3c0,0,0,0,0-0.1c0,0,0-0.1,0-0.1c-0.1-0.1-0.1-0.3-0.2-0.4
c-0.1-0.1-0.1-0.3-0.2-0.4c0,0,0,0,0,0c0,0,0,0,0,0c-0.1-0.1-0.1-0.2-0.2-0.4c-0.1-0.1-0.1-0.3-0.2-0.4c0,0,0,0,0-0.1
c0,0,0-0.1,0-0.1c-0.1-0.1-0.1-0.2-0.2-0.3c-0.1-0.1-0.1-0.2-0.2-0.4c0-0.1-0.1-0.2-0.1-0.2c0,0,0-0.1-0.1-0.1
c0-0.1-0.1-0.1-0.1-0.2c-0.2-0.3-0.3-0.5-0.5-0.7c0-0.1-0.1-0.1-0.1-0.2c-0.1-0.1-0.1-0.2-0.2-0.3c-0.1-0.1-0.2-0.2-0.2-0.3
c0-0.1-0.1-0.1-0.1-0.2c-0.1-0.2-0.2-0.3-0.4-0.5c0,0,0,0,0,0c0,0,0,0,0,0c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.1-0.2-0.3-0.3-0.4
c0,0,0,0,0,0c0,0,0,0,0,0c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.1-0.2-0.2-0.3-0.4l0,0c0,0,0,0,0,0c-0.1-0.1-0.2-0.2-0.3-0.3
c-0.1-0.1-0.2-0.2-0.4-0.3c0,0,0,0,0,0l0,0c-0.1-0.1-0.2-0.2-0.4-0.3c-0.1-0.1-0.2-0.2-0.4-0.3c0,0,0,0,0,0
c-0.1-0.1-0.2-0.2-0.4-0.3c-0.1-0.1-0.2-0.2-0.4-0.3c0,0,0,0,0,0l0,0c-0.1-0.1-0.2-0.1-0.3-0.2c-0.1-0.1-0.2-0.1-0.4-0.2
c0,0-0.1,0-0.1,0c-0.1-0.1-0.2-0.1-0.3-0.1c-0.1-0.1-0.2-0.1-0.3-0.2c-0.1,0-0.1-0.1-0.2-0.1c0,0,0,0-0.1,0c0,0,0,0-0.1,0
c-0.1-0.1-0.2-0.1-0.3-0.1c-0.1,0-0.2-0.1-0.3-0.1c0,0,0,0-0.1,0c0,0,0,0-0.1,0c-0.1,0-0.1-0.1-0.2-0.1c-0.1,0-0.2-0.1-0.3-0.1
c-0.1,0-0.1,0-0.2,0c0,0-0.1,0-0.1,0c0,0-0.1,0-0.1,0c-0.1,0-0.2,0-0.4-0.1c-0.1,0-0.2,0-0.2,0c0,0-0.1,0-0.1,0c0,0,0,0-0.1,0
c-0.1,0-0.3,0-0.4,0c-0.1,0-0.1,0-0.2,0c0,0-0.1,0-0.1,0c0,0-0.1,0-0.1,0c-0.2,0-0.3,0-0.5,0.1c0,0,0,0,0,0c0,0-0.1,0-0.1,0
c-0.2,0-0.3,0.1-0.4,0.1c0,0,0,0,0,0c-0.2,0.1-0.4,0.2-0.6,0.3l-17.2,9.9c0.2-0.1,0.4-0.2,0.6-0.3c0.2-0.1,0.3-0.1,0.5-0.1
c0,0,0.1,0,0.1,0c0.2,0,0.4-0.1,0.6-0.1c0,0,0.1,0,0.1,0c0.2,0,0.4,0,0.6,0c0,0,0.1,0,0.1,0c0.2,0,0.5,0.1,0.7,0.1
c0,0,0.1,0,0.1,0c0.2,0.1,0.5,0.1,0.7,0.2c0,0,0,0,0.1,0c0.3,0.1,0.5,0.2,0.8,0.3c0,0,0,0,0.1,0c0.3,0.1,0.6,0.3,0.8,0.4
c0.3,0.1,0.5,0.3,0.8,0.5c0,0,0,0,0,0c0.3,0.2,0.5,0.4,0.7,0.6C551.4-108.6,551.6-108.4,551.8-108.2z"/>
<linearGradient id="Fill-5_6_" gradientUnits="userSpaceOnUse" x1="-845.0588" y1="417.5899" x2="-844.7551" y2="417.0798" gradientTransform="matrix(37.419 0 0 -39.8938 32166.1191 16556.9258)">
<stop offset="0" style="stop-color:#FCFDFF"/>
<stop offset="1" style="stop-color:#EFF1F6"/>
</linearGradient>
<path id="Fill-5_3_" class="st53" d="M557.9-96.9c3.4,2.4,6,7.3,6,11.3c0,4.3-3.1,6.1-6.8,3.9l-15-8.7
c-3.8-2.2-6.8-7.5-6.8-11.8c0-4,2.6-5.8,6-4.3c0.7-4.2,2.9-6.2,8.4-3.4C554.3-106.9,557.3-101.8,557.9-96.9z"/>
<path id="Fill-5_2_" class="st17" d="M552.6-115.9c1.6-1.1,4-0.9,6.6,0.6c4.2,2.4,7.6,8,8.3,12.9c3.4,2.4,6,7.3,6,11.3
c0,2.1-0.6,3.6-1.8,4.3"/>
<path id="Path-15_2_" class="st40" d="M560.9-120.9c-2,1.1-7.3,4.2-16.1,9.3c-0.8,0.4-1.4,0.7-1.8,1.1c-0.2,0.1-0.8,0.6-1.3,1.3
c-0.5,0.4-1.7,1.1-3.4,2.2c-1,0.4-1.8,1-2.3,1.8c-0.5,0.8-0.8,1.8-0.8,2.9c0,3.6,1.6,7.9,5.6,11.2c4,2.6,13.6,8.3,15.5,9.3
c1,0.6,2.2,1.2,3.4,1.3c0.9,0.1,1.9-0.1,3-0.9c1.5-1,6.8-3.9,11.1-6.4c2.8-1.6,5.2-2.9,5.8-3.3c0.7-0.3,1.4-1.5,1.7-3.2
c0.2-1.3,0.2-2.9-0.3-4.6c-0.7-2.5-2.3-5.4-5.4-8.2c-0.3-3-2.6-7.9-5.9-11.1c-1.3-1.3-2.8-2.2-4.3-2.7
C563.9-121.4,562.4-121.4,560.9-120.9z"/>
</g>
</g>
</g>
</g>
<g>
<g class="st4">
<line class="st5" x1="979.1" y1="224.1" x2="1033.7" y2="224.1"/>
<g>
<polygon class="st6" points="1025.8,234 1024.1,232.2 1032.8,224.2 1024.1,216.1 1025.8,214.3 1036.3,224.2 "/>
</g>
</g>
</g>
<text transform="matrix(1 0 0 1 992.8185 195.1307)" class="st49"><tspan x="0" y="0" class="st6 st8 st9">模型</tspan><tspan x="0" y="16.8" class="st6 st8 st9">推理</tspan></text>
<g>
<g class="st4">
<path class="st5" d="M361.4,94.1v-4.6c0-11,9-20,20-20h323.2c11,0,20,9,20,20v96"/>
<g>
<polygon class="st6" points="371.3,86.3 369.5,84.6 361.4,93.2 353.4,84.5 351.6,86.1 361.4,96.7 "/>
</g>
</g>
</g>
<g>
<g class="st4">
<path class="st5" d="M361.4,355.1v4.6c0,11,9,20,20,20h323.2c11,0,20-9,20-20v-96"/>
<g>
<polygon class="st6" points="351.6,363.2 353.4,364.8 361.4,356 369.5,364.6 371.3,363 361.3,352.5 "/>
</g>
</g>
</g>
<text transform="matrix(1 0 0 1 497.7269 89.4885)" class="st7 st8 st9">迭代-调试代码</text>
<text transform="matrix(1 0 0 1 497.7271 366.8143)" class="st7 st8 st9">迭代-修正数据</text>
<text transform="matrix(1 0 0 1 187.7229 54.4447)" class="st54 st9">创建</text>
<g>
<line class="st55" x1="281.8" y1="43.1" x2="281.8" y2="375.8"/>
<line class="st55" x1="800.2" y1="43.1" x2="800.2" y2="375.8"/>
</g>
<g>
<g class="st4">
<line class="st5" x1="791.4" y1="226.1" x2="846" y2="226.1"/>
<g>
<polygon class="st6" points="838,235.9 836.4,234.1 845,226.1 836.4,218 838,216.3 848.6,226.1 "/>
</g>
</g>
</g>
<text transform="matrix(1 0 0 1 491.9814 54.4448)" class="st54 st9">模型开发与训练</text>
<g>
<g class="st4">
<path class="st5" d="M288.3,135.5h-64.6c-12.2,0-22.2,10-22.2,22.2v27.8"/>
<g>
<polygon class="st6" points="280.3,125.7 278.7,127.5 287.3,135.5 278.7,143.6 280.3,145.4 290.9,135.5 "/>
</g>
</g>
</g>
<g>
<g class="st4">
<path class="st5" d="M288.3,314.6h-64.6c-12.2,0-22.2-10-22.2-22.2v-27.8"/>
<g>
<polygon class="st6" points="280.3,304.8 278.7,306.5 287.3,314.6 278.7,322.7 280.3,324.4 290.9,314.6 "/>
</g>
</g>
</g>
<text transform="matrix(1 0 0 1 953.21 54.4449)" class="st54 st9">模型推理</text>
</svg>

+ 1
- 0
custom/public/img/gitopeni-index-01.svg
File diff suppressed because it is too large
View File


+ 1
- 0
custom/public/img/gitopeni-index-02.svg
File diff suppressed because it is too large
View File


BIN
custom/public/img/i-code-pic.jpg View File

Before After
Width: 800  |  Height: 382  |  Size: 42 KiB

BIN
custom/public/img/i-data-pic.jpg View File

Before After
Width: 800  |  Height: 456  |  Size: 51 KiB

+ 1
- 0
custom/public/img/i-pic-01.svg
File diff suppressed because it is too large
View File


+ 1
- 0
custom/public/img/i-pic-02.svg
File diff suppressed because it is too large
View File


+ 1
- 0
custom/public/img/i-pic-03.svg
File diff suppressed because it is too large
View File


+ 1
- 0
custom/public/img/i-pic-04.svg
File diff suppressed because it is too large
View File


+ 1
- 0
custom/public/img/i-yunnao.svg
File diff suppressed because it is too large
View File


BIN
custom/public/img/icon-403@2x.png View File

Before After
Width: 548  |  Height: 438  |  Size: 57 KiB

BIN
custom/public/img/icon-404@2x.png View File

Before After
Width: 548  |  Height: 452  |  Size: 54 KiB

BIN
custom/public/img/icon-500@2x.png View File

Before After
Width: 561  |  Height: 432  |  Size: 43 KiB

+ 1
- 0
custom/public/img/logo-w.svg View File

@@ -0,0 +1 @@
<svg id="图层_1" data-name="图层 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 50"><defs><style>.cls-1{fill:#5bb973;}.cls-2{fill:#fff;}</style></defs><title>logo-w</title><path class="cls-1" d="M42.08,12.13l-15.65-9a4.44,4.44,0,0,0-4.43,0l-15.65,9A4.44,4.44,0,0,0,4.13,16V34a4.44,4.44,0,0,0,2.22,3.84l3.83,2.21a2.88,2.88,0,0,0-.06.59,2.95,2.95,0,1,0,1-2.17L7.26,36.3A2.63,2.63,0,0,1,6,34V16A2.62,2.62,0,0,1,7.26,13.7l15.65-9a2.59,2.59,0,0,1,2.61,0l15.65,9A2.63,2.63,0,0,1,42.47,16V34a2.64,2.64,0,0,1-1.3,2.27l-15.65,9a3.16,3.16,0,0,1-.5.22V39.88a1.31,1.31,0,0,0,0-.28V36.35l.1,0,9-6a.92.92,0,0,0,.41-.75V20a3,3,0,1,0-1.82,0v9L25,34.18V15.94a3,3,0,1,0-1.82,0v12l-5.08-2.95V20.19a3,3,0,1,0-1.82,0v5.26a.9.9,0,0,0,.45.79L23.2,30v8.16L12.11,31.73V23.84a2.93,2.93,0,1,0-1.82,0v8.41a.94.94,0,0,0,.46.79l12.45,7.2v6.34a.22.22,0,0,0,0,.08v.09l0,.1s0,0,0,.07l.06.1s0,0,0,0l.08.1,0,0a.39.39,0,0,0,.1.08l0,0,.12.07,0,0,.14,0h0a.39.39,0,0,0,.15,0h.16a4.44,4.44,0,0,0,2.22-.59l15.65-9A4.46,4.46,0,0,0,44.29,34V16a4.45,4.45,0,0,0-2.21-3.83m-29,27.42a1.12,1.12,0,1,1-1.12,1.12,1.12,1.12,0,0,1,1.12-1.12m20.6-23.46a1.12,1.12,0,1,1-1.12,1.12,1.12,1.12,0,0,1,1.12-1.12m-16.45.19a1.12,1.12,0,1,1-1.12,1.12,1.12,1.12,0,0,1,1.12-1.12m-6,3.65a1.12,1.12,0,1,1-1.12,1.12,1.12,1.12,0,0,1,1.12-1.12M24.13,12A1.12,1.12,0,1,1,23,13.14,1.12,1.12,0,0,1,24.13,12"/><path class="cls-2" d="M81.68,26.69H67.86c-2,.1-3.06,1-3.06,2.85v6.33c.1,1.68,1.16,2.53,3.06,2.63H81.57c1.9-.1,2.85-1,3-2.74V29.54A2.71,2.71,0,0,0,81.68,26.69Zm-.53,8c-.11.73-.53,1.16-1.48,1.26H69.54c-1-.21-1.37-.53-1.47-1.26V30.59a1.44,1.44,0,0,1,1.47-1.48h10a1.54,1.54,0,0,1,1.58,1.48Z"/><path class="cls-2" d="M63.21,20.57V17A1.63,1.63,0,0,1,64.8,15.4H79.25c1.06-.11,1.58.42,1.58,1.37V19.3c0,.85-.52,1.27-1.47,1.27H64.59V23H81.47c1.79,0,2.74-.85,2.74-2.43V15.72A2.45,2.45,0,0,0,81.47,13H74.08V11H70.6v2H62.69c-2,0-3,.95-3,3v9.39a42.65,42.65,0,0,1-2,13l3.27.64a43.43,43.43,0,0,0,2.11-13V20.57Z"/><path class="cls-2" d="M90,24.47l3.38,1.8a10.1,10.1,0,0,0,3.9-5.81h5.91V18H97.82a25.57,25.57,0,0,0,.21-3h5V12.55H93.7V11H90.22v4h4.43a17.38,17.38,0,0,1-.21,2.95H89.38v2.53h4.43A7.05,7.05,0,0,1,90,24.47Z"/><path class="cls-2" d="M97.82,21.62A21.82,21.82,0,0,1,100,26.05h3.7a25.8,25.8,0,0,0-2.22-4.43Z"/><path class="cls-2" d="M112.17,26.79H93.39c-1.8.21-2.85,1.06-3,2.64v4.75H112v1c0,.85-.52,1.27-1.58,1.27h-15c-1,0-1.48-.42-1.48-1.16H90.54v1A2.75,2.75,0,0,0,93.18,39h19.09c2-.1,3.06-1,3.06-2.64V29.54A3.21,3.21,0,0,0,112.17,26.79Zm-.32,4.86h-18V30.8a1.43,1.43,0,0,1,1.48-1.47h15c1,0,1.58.52,1.58,1.47Z"/><path class="cls-2" d="M113.64,12h-6.22q-2.53.17-2.85,2.22V23.1a2.33,2.33,0,0,0,2.32,2.22h6.65c1.47-.11,2.32-.85,2.32-2.22V14.24C116,13,115.23,12.23,113.64,12Zm-1,9.29c0,1.05-.53,1.58-1.48,1.58h-1.79A1.39,1.39,0,0,1,108,21.31V16a1.42,1.42,0,0,1,1.47-1.47H111A1.53,1.53,0,0,1,112.59,16Z"/></svg>

+ 1
- 0
custom/public/img/logo.svg View File

@@ -0,0 +1 @@
<svg id="图层_1" data-name="图层 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 50"><defs><style>.cls-1{fill:#35373f;}</style></defs><title>logo</title><path class="cls-1" d="M42.08,12.13l-15.65-9a4.44,4.44,0,0,0-4.43,0l-15.65,9A4.44,4.44,0,0,0,4.13,16V34a4.44,4.44,0,0,0,2.22,3.84l3.83,2.21a2.88,2.88,0,0,0-.06.59,2.95,2.95,0,1,0,1-2.17L7.26,36.3A2.63,2.63,0,0,1,6,34V16A2.62,2.62,0,0,1,7.26,13.7l15.65-9a2.59,2.59,0,0,1,2.61,0l15.65,9A2.63,2.63,0,0,1,42.47,16V34a2.64,2.64,0,0,1-1.3,2.27l-15.65,9a3.16,3.16,0,0,1-.5.22V39.88a1.31,1.31,0,0,0,0-.28V36.35l.1,0,9-6a.92.92,0,0,0,.41-.75V20a3,3,0,1,0-1.82,0v9L25,34.18V15.94a3,3,0,1,0-1.82,0v12l-5.08-2.95V20.19a3,3,0,1,0-1.82,0v5.26a.9.9,0,0,0,.45.79L23.2,30v8.16L12.11,31.73V23.84a2.93,2.93,0,1,0-1.82,0v8.41a.94.94,0,0,0,.46.79l12.45,7.2v6.34a.22.22,0,0,0,0,.08v.09l0,.1s0,0,0,.07l.06.1s0,0,0,0l.08.1,0,0a.39.39,0,0,0,.1.08l0,0,.12.07,0,0,.14,0h0a.39.39,0,0,0,.15,0h.16a4.44,4.44,0,0,0,2.22-.59l15.65-9A4.46,4.46,0,0,0,44.29,34V16a4.45,4.45,0,0,0-2.21-3.83m-29,27.42a1.12,1.12,0,1,1-1.12,1.12,1.12,1.12,0,0,1,1.12-1.12m20.6-23.46a1.12,1.12,0,1,1-1.12,1.12,1.12,1.12,0,0,1,1.12-1.12m-16.45.19a1.12,1.12,0,1,1-1.12,1.12,1.12,1.12,0,0,1,1.12-1.12m-6,3.65a1.12,1.12,0,1,1-1.12,1.12,1.12,1.12,0,0,1,1.12-1.12M24.13,12A1.12,1.12,0,1,1,23,13.14,1.12,1.12,0,0,1,24.13,12"/><path class="cls-1" d="M81.68,26.69H67.86c-2,.1-3.06,1-3.06,2.85v6.33c.1,1.68,1.16,2.53,3.06,2.63H81.57c1.9-.1,2.85-1,3-2.74V29.54A2.71,2.71,0,0,0,81.68,26.69Zm-.53,8c-.11.73-.53,1.16-1.48,1.26H69.54c-1-.21-1.37-.53-1.47-1.26V30.59a1.44,1.44,0,0,1,1.47-1.48h10a1.54,1.54,0,0,1,1.58,1.48Z"/><path class="cls-1" d="M63.21,20.57V17A1.63,1.63,0,0,1,64.8,15.4H79.25c1.06-.11,1.58.42,1.58,1.37V19.3c0,.85-.52,1.27-1.47,1.27H64.59V23H81.47c1.79,0,2.74-.85,2.74-2.43V15.72A2.45,2.45,0,0,0,81.47,13H74.08V11H70.6v2H62.69c-2,0-3,.95-3,3v9.39a42.65,42.65,0,0,1-2,13l3.27.64a43.43,43.43,0,0,0,2.11-13V20.57Z"/><path class="cls-1" d="M90,24.47l3.38,1.8a10.1,10.1,0,0,0,3.9-5.81h5.91V18H97.82a25.57,25.57,0,0,0,.21-3h5V12.55H93.7V11H90.22v4h4.43a17.38,17.38,0,0,1-.21,2.95H89.38v2.53h4.43A7.05,7.05,0,0,1,90,24.47Z"/><path class="cls-1" d="M97.82,21.62A21.82,21.82,0,0,1,100,26.05h3.7a25.8,25.8,0,0,0-2.22-4.43Z"/><path class="cls-1" d="M112.17,26.79H93.39c-1.8.21-2.85,1.06-3,2.64v4.75H112v1c0,.85-.52,1.27-1.58,1.27h-15c-1,0-1.48-.42-1.48-1.16H90.54v1A2.75,2.75,0,0,0,93.18,39h19.09c2-.1,3.06-1,3.06-2.64V29.54A3.21,3.21,0,0,0,112.17,26.79Zm-.32,4.86h-18V30.8a1.43,1.43,0,0,1,1.48-1.47h15c1,0,1.58.52,1.58,1.47Z"/><path class="cls-1" d="M113.64,12h-6.22q-2.53.17-2.85,2.22V23.1a2.33,2.33,0,0,0,2.32,2.22h6.65c1.47-.11,2.32-.85,2.32-2.22V14.24C116,13,115.23,12.23,113.64,12Zm-1,9.29c0,1.05-.53,1.58-1.48,1.58h-1.79A1.39,1.39,0,0,1,108,21.31V16a1.42,1.42,0,0,1,1.47-1.47H111A1.53,1.53,0,0,1,112.59,16Z"/></svg>

+ 7
- 3
models/cloudbrain.go View File

@@ -2,7 +2,6 @@ package models

import (
"encoding/json"
"errors"
"fmt"
"time"
"xorm.io/xorm"
@@ -300,7 +299,7 @@ type CommitImageResult struct {
Payload map[string]interface{} `json:"payload"`
}

type StopJobResult struct {
type CloudBrainResult struct {
Code string `json:"code"`
Msg string `json:"msg"`
}
@@ -569,7 +568,7 @@ func getRepoCloudBrain(cb *Cloudbrain) (*Cloudbrain, error) {
if err != nil {
return nil, err
} else if !has {
return nil, errors.New("cloudbrain task is not found")
return nil, ErrJobNotExist{}
}
return cb, nil
}
@@ -609,3 +608,8 @@ func deleteJob(e Engine, job *Cloudbrain) error {
_, err := e.ID(job.ID).Delete(job)
return err
}

func GetCloudbrainByName(jobName string) (*Cloudbrain, error) {
cb := &Cloudbrain{JobName: jobName}
return getRepoCloudBrain(cb)
}

+ 12
- 0
models/error.go View File

@@ -1987,3 +1987,15 @@ func IsErrFileChunkNotExist(err error) bool {
_, ok := err.(ErrFileChunkNotExist)
return ok
}

type ErrJobNotExist struct {
}

func IsErrJobNotExist(err error) bool {
_, ok := err.(ErrJobNotExist)
return ok
}

func (err ErrJobNotExist) Error() string {
return fmt.Sprintf("the job does not exist")
}

+ 16
- 3
modules/cloudbrain/resty.go View File

@@ -2,6 +2,7 @@ package cloudbrain

import (
"code.gitea.io/gitea/modules/log"
"encoding/json"
"fmt"

"code.gitea.io/gitea/models"
@@ -143,14 +144,26 @@ sendjob:
return nil, fmt.Errorf("resty GetImages: %v", err)
}

if getImagesResult.Code == "S401" && retry < 1 {
var response models.CloudBrainResult
err = json.Unmarshal(res.Body(), &response)
if err != nil {
log.Error("json.Unmarshal failed: %s", err.Error())
return &getImagesResult, fmt.Errorf("json.Unmarshal failed: %s", err.Error())
}

if response.Code == "S401" && retry < 1 {
retry++
_ = loginCloudbrain()
goto sendjob
}

if len(response.Code) != 0 {
log.Error("getImagesResult failed(%s): %s", response.Code, response.Msg)
return &getImagesResult, fmt.Errorf("getImagesResult failed(%s): %s", response.Code, response.Msg)
}

if getImagesResult.Code != Success {
return &getImagesResult, fmt.Errorf("getImgesResult err: %s", res.String())
return &getImagesResult, fmt.Errorf("getImagesResult err: %s", res.String())
}

return &getImagesResult, nil
@@ -223,7 +236,7 @@ sendjob:
func StopJob(jobID string) error {
checkSetting()
client := getRestyClient()
var result models.StopJobResult
var result models.CloudBrainResult

retry := 0



+ 35
- 0
modules/git/repo.go View File

@@ -434,3 +434,38 @@ func GetDivergingCommits(repoPath string, baseBranch string, targetBranch string

return DivergeObject{ahead, behind}, nil
}

type Contributor struct {
CommitCnt int
Committer string
Email string
}

func GetContributors(repoPath string) ([]Contributor, error){
cmd := NewCommand("shortlog", "-sne", "--all")
stdout, err := cmd.RunInDir(repoPath)
if err != nil {
return nil, err
}
stdout = strings.Trim(stdout, "\n")
contributorRows := strings.Split(stdout, "\n")
if len(contributorRows) > 0 {
contributorsInfo := make([]Contributor, len(contributorRows))
for i := 0; i < len(contributorRows); i++ {
var oneCount string = strings.Trim(contributorRows[i], " ")
if strings.Index(oneCount, "\t") < 0 {
continue
}
number := oneCount[0:strings.Index(oneCount, "\t")]
commitCnt, _ := strconv.Atoi(number)
committer := oneCount[strings.Index(oneCount, "\t")+1:strings.LastIndex(oneCount, " ")]
committer = strings.Trim(committer, " ")
email := oneCount[strings.Index(oneCount, "<")+1:strings.Index(oneCount, ">")]
contributorsInfo[i] = Contributor{
commitCnt, committer, email,
}
}
return contributorsInfo, nil
}
return nil, nil
}

+ 7
- 2
options/locale/locale_en-US.ini View File

@@ -1,4 +1,5 @@
home = Home
index = Home
dashboard = Dashboard
explore = Explore
datasets = Datasets
@@ -86,6 +87,8 @@ write = Write
preview = Preview
loading = Loading…

error404_index = Request forbidden by administrative rules
error500_index = Internal Server Error
error404 = The page you are trying to reach either <strong>does not exist</strong> or <strong>you are not authorized</strong> to view it.

[error]
@@ -702,6 +705,7 @@ delete= delete
owner = Owner
repo_name = Repository Name
repo_name_helper = Good repository names use short, memorable and unique keywords.
repo_owner_helper = Some organizations may not show up in the dropdown due to a maximum repository count limit.
repo_size = Repository Size
template = Template
template_select = Select a template.
@@ -1817,6 +1821,7 @@ org_full_name_holder = Organization Full Name
org_name_helper = Organization names should be short and memorable.
create_org = Create Organization
repo_updated = Updated
home = Home
people = People
teams = Teams
lower_members = members
@@ -2482,9 +2487,9 @@ error.unit_not_allowed = You are not allowed to access this repository section.

[custom]
head.community = Community
head.project = Project
head.project = Repositories
head.openi = OpenI
head.dataset = Dataset
head.dataset = Datasets
foot.council = Council
foot.technical_committee = Technical Committee
foot.join = Join OpenI


+ 7
- 3
options/locale/locale_zh-CN.ini View File

@@ -1,5 +1,5 @@
home=个人中心
index=首页
index=个人中心
dashboard=个人中心
explore=探索
datasets=数据集
@@ -87,6 +87,8 @@ write=撰写
preview=预览
loading=正在加载...

error404_index = 您的访问受限!
error500_index = 抱歉!您指定的网页无法访问。
error404=您正尝试访问的页面 <strong>不存在</strong> 或 <strong>您尚未被授权</strong> 查看该页面。

[error]
@@ -287,7 +289,7 @@ email_domain_blacklisted=您不能使用您的电子邮件地址注册。
authorize_application=应用授权
authorize_redirect_notice=如果您授权此应用,您将会被重定向到 %s。
authorize_application_created_by=此应用由%s创建。
authorize_application_description=如果您允许,它将能够读取和修改您的所有帐户信息,包括私人项目和组织
authorize_application_description=如果您允许,它将能够读取您的个人信息
authorize_title=授权 %s 访问您的帐户?
authorization_failed=授权失败
authorization_failed_desc=授权失败,这是一个无效的请求。请联系尝试授权应用的管理员。
@@ -704,6 +706,7 @@ delete=删除
owner=拥有者
repo_name=项目名称
repo_name_helper=好的存储库名称使用简短、深刻和独特的关键字。
repo_owner_helper = 由于最大存储库数量限制,某些组织名称可能不会显示在下拉列表中。
repo_size=项目大小
template=模板
template_select=选择模板
@@ -1819,6 +1822,7 @@ org_full_name_holder=组织全名
org_name_helper=组织名字应该简单明了。
create_org=创建组织
repo_updated=最后更新于
home=组织主页
people=组织成员
teams=组织团队
lower_members=名成员
@@ -2482,7 +2486,7 @@ error.unit_not_allowed=您没有权限访问此项目单元

[custom]
head.community=启智社区
head.project=所有项目
head.project=项目
head.openi=启智项目
head.dataset=数据集
foot.council=理事会


+ 1
- 0
routers/org/home.go View File

@@ -20,6 +20,7 @@ const (
// Home show organization home page
func Home(ctx *context.Context) {
ctx.SetParams(":org", ctx.Params(":username"))
ctx.Data["PageIsOrgHome"] = true
context.HandleOrgAssignment(ctx)
if ctx.Written() {
return


+ 14
- 1
routers/repo/cloudbrain.go View File

@@ -168,11 +168,24 @@ func CloudBrainCreate(ctx *context.Context, form auth.CreateCloudBrainForm) {
ctx.RenderWithErr("jobtype error", tplCloudBrainNew, &form)
return
}

_, err := models.GetCloudbrainByName(jobName)
if err == nil {
log.Error("the job name did already exist", ctx.Data["MsgID"])
ctx.RenderWithErr("the job name did already exist", tplCloudBrainNew, &form)
return
} else {
if !models.IsErrJobNotExist(err) {
log.Error("system error, %v", err, ctx.Data["MsgID"])
ctx.RenderWithErr("system error", tplCloudBrainNew, &form)
return
}
}
repo := ctx.Repo.Repository
downloadCode(repo, codePath)

modelPath := setting.JobPath + jobName + cloudbrain.ModelMountPath
err := os.MkdirAll(modelPath, os.ModePerm)
err = os.MkdirAll(modelPath, os.ModePerm)
if err != nil {
ctx.RenderWithErr(err.Error(), tplCloudBrainNew, &form)
return


+ 59
- 0
routers/repo/view.go View File

@@ -7,6 +7,7 @@ package repo

import (
"bytes"
"code.gitea.io/gitea/modules/options"
"encoding/base64"
"fmt"
gotemplate "html/template"
@@ -567,9 +568,32 @@ func safeURL(address string) string {
return u.String()
}

type ContributorInfo struct {
UserInfo *models.User
Email string // for contributor who is not a registered user
}

// Home render repository home page
func Home(ctx *context.Context) {
if len(ctx.Repo.Units) > 0 {
//get repo contributors info
contributors, err := git.GetContributors(ctx.Repo.Repository.RepoPath())
if err == nil && contributors != nil {
var contributorInfos []*ContributorInfo
for _, c := range contributors {
user, err := models.GetUserByEmail(c.Email)
if err == nil {
contributorInfos = append(contributorInfos, &ContributorInfo{
user, c.Email,
})
} else {
contributorInfos = append(contributorInfos, &ContributorInfo{
nil, c.Email,
})
}
}
ctx.Data["ContributorInfo"] = contributorInfos
}
if ctx.Repo.Repository.IsBeingCreated() {
task, err := models.GetMigratingTask(ctx.Repo.Repository.ID)
if err != nil {
@@ -611,6 +635,39 @@ func Home(ctx *context.Context) {
ctx.NotFound("Home", fmt.Errorf(ctx.Tr("units.error.no_unit_allowed_repo")))
}

func renderLicense(ctx *context.Context) {
entry, err := ctx.Repo.Commit.GetTreeEntryByPath("LICENSE")
if err != nil {
log.Error(err.Error())
return
}
blob := entry.Blob()
dataRc, err := blob.DataAsync()
if err != nil {
log.Error("DataAsync", err)
return
}
defer dataRc.Close()
buf, err := ioutil.ReadAll(dataRc)
if err != nil {
log.Error("DataAsync", err)
return
}
for _, f := range models.Licenses {
license, err := options.License(f)
if err != nil {
log.Error("failed to get license content: %v, err:%v", f, err)
continue
}
if bytes.Compare(buf,license) == 0 {
log.Info("got matched license:%v",f)
ctx.Data["LICENSE"] = f
return
}
}
log.Info("not found matched license,repo:%v",ctx.Repo.Repository.Name)
}

func renderLanguageStats(ctx *context.Context) {
langs, err := ctx.Repo.Repository.GetTopLanguageStats(5)
if err != nil {
@@ -657,6 +714,8 @@ func renderCode(ctx *context.Context) {

// Get Topics of this repo
renderRepoTopics(ctx)
// Get license of this repo
renderLicense(ctx)
if ctx.Written() {
return
}


+ 9
- 2
routers/routes/routes.go View File

@@ -6,6 +6,7 @@ package routes

import (
"bytes"
"code.gitea.io/gitea/routers/secure"
"encoding/gob"
"net/http"
"path"
@@ -21,6 +22,7 @@ import (
"code.gitea.io/gitea/modules/options"
"code.gitea.io/gitea/modules/public"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/templates"
"code.gitea.io/gitea/modules/validation"
"code.gitea.io/gitea/routers"
@@ -265,7 +267,7 @@ func RegisterRoutes(m *macaron.Macaron) {
ignSignIn := context.Toggle(&context.ToggleOptions{SignInRequired: setting.Service.RequireSignInView})
ignSignInAndCsrf := context.Toggle(&context.ToggleOptions{DisableCSRF: true})
reqSignOut := context.Toggle(&context.ToggleOptions{SignOutRequired: true})
reqBasicAuth := context.Toggle(&context.ToggleOptions{BasicAuthRequired: true})
reqBasicAuth := context.Toggle(&context.ToggleOptions{BasicAuthRequired: true, DisableCSRF: true})

bindIgnErr := binding.BindIgnErr
validation.AddBindingRules()
@@ -305,7 +307,7 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Head("/", func() string {
return ""
})
m.Get("/", routers.ExploreRepos)
m.Get("/", routers.Dashboard)
m.Get("/dashboard", routers.Dashboard)
m.Group("/explore", func() {
m.Get("", func(ctx *context.Context) {
@@ -1125,6 +1127,11 @@ func RegisterRoutes(m *macaron.Macaron) {
apiv1.RegisterRoutes(m)
}, handlers...)

//secure api,
m.Group("/secure", func() {
m.Post("/user", binding.Bind(structs.CreateUserOption{}), secure.CreateUser)
}, reqBasicAuth)

m.Group("/api/internal", func() {
// package name internal is ideal but Golang is not allowed, so we use private as package name.
private.RegisterRoutes(m)


+ 114
- 0
routers/secure/user.go View File

@@ -0,0 +1,114 @@
// Copyright 2015 The Gogs Authors. All rights reserved.
// Copyright 2019 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.

package secure

import (
"net/http"

"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/convert"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/password"
"code.gitea.io/gitea/modules/setting"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/services/mailer"
)

func parseLoginSource(ctx *context.Context, u *models.User, sourceID int64, loginName string) {
if sourceID == 0 {
return
}

source, err := models.GetLoginSourceByID(sourceID)
if err != nil {
if models.IsErrLoginSourceNotExist(err) {
ctx.Error(http.StatusUnprocessableEntity, "", err.Error())
} else {
ctx.Error(http.StatusInternalServerError, "GetLoginSourceByID", err.Error())
}
return
}

u.LoginType = source.Type
u.LoginSource = source.ID
u.LoginName = loginName
}

// CreateUser create a user
func CreateUser(ctx *context.Context, form api.CreateUserOption) {
// swagger:operation POST /admin/users admin adminCreateUser
// ---
// summary: Create a user
// consumes:
// - application/json
// produces:
// - application/json
// parameters:
// - name: body
// in: body
// schema:
// "$ref": "#/definitions/CreateUserOption"
// responses:
// "201":
// "$ref": "#/responses/User"
// "400":
// "$ref": "#/responses/error"
// "403":
// "$ref": "#/responses/forbidden"
// "422":
// "$ref": "#/responses/validationError"

u := &models.User{
Name: form.Username,
FullName: form.FullName,
Email: form.Email,
Passwd: form.Password,
MustChangePassword: false,
IsActive: !setting.Service.RegisterEmailConfirm,
LoginType: models.LoginPlain,
}
if form.MustChangePassword != nil {
u.MustChangePassword = *form.MustChangePassword
}

parseLoginSource(ctx, u, form.SourceID, form.LoginName)
if ctx.Written() {
return
}
if !password.IsComplexEnough(form.Password) {
log.Error("CreateUser failed: PasswordComplexity", ctx.Data["MsgID"])
ctx.JSON(http.StatusBadRequest, map[string]string{
"error_msg": "PasswordComplexity",
})
return
}
if err := models.CreateUser(u); err != nil {
if models.IsErrUserAlreadyExist(err) ||
models.IsErrEmailAlreadyUsed(err) ||
models.IsErrNameReserved(err) ||
models.IsErrNameCharsNotAllowed(err) ||
models.IsErrNamePatternNotAllowed(err) {
log.Error("CreateUser failed:%v", err.Error(), ctx.Data["MsgID"])
ctx.JSON(http.StatusUnprocessableEntity, map[string]string{
"error_msg": err.Error(),
})
} else {
log.Error("CreateUser failed:%v", err.Error(), ctx.Data["MsgID"])
ctx.JSON(http.StatusInternalServerError, map[string]string{
"error_msg": err.Error(),
})
}
return
}
log.Trace("Account created (%s): %s", ctx.User.Name, u.Name, ctx.Data["MsgID"])

// Send email notification.
if form.SendNotify {
mailer.SendRegisterNotifyMail(ctx.Locale, u)
}
ctx.JSON(http.StatusCreated, convert.ToUser(u, ctx.IsSigned, ctx.User.IsAdmin))
}

+ 11
- 2
routers/user/auth.go View File

@@ -535,14 +535,23 @@ func handleSignInFull(ctx *context.Context, u *models.User, remember bool, obeyR
log.Error("Unable to store session: %v", err)
}

// Language setting of the user overwrites the one previously set
// If the user does not have a locale set, we save the current one.
if len(u.Language) == 0 {
u.Language = ctx.Locale.Language()
if len(ctx.GetCookie("lang")) != 0 {
u.Language = ctx.GetCookie("lang")
} else {
u.Language = ctx.Locale.Language()
}

if err := models.UpdateUserCols(u, "language"); err != nil {
log.Error(fmt.Sprintf("Error updating user language [user: %d, locale: %s]", u.ID, u.Language))
return setting.AppSubURL + "/"
}
} else {
// Language setting of the user use the one previously set
if len(ctx.GetCookie("lang")) != 0 {
u.Language = ctx.GetCookie("lang")
}
}

ctx.SetCookie("lang", u.Language, nil, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true)


+ 8
- 8
templates/base/footer_content.tmpl View File

@@ -5,15 +5,15 @@
<div class="ui three column grid">
<div class="column ui vertical text menu">
<div class="header item">{{.i18n.Tr "custom.head.community"}}</div>
<a href="https://www.openi.org.cn/html/Club/2019/0227/14.html" class="item">{{.i18n.Tr "custom.foot.council"}}</a>
<a href="https://www.openi.org.cn/html/Club/2019/0227/14.html" class="item">{{.i18n.Tr "custom.foot.technical_committee"}}</a>
<a href="https://www.openi.org.cn/html/Club/2019/0228/17.html" class="item">{{.i18n.Tr "custom.foot.join"}}</a>
<a href="https://openi.org.cn/html/Club/2019/0227/14.html" class="item">{{.i18n.Tr "custom.foot.council"}}</a>
<a href="https://openi.org.cn/html/Club/2019/0227/14.html" class="item">{{.i18n.Tr "custom.foot.technical_committee"}}</a>
<a href="https://openi.org.cn/html/Club/2019/0228/17.html" class="item">{{.i18n.Tr "custom.foot.join"}}</a>
</div>
<div class="column ui vertical text menu">
<div class="header item">{{.i18n.Tr "custom.foot.news"}}</div>
<a href="https://www.openi.org.cn/html/news/dongtai/" class="item">{{.i18n.Tr "custom.foot.community_news"}}</a>
<a href="https://www.openi.org.cn/html/news/huodong/" class="item">{{.i18n.Tr "custom.foot.member_news"}}</a>
<a href="https://www.openi.org.cn/html/news/zixun/" class="item">{{.i18n.Tr "custom.foot.industry_advisory"}}</a>
<a href="https://openi.org.cn/html/news/dongtai/" class="item">{{.i18n.Tr "custom.foot.community_news"}}</a>
<a href="https://openi.org.cn/html/news/huodong/" class="item">{{.i18n.Tr "custom.foot.member_news"}}</a>
<a href="https://openi.org.cn/html/news/zixun/" class="item">{{.i18n.Tr "custom.foot.industry_advisory"}}</a>
</div>
<div class="column ui vertical text menu">
<div class="header item">{{.i18n.Tr "custom.foot.help"}}</div>
@@ -32,9 +32,9 @@
</div>
</div>
<div class="sixteen wide mobile eight wide tablet eight wide computer column" style=" margin:2.0rem 0">
{{.i18n.Tr "custom.foot.copyright"}} <a href="http://beian.miit.gov.cn/" target="_blank">京ICP备18004880号-2</a>
{{.i18n.Tr "custom.foot.copyright"}} <a href="http://beian.miit.gov.cn/" target="_blank">京ICP备18004880号</a>
<br>
{{.i18n.Tr "powered_by 鹏城实验室云脑、"}}<a href="https://www.trustie.net/" target="_blank">Trustie确实</a>{{.i18n.Tr "、gitea"}}
{{.i18n.Tr "Powered_by 鹏城实验室云脑、"}}<a href="https://www.trustie.net/" target="_blank">Trustie确实</a>{{.i18n.Tr "、gitea"}}
<br>
</div>
</div>


+ 210
- 0
templates/base/head_home.tmpl View File

@@ -0,0 +1,210 @@
<!DOCTYPE html>
<html lang="{{.Language}}">
<head data-suburl="{{AppSubUrl}}">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>{{if .Title}}{{.Title}} - {{end}} {{if .Repository.Name}}{{.Repository.Name}} - {{end}}{{AppName}}</title>
<link rel="manifest" href="{{AppSubUrl}}/manifest.json" crossorigin="use-credentials">
{{if UseServiceWorker}}
<script>
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('{{AppSubUrl}}/serviceworker.js').then(function(registration) {
// Registration was successful
console.info('ServiceWorker registration successful with scope: ', registration.scope);
}, function(err) {
// registration failed :(
console.info('ServiceWorker registration failed: ', err);
});
}
</script>
{{else}}
<script>
if ('serviceWorker' in navigator) {
navigator.serviceWorker.getRegistrations().then(function(registrations) {
registrations.forEach(function(registration) {
registration.unregister();
console.info('ServiceWorker unregistered');
});
});
}
</script>
{{end}}
<meta name="theme-color" content="{{ThemeColorMetaTag}}">
<meta name="author" content="{{if .Repository}}{{.Owner.Name}}{{else}}{{MetaAuthor}}{{end}}" />
<meta name="description" content="{{if .Repository}}{{.Repository.Name}}{{if .Repository.Description}} - {{.Repository.Description}}{{end}}{{else}}{{MetaDescription}}{{end}}" />
<meta name="keywords" content="{{MetaKeywords}}">
<meta name="referrer" content="no-referrer" />
<meta name="_csrf" content="{{.CsrfToken}}" />
{{if .IsSigned}}
<meta name="_uid" content="{{.SignedUser.ID}}" />
{{end}}
{{if .ContextUser}}
<meta name="_context_uid" content="{{.ContextUser.ID}}" />
{{end}}
{{if .SearchLimit}}
<meta name="_search_limit" content="{{.SearchLimit}}" />
{{end}}
{{if .GoGetImport}}
<meta name="go-import" content="{{.GoGetImport}} git {{.CloneLink.HTTPS}}">
<meta name="go-source" content="{{.GoGetImport}} _ {{.GoDocDirectory}} {{.GoDocFile}}">
{{end}}
<script>
{{SafeJS `/*
@licstart The following is the entire license notice for the
JavaScript code in this page.

Copyright (c) 2016 The Gitea Authors
Copyright (c) 2015 The Gogs Authors

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
---
Licensing information for additional javascript libraries can be found at:
{{StaticUrlPrefix}}/vendor/librejs.html

@licend The above is the entire license notice
for the JavaScript code in this page.
*/`}}
</script>
<script>
window.config = {
AppSubUrl: '{{AppSubUrl}}',
StaticUrlPrefix: '{{StaticUrlPrefix}}',
csrf: '{{.CsrfToken}}',
HighlightJS: {{if .RequireHighlightJS}}true{{else}}false{{end}},
Minicolors: {{if .RequireMinicolors}}true{{else}}false{{end}},
SimpleMDE: {{if .RequireSimpleMDE}}true{{else}}false{{end}},
Tribute: {{if .RequireTribute}}true{{else}}false{{end}},
U2F: {{if .RequireU2F}}true{{else}}false{{end}},
Heatmap: {{if .EnableHeatmap}}true{{else}}false{{end}},
heatmapUser: {{if .HeatmapUser}}'{{.HeatmapUser}}'{{else}}null{{end}},
NotificationSettings: {
MinTimeout: {{NotificationSettings.MinTimeout}},
TimeoutStep: {{NotificationSettings.TimeoutStep}},
MaxTimeout: {{NotificationSettings.MaxTimeout}},
EventSourceUpdateTime: {{NotificationSettings.EventSourceUpdateTime}},
},
{{if .RequireTribute}}
tributeValues: [
{{ range .Assignees }}
{key: '{{.Name}} {{.FullName}}', value: '{{.Name}}',
name: '{{.Name}}', fullname: '{{.FullName}}', avatar: '{{.RelAvatarLink}}'},
{{ end }}
],
{{end}}
};
</script>
<link rel="shortcut icon" href="{{StaticUrlPrefix}}/img/favicon.png">
<link rel="mask-icon" href="{{StaticUrlPrefix}}/img/gitea-safari.svg" color="#609926">
<link rel="fluid-icon" href="{{StaticUrlPrefix}}/img/gitea-lg.png" title="{{AppName}}">
<link rel="stylesheet" href="{{StaticUrlPrefix}}/vendor/assets/font-awesome/css/font-awesome.min.css">
<link rel="preload" as="font" href="{{StaticUrlPrefix}}/fomantic/themes/default/assets/fonts/icons.woff2" type="font/woff2" crossorigin="anonymous">
<link rel="preload" as="font" href="{{StaticUrlPrefix}}/fomantic/themes/default/assets/fonts/outline-icons.woff2" type="font/woff2" crossorigin="anonymous">
<link rel="stylesheet" href="/css/git.openi.css">
{{if .RequireSimpleMDE}}
<link rel="stylesheet" href="{{StaticUrlPrefix}}/vendor/plugins/simplemde/simplemde.min.css">
{{end}}

{{if .RequireTribute}}
<link rel="stylesheet" href="{{StaticUrlPrefix}}/vendor/plugins/tribute/tribute.css">
{{end}}
<link rel="stylesheet" href="{{StaticUrlPrefix}}/fomantic/semantic.min.css?v={{MD5 AppVer}}">
<link rel="stylesheet" href="{{StaticUrlPrefix}}/css/index.css?v={{MD5 AppVer}}">
<noscript>
<style>
.dropdown:hover > .menu { display: block; }
.ui.secondary.menu .dropdown.item > .menu { margin-top: 0; }
</style>
</noscript>
{{if .RequireMinicolors}}
<link rel="stylesheet" href="{{StaticUrlPrefix}}/vendor/plugins/jquery.minicolors/jquery.minicolors.css">
{{end}}
<style class="list-search-style"></style>
{{if .PageIsUserProfile}}
<meta property="og:title" content="{{.Owner.Name}}" />
<meta property="og:type" content="profile" />
<meta property="og:image" content="{{.Owner.AvatarLink}}" />
<meta property="og:url" content="{{.Owner.HTMLURL}}" />
{{if .Owner.Description}}
<meta property="og:description" content="{{.Owner.Description}}">
{{end}}
{{else if .Repository}}
{{if .Issue}}
<meta property="og:title" content="{{.Issue.Title}}" />
<meta property="og:url" content="{{.Issue.HTMLURL}}" />
{{if .Issue.Content}}
<meta property="og:description" content="{{.Issue.Content}}" />
{{end}}
{{else}}
<meta property="og:title" content="{{.Repository.Name}}" />
<meta property="og:url" content="{{.Repository.HTMLURL}}" />
{{if .Repository.Description}}
<meta property="og:description" content="{{.Repository.Description}}" />
{{end}}
{{end}}
<meta property="og:type" content="object" />
<meta property="og:image" content="{{.Repository.Owner.AvatarLink}}" />
{{else}}
<meta property="og:title" content="{{AppName}}">
<meta property="og:type" content="website" />
<meta property="og:image" content="{{StaticUrlPrefix}}/img/gitea-lg.png" />
<meta property="og:url" content="{{AppUrl}}" />
<meta property="og:description" content="{{MetaDescription}}">
{{end}}
<meta property="og:site_name" content="{{AppName}}" />
{{if .IsSigned }}
{{ if ne .SignedUser.Theme "gitea" }}
<link rel="stylesheet" href="{{StaticUrlPrefix}}/css/theme-{{.SignedUser.Theme}}.css?v={{MD5 AppVer}}">
{{end}}
{{else if ne DefaultTheme "gitea"}}
<link rel="stylesheet" href="{{StaticUrlPrefix}}/css/theme-{{DefaultTheme}}.css?v={{MD5 AppVer}}">
{{end}}
{{template "custom/header" .}}

<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?7c4ef0a24be6109ab22e63c832ab21cf";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
</head>
<body>
{{template "custom/body_outer_pre" .}}

<div class="full height">
<noscript>{{.i18n.Tr "enable_javascript"}}</noscript>
<div class="ui vertical masthead secondary hometop segment">
{{template "custom/body_inner_pre" .}}

{{if not .PageIsInstall}}
<div class="ui container">
<div class="ui top secondary stackable main menu following bar">
{{template "base/head_navbar_home" .}}
</div><!-- end bar -->
</div>
{{end}}
{{/*
</div>
</div>
</body>
</html>
*/}}

+ 2
- 2
templates/base/head_navbar.tmpl View File

@@ -1,7 +1,7 @@
<div class="ui container" id="navbar">
<div class="item brand" style="justify-content: space-between;">
<a href="https://openi.org.cn/">
<img class="ui mini image" src="{{StaticUrlPrefix}}/img/openi-logo-w.svg?v=2020091401">
<img class="ui mini image" src="{{StaticUrlPrefix}}/img/logo-w.svg">
</a>
<div class="ui basic icon button mobile-only" id="navbar-expand-toggle">
<i class="sidebar icon"></i>
@@ -31,7 +31,7 @@
</div>
</div>
{{else if .IsLandingPageHome}}
<a class="item {{if .PageIsHome}}active{{end}}" href="{{AppSubUrl}}/user/login?redirect_to={{.Link}}">{{.i18n.Tr "home"}}</a>
<a class="item {{if .PageIsHome}}active{{end}}" href="{{AppSubUrl}}/dashboard">{{.i18n.Tr "home"}}</a>
<a class="item" href="{{AppSubUrl}}/OpenI">{{.i18n.Tr "custom.head.openi"}}</a>

<div class="ui dropdown item">


+ 161
- 0
templates/base/head_navbar_home.tmpl View File

@@ -0,0 +1,161 @@
<div class="ui container" id="navbar">
<div class="item brand" style="justify-content: space-between;">
<a href="https://openi.org.cn/">
<img class="ui mini image" src="{{StaticUrlPrefix}}/img/logo.svg">
</a>
<div class="ui basic icon button mobile-only" id="navbar-expand-toggle">
<i class="sidebar icon"></i>
</div>
</div>

{{if .IsSigned}}
<a class="item {{if .PageIsDashboard}}active{{end}}" href="/dashboard">{{.i18n.Tr "index"}}</a>
<a class="item" href="{{AppSubUrl}}/OpenI">{{.i18n.Tr "custom.head.openi"}}</a>
{{if not .UnitIssuesGlobalDisabled}}
<a class="item {{if .PageIsIssues}}active{{end}}" href="{{AppSubUrl}}/issues">{{.i18n.Tr "issues"}}</a>
{{end}}
{{if not .UnitPullsGlobalDisabled}}
<a class="item {{if .PageIsPulls}}active{{end}}" href="{{AppSubUrl}}/pulls">{{.i18n.Tr "pull_requests"}}</a>
{{end}}
{{if not (and .UnitIssuesGlobalDisabled .UnitPullsGlobalDisabled)}}
{{if .ShowMilestonesDashboardPage}}<a class="item {{if .PageIsMilestonesDashboard}}active{{end}}" href="{{AppSubUrl}}/milestones">{{.i18n.Tr "milestones"}}</a>{{end}}
{{end}}
<div class="ui dropdown item">
{{.i18n.Tr "explore"}}
<i class="dropdown icon"></i>
<div class="menu">
<a class="item" href="{{AppSubUrl}}/explore/repos">{{.i18n.Tr "custom.head.project"}}</a>
<a class="item" href="{{AppSubUrl}}/explore/datasets">{{.i18n.Tr "custom.head.dataset"}}</a>
<a class="item" href="{{AppSubUrl}}/explore/users">{{.i18n.Tr "explore.users"}}</a>
<a class="item" href="{{AppSubUrl}}/explore/organizations">{{.i18n.Tr "explore.organizations"}}</a>
</div>
</div>
{{else if .IsLandingPageHome}}
<a class="item {{if .PageIsHome}}active{{end}}" href="{{AppSubUrl}}/dashboard">{{.i18n.Tr "home"}}</a>
<a class="item" href="{{AppSubUrl}}/OpenI">{{.i18n.Tr "custom.head.openi"}}</a>

<div class="ui dropdown item">
{{.i18n.Tr "explore"}}
<i class="dropdown icon"></i>
<div class="menu">
<a class="item" href="{{AppSubUrl}}/explore/repos">{{.i18n.Tr "custom.head.project"}}</a>
<a class="item" href="{{AppSubUrl}}/explore/datasets">{{.i18n.Tr "datasets"}}</a>
<a class="item" href="{{AppSubUrl}}/explore/users">{{.i18n.Tr "explore.users"}}</a>
<a class="item" href="{{AppSubUrl}}/explore/organizations">{{.i18n.Tr "explore.organizations"}}</a>
</div>
</div>
{{else if .IsLandingPageExplore}}
<a class="item {{if .PageIsExplore}}active{{end}}" href="{{AppSubUrl}}/explore/repos">{{.i18n.Tr "home"}}</a>
{{else if .IsLandingPageOrganizations}}
<a class="item {{if .PageIsExplore}}active{{end}}" href="{{AppSubUrl}}/explore/organizations">{{.i18n.Tr "home"}}</a>
{{end}}

{{template "custom/extra_links" .}}

{{/*
<div class="item">
<div class="ui icon input">
<input class="searchbox" type="text" placeholder="{{.i18n.Tr "search_project"}}">
<i class="search icon"></i>
</div>
</div>
*/}}

{{if .IsSigned}}
<div class="right stackable menu">
<a href="{{AppSubUrl}}/notifications" class="item poping up" data-content='{{.i18n.Tr "notifications"}}' data-variation="tiny inverted">
<span class="text">
<span class="fitted">{{svg "octicon-bell" 16}}</span>
<span class="sr-mobile-only">{{.i18n.Tr "notifications"}}</span>
{{$notificationUnreadCount := 0}}
{{if .NotificationUnreadCount}}{{$notificationUnreadCount = call .NotificationUnreadCount}}{{end}}
<span class="ui red label {{if not $notificationUnreadCount}}hidden{{end}} notification_count">
{{$notificationUnreadCount}}
</span>
</span>
</a>

<div class="ui dropdown jump item poping up" data-content="{{.i18n.Tr "create_new"}}" data-variation="tiny inverted">
<span class="text">
<span class="fitted">{{svg "octicon-plus" 16}}</span>
<span class="sr-mobile-only">{{.i18n.Tr "create_new"}}</span>
<span class="fitted not-mobile">{{svg "octicon-triangle-down" 16}}</span>
</span>
<div class="menu">
<a class="item" href="{{AppSubUrl}}/repo/create">
<span class="fitted">{{svg "octicon-plus" 16}}</span> {{.i18n.Tr "new_repo"}}
</a>
<a class="item" href="{{AppSubUrl}}/repo/migrate">
<span class="fitted">{{svg "octicon-repo-clone" 16}}</span> {{.i18n.Tr "new_migrate"}}
</a>
{{if .SignedUser.CanCreateOrganization}}
<a class="item" href="{{AppSubUrl}}/org/create">
<span class="fitted">{{svg "octicon-organization" 16}}</span> {{.i18n.Tr "new_org"}}
</a>
{{end}}
</div><!-- end content create new menu -->
</div><!-- end dropdown menu create new -->

<div class="ui dropdown jump item poping up" tabindex="-1" data-content="{{.i18n.Tr "user_profile_and_more"}}" data-variation="tiny inverted">
<span class="text">
<img class="ui tiny avatar image" width="24" height="24" src="{{.SignedUser.RelAvatarLink}}">
<span class="sr-only">{{.i18n.Tr "user_profile_and_more"}}</span>
<span class="mobile-only">{{.SignedUser.Name}}</span>
<span class="fitted not-mobile" tabindex="-1">{{svg "octicon-triangle-down" 16}}</span>
</span>
<div class="menu user-menu" tabindex="-1">
<div class="ui header">
{{.i18n.Tr "signed_in_as"}} <strong>{{.SignedUser.Name}}</strong>
</div>

<div class="divider"></div>
<a class="item" href="{{AppSubUrl}}/{{.SignedUser.Name}}">
{{svg "octicon-person" 16}}
{{.i18n.Tr "your_profile"}}<!-- Your profile -->
</a>
<a class="item" href="{{AppSubUrl}}/{{.SignedUser.Name}}?tab=stars">
{{svg "octicon-star" 16}}
{{.i18n.Tr "your_starred"}}
</a>
<a class="{{if .PageIsUserSettings}}active{{end}} item" href="{{AppSubUrl}}/user/settings">
{{svg "octicon-settings" 16}}
{{.i18n.Tr "your_settings"}}<!-- Your settings -->
</a>
<!--a class="item" target="_blank" rel="noopener noreferrer" href="https://docs.gitea.io">
{{svg "octicon-question" 16}}
{{.i18n.Tr "help"}}<!-- Help -->
</a-->
{{if .IsAdmin}}
<div class="divider"></div>

<a class="{{if .PageIsAdmin}}active{{end}} item" href="{{AppSubUrl}}/admin">
<i class="icon settings"></i>
{{.i18n.Tr "admin_panel"}}<!-- Admin Panel -->
</a>
{{end}}

<div class="divider"></div>
<a class="item link-action" href data-url="{{AppSubUrl}}/user/logout" data-redirect="{{AppSubUrl}}/">
{{svg "octicon-sign-out" 16}}
{{.i18n.Tr "sign_out"}}<!-- Sign Out -->
</a>
</div><!-- end content avatar menu -->
</div><!-- end dropdown avatar menu -->
</div><!-- end signed user right menu -->

{{else}}

<!--a class="item" target="_blank" rel="noopener noreferrer" href="https://docs.gitea.io">{{.i18n.Tr "help"}}</a-->
<div class="right stackable menu">
{{if .ShowRegistrationButton}}
<a class="item{{if .PageIsSignUp}} active{{end}}" href="{{AppSubUrl}}/user/sign_up">
{{svg "octicon-person" 16}} {{.i18n.Tr "register"}}
</a>
{{end}}
<a class="item{{if .PageIsSignIn}} active{{end}}" rel="nofollow" href="{{AppSubUrl}}/user/login?redirect_to={{.Link}}">
{{svg "octicon-sign-in" 16}} {{.i18n.Tr "sign_in"}}
</a>
</div><!-- end anonymous right menu -->

{{end}}
</div>

+ 1
- 1
templates/explore/repo_list.tmpl View File

@@ -33,7 +33,7 @@
<img class="ui avatar image" src="{{.RelAvatarLink}}">
{{end}}
<a class="name" href="{{.Link}}">
{{if or $.PageIsExplore $.PageIsProfileStarList }}{{if .Owner}}{{.Owner.Name}} / {{end}}{{end}}{{.Name}}
{{if or $.PageIsExplore $.PageIsProfileStarList }}{{if .Owner}}{{.Owner.Name}} <span>/</span> {{end}}{{end}}<strong>{{.Name}}</strong>
{{if .IsArchived}}<i class="archive icon archived-icon"></i>{{end}}
</a>
{{if .IsPrivate}}


+ 1
- 4
templates/explore/repo_right.tmpl View File

@@ -1,4 +1 @@
<a href="https://openi.org.cn/html/2020/qimengxingdong_0813/450.html" target="_blank"><img class="ui mini image" src="/img/banner-qimen-4X3.jpg" style="width:100%;"></a>
<div style="margin:16px 0;display:flex;justify-content:center">
<a class="ui blue button" href="mailto:secretariat@openi.org.cn?subject=申请贡献项目到OpenI&&body=贡献者自我介绍%3A%0D%0A申请理由%3A%0D%0A 项目地址%3A%0D%0A 联系方式%3A">申请贡献项目到OpenI</a>
<div>
<a href="https://openi.org.cn/html/2020/qimengxingdong_0813/450.html" target="_blank"><img class="ui mini image" src="/img/banner-qimen-4X3.jpg" style="width:100%;"></a>

+ 174
- 230
templates/home.tmpl View File

@@ -1,264 +1,208 @@
{{template "base/head" .}}
{{template "base/head_home" .}}
<div class="ui container homebanner">
<h1 class="ui header">
启智AI开发协作平台
<div class="sub header">
面向AI领域的一站式协同开发环境
</div>
</h1>
<p class="am-lh-18">免费私有代码仓库,免费计算资源,大容量数据存储,<br>多类型硬件环境(GPU、NPU),AI开发流水线(开发-调试-训练-迭代)</p>
<a class="circular ui secondary button" href="{{AppSubUrl}}/user/sign_up">立即使用 <i class="right arrow icon"></i></a>
<div class="bannerpic"><img class="ui fluid image" src="/img/gitopeni-index-01.svg"></div>
</div>
</div><!-- end segment -->

<div class="home">
<script>
var head = document.head || document.getElementsByTagName('head')[0];
var t = document.createElement('base'); //创建title元素
t.target = '_blank'; //设置标题内容
head.appendChild(t);
<div class="explore repositories">
<div class="ui sticky container">
<div class="ui secondary pointing fluid five item menu" style="background-color: #FFF;">
<a class="item" href="#first">代码</a>
<a class="item" href="#second">数据</a>
<a class="item" href="#third">AI流水线</a>
<a class="item" href="#fourth">协同开发</a>
<a class="item" href="#fifth">云脑协同</a>
</div>
</div>

document.addEventListener('DOMContentLoaded', function() {
particleground(document.getElementById('particles'), {
dotColor: 'rgba(0,176,240,0.2)',
lineColor: 'rgba(68,114,196,0.1)'
});
var intro = document.getElementById('intro');
if (intro) {
intro.style.marginTop = -intro.offsetHeight / 2 + 'px';
}
}, false);
</script>
<div id="index-project">
<div id="particles"></div>
<div class="center aligned ui container inverted segment">
<!--内容宽度,默认1127px-->
<h1 class="ui header section--header">启智社区
<p class="sub header">Open Intelligence,Open Source,Open Community,Open Ecosystem</p>
</h1>
<div class="ui six column grid prorow">
<div class="eight wide mobile four wide tablet four wide computer column ipros">
<div class="ui card">
<div class="image"><img src="https://www.openi.org.cn/statics/openi/images/index/openi-paddle.png" style=" height:20px;"></div>
<div class="content ui grid">
<div class="header right aligned eight wide column" style=" border-right:2px solid #ffc000">
<span style="color: #5170ff;">OpenI</span> <b style="color:#FFF">DL</b>
</div>
<div class="header left aligned eight wide column">
<span style="color: #5170ff;">OpenI</span> <b style="color:#ffc000">RL</b>
</div>
</div>
<div class="extra content">
<div class="center floated author">
贡献者:百度
</div>
</div>
<div id="railContent">
<a name="first"></a>
<div class="ui container am-mt-30 basic tab i-code active" style="position: relative;">
<div class="ui inverted very padded segment radius15 am-pl-30">
<div class="ui mobile reversed stackable grid am-pl-30">
<div class="six wide column">
<h2 class="ui huge blue header">代码管理</h2>
<p class="am-lh-18">在这里为你和你的团队创建项目,基于Git工具,提交记录或者回滚代码修改。<br>
不论是公开或者私有仓库,都可免费使用所有功能。<br>
尽情将你喜欢的代码都放在这里,仓库数量、存储容量不受限</p>
<a class="ui blue basic button am-mt-20" href="{{AppSubUrl}}/user/sign_up">立即使用</a>
</div>
<a class="flip" href="https://openi.org.cn/projects/paddle/"></a>
</div>
<div class="eight wide mobile three wide tablet three wide computer column ipros">
<div class="ui card">
<div class="image">
<img src="https://www.openi.org.cn/statics/openi/images/index/openi-tianyuan.png" alt="Brain++·天元" style=" height:50px;">
</div>
<div class="content">
<div class="header">Brain++·天元</div>
</div>
<div class="extra content">
<div class="center floated author">
贡献者:旷视
</div>
</div>
<div class="ten wide column computer only i-code-pic am-pt-30">
<img class="ui fluid rounded image am-shadow-2 am-mt-10" src="/img/i-code-pic.jpg" style="position: absolute;">
</div>
<a class="flip" href="https://openi.org.cn/projects/megengine/"></a>
</div>
<div class="eight wide mobile four wide tablet four wide computer column ipros">
<div class="ui card">
<div class="content ui grid">
<div class="header eight wide column" style=" border-right:2px solid #ffc000">
<div><span style="color: #5170ff;">OpenI</span> <b style="color:#FFF">天璇</b></div>

</div>
<div class="header eight wide column">
<div><span style="color: #5170ff;">OpenI</span> <b style="color:#FFF">天枢</b></div>
</div>
</div>
<div class="am-mt-30 am-pt-30 am-pl-30">
<div class="am-pl-30 am-pb-30">
<h2 class="ui huge header am-bw">协作开发</h2>
<p class="am-lh-18">鼓励通过创建合并请求(PR)的方式,更好的进行团队协作<br>
代码评审让每一次的代码修改得以二次确认,提高代码质量<br>
创建并指派任务(Issue),让每一个任务的进展有迹可循,规范管理<br>
被合并的PR,可获得奖励积分;积分总额可以显示出你在项目中的贡献度,也许有一天会有人愿意为此付费<br>
</p>
</div>
</div>
<div class="leftline01"></div>
</div>

</div>
<div class="eight wide column" style=" border-right:2px solid #ffc000; padding-top:0">
<div class="meta">AVS3 解码</div>
</div>
<div class="eight wide column" style="padding-top:0">
<div class="meta">AVS3 编码</div>
</div>
</div>
<div class="extra content">
<div class="center floated author">
贡献者:北大深研院、鹏城实验室、深圳市超高清创新中心
</div>
</div>
</div>
<a class="flip" href="http://openi.org.cn/projects/uavs3e/"></a>
</div>
<div class="eight wide mobile three wide tablet three wide computer column ipros">
<div class="ui card">
<div class="content">
<div class="header" style=" padding-top:0.8em;padding-bottom:0.5em"><span style="color: #5170ff;">OpenI</span> <b style="color:#FFF">海参</b></div>
<div class="meta">基于深度学习的视频智能编码</div>
</div>
<div class="extra content">
<div class="center floated author">
贡献者:鹏城实验室、北大、武大、中科大、哈工大
</div>
<a name="second"></a>
<div class="ui basic tab active am-mt-30 bg-gray am-pt-30">
<div class="ui container i-data" style="position: relative;">
<div class="leftline02"></div>
<div class="ui stackable grid">
<div class="nine wide column">
<img class="ui centered medium rounded large image" src="/img/gitopeni-index-02.svg">
<div class="i-code-pic" style="margin-top: -4.0rem;">
<img class="ui fluid rounded image am-shadow-2" src="/img/i-data-pic.jpg">
</div>
</div>
<a class="flip" href="https://openi.org.cn/projects/dlvc/"></a>
</div>
<div class="sixteen wide mobile two wide tablet two wide computer column">
<div class="ui card">
<div class="content">
<div class="header"><i class="ellipsis horizontal icon"></i></div>
</div>
<div class="seven wide column am-pt-30">
<h2 class="ui huge blue header">数据集管理</h2>
<p class="am-lh-18">
数据是重要的生产要素,AI开发更是离不开数据;<br>
- 数据与模型代码的协同,可在项目中上传关联的数据集;<br>
- 数据存储免费,不限制文件大小;<br>
- 数据可共享,标注清洗过的公开数据集,用户可设置为公有数据,供社区用户下载;
</p>
<div class="am-mt-30 am-pt-20"></div>
<h2 class="ui huge header">使用数据集</h2>
<p class="am-lh-18">
数据集可以直接用于训练或者推理任务中<br>
创建任务时选择对应的数据集,启动任务执行环境(Docker)后,即可在Docker内访问到你的代码和数据,就像在你本地执行一样
</p>
</div>
<div class="flip flip-more"></div>
</div>
</div>
<div class="ui divider" style="margin-top:2.0em; margin-bottom:2.0em;"></div>
</div>

<div class="ui six column grid prorow">
<div class="eight wide mobile four wide tablet four wide computer column ipros">
<div class="ui card">
<div class="image">
<img src="https://www.openi.org.cn/statics/openi/images/index/openi-octopus.png" alt="启智章鱼" style=" height:50px;">
</div>
<div class="content">
<div class="meta">新一代智能资源管理系统</div>
</div>
<div class="extra content">
<div class="center floated author">
贡献者:鹏城实验室、北大
</div>
</div>
</div>
<a class="flip flip-blue" href="http://openi.org.cn/projects/octopus/"></a>
</div>
<div class="eight wide mobile three wide tablet three wide computer column ipros">
<div class="ui card">
<div class="image">
<img src="https://www.openi.org.cn/statics/openi/images/index/openi-shanhu.png" alt="OpenI珊瑚" style=" height:50px;">
</div>
<div class="content">
<div class="meta">异构资源调度项目</div>
</div>
<div class="extra content">
<div class="center floated author">
贡献者:华为
</div>
</div>
<a name="third"></a>
<div class="ui basic tab active container am-mt-30 am-pt-30">
<h2 class="ui center aligned huge blue header am-pt-30">
AI流水线
<div class="sub header am-mt-10">提供集代码开发、数据管理、模型调试、推理和评测为一体的AI开发流水线</div>
</h2>
<div class="ui divider"></div>
<div class="ui centered grid">
<div class="fourteen wide column">
<div class="ui two column grid">
<div class="column">
<div class="ui small header">调试任务:</div>
<div class="ui bulleted list">
<div class="item">配置模型运行环境;</div>
<div class="item">可在线编辑和调试模型代码,并将改动更新至代码仓库;</div>
<div class="item">基于编辑好的脚本,开展模型评测任务;</div>
</div>
</div>
<div class="column">
<div class="ui small header">作业任务:</div>
<div class="ui bulleted list">
<div class="item">利用已配置好的模型运行环境;</div>
<div class="item">基于编辑好的脚本,一键运行,开展模型训练或模型推理任务;</div>
</div>
</div>
</div>
</div>
</div>
<div class="ui divider"></div>
<img class="ui centered image" src="/img/develop.svg">
</div>

<a name="fourth"></a>
<div class="ui basic tab active container am-mt-30 am-pt-30 i-env">
<h2 class="ui center aligned huge blue header am-pt-30">
协同开发环境
<div class="sub header am-mt-10">启智AI协作开发平台与传统git平台最大的不同就在于提供了面向AI开发的协同开发环境</div>
</h2>
<div class="ui four stackable cards am-mt-20">
<div class="card">
<div class="image">
<img src="/img/i-pic-01.svg">
</div>
<a class="flip flip-blue" href="http://openi.org.cn/projects/coral/"></a>
</div>
<div class="five wide mobile three wide tablet three wide computer column ipros">
<div class="ui card">
<div class="image">
<img src="https://www.openi.org.cn/statics/openi/images/index/openi-trustie.png" alt="启智Trustie" style=" height:50px;">
</div>
<div class="content">
<div class="meta">群体化协同创新环境</div>
</div>
<div class="extra content">
<div class="center floated author">
贡献者:国防科大、北航、北大…
</div>
<div class="content">
<a class="ui centered header">开发要素统一管理</a>
<div class="description">
平台提供了AI开发四大要素:模型代码、数据集、模型和执行环境的统一管理
</div>
</div>
<a class="flip flip-green" href="http://openi.org.cn/projects/forge/"></a>
</div>
<div class="five wide mobile three wide tablet three wide computer column ipros">
<div class="ui card">
<div class="image">
<img src="https://www.openi.org.cn/statics/openi/images/index/huawei.png" alt="华为" style=" height:25px; margin-top:32px;">
</div>
<div class="content">
<div class="meta">华为软开云</div>
</div>
<div class="card">
<div class="image">
<img src="/img/i-pic-02.svg">
</div>
<a class="flip flip-green"></a>
</div>
<div class="six wide mobile three wide tablet three wide computer column ipros">
<div class="ui card">
<div class="image">
<img src="https://www.openi.org.cn/statics/openi/images/index/openi-zhongheng.png" alt="OpenI 纵横" style=" height:50px;">
</div>
<div class="content">
<div class="meta">数据协同环境</div>
</div>
<div class="extra content">
<div class="center floated author">
贡献者:微众银行
</div>
<div class="content">
<a class="ui centered header">数据协同与共享</a>
<div class="description">
通过在项目中上传数据集,项目成员多人协作完成数据预处理;也可以通过将数据设置为公有数据集,与社区开发者共同建立更好的模型
</div>
</div>
<a class="flip flip-green" href="http://openi.org.cn/projects/zongheng/"></a>
</div>
</div>
<div class="ui divider" style="margin-top:2.0em; margin-bottom:2.0em;"></div>

<div class="ui six column grid prorow">
<div class="sixteen wide mobile six wide tablet six wide computer column ipros">
<div class="content ui grid">
<div class="header sixteen wide column">
<div class="ui centered card" style=" margin-top:0.5em; margin-bottom:0.5em;">
<div class="content">
<div class="header">鹏城云脑1、2</div>
</div>
</div>
<a class="flip flip-green"></a>
</div>
<div class="header sixteen wide column">
<div class="ui centered card" style=" margin-top:0.5em; margin-bottom:0.5em;">
<div class="content">
<div class="header">北京、合肥、苏州…</div>
</div>
</div>
<a class="flip flip-green"></a>
</div>
<div class="card">
<div class="image">
<img src="/img/i-pic-03.svg">
</div>
</div>
<div class="eight wide mobile two wide tablet four wide computer column ipros">
<div class="ui card">
<div class="content">
<div class="header" style=" padding-top:0.8em;padding-bottom:0.5em"><span style="color: #5170ff;">OpenI</span> <b style="color:#FFF">海藻</b></div>
<div class="meta">可配置指令集和微架构的AI开源芯片</div>
</div>
<div class="extra content">
<div class="center floated author">
贡献者:北大、中科院、鹏城实验室
</div>
<div class="content">
<a class="ui centered header">模型管理与共享</a>
<div class="description">
将模型与代码版本建立关联,可以基于代码历史版本,使用不同的方式调整模型,并将结果保存下来;训练好的模型可以开放共享,让更多人的使用模型测试并提出反馈
</div>
</div>
<a class="flip flip-green" href="http://openi.org.cn/projects/varec/"></a>
</div>
<div class="eight wide mobile three wide tablet four wide computer column ipros">
<div class="ui card">
<div class="image">
<img src="https://www.openi.org.cn/statics/openi/images/index/huaweicloud.png" alt="华为云" style=" height:50px; margin-top:32px;">
</div>
<div class="card">
<div class="image">
<img src="/img/i-pic-04.svg">
</div>
<a class="flip flip-green"></a>
</div>
<div class="sixteen wide mobile two wide tablet two wide computer column">
<div class="ui card">
<div class="content">
<div class="header"><i class="ellipsis horizontal icon"></i></div>
<div class="content">
<a class="ui centered header">一次配置,多次使用</a>
<div class="description">
提供执行环境共享,一次配置,多次使用,降低模型开发门槛,避免花费重复的时间配置复杂的环境
</div>
</div>
<div class="flip flip-more"></div>
</div>
</div>
</div>
</div>

<div class="ui stackable middle very relaxed page grid">
<div class="center column">
<h1 class="ui header section--header" style=" margin-top:1.0em">启智社区期待您的加入</h1>
<p class="large" style="padding: 0 0 43px;">
OpenI社区旨在促进人工智能领域的开源开放协同创新,构建OpenI的技术链、创新链和生态链、推动人工智能产业健康快速发展及其在社会经济各领域的广泛应用。围绕重大产业创新,汇聚创新资源,促进众创共享,形成产业生态的目标,让"一体两翼"构想下的以技术专家为主体组成的多个工作组(标准工作组、知识产权工作组、投融资工作组、开源治理工作组等)、和以企业为主体的多个应用推进组(智能交通推进组、智能医疗推进组、智能金融推进组、智能教育推进组等)作为一个整体进行工作。以"完全开源、完全开放、完全免费、尊重创新"为准则,汇聚学术机构、商业实体、自然人或任何其他法人,共建共享开源软件、开源硬件和开源数据的超级社区;以众智、赛智、创智、有智等工作方法,努力建设成具有国际影响力的人工智能开源开放平台。
</p>
<a class="ui blue button" href="mailto:secretariat@openi.org.cn?subject=申请贡献项目到OpenI&&body=贡献者自我介绍%3A%0D%0A申请理由%3A%0D%0A 项目地址%3A%0D%0A 联系方式%3A">申请贡献项目到OpenI</a>
<a class="ui blue button" href="https://www.openi.org.cn/html/Club/2019/0228/17.html" style="padding-left:5.0rem;padding-right:5.0rem;">加入OpenI社区 <i class="arrow right icon"></i></a>
<div style="margin-top:80px;">
<img src="https://www.openi.org.cn/statics/openi/images/index/mem-logos.png" alt="OpenI前期参与成员" style="width:100%; max-width:1200px;">
<a name="fifth"></a>
<div class="ui basic tab active container am-mt-30 am-pt-30">
<div class="ui very padded black inverted segment radius15">
<div class="ui stackable grid">
<div class="six wide column">
<img class="ui centered large image" src="/img/i-yunnao.svg">
</div>
<div class="ten wide column am-pt-30">
<h2 class="ui huge blue header">鹏城云脑开源协同</h2>
<p class="am-lh-18">
平台已经与鹏城云脑打通,可以利用鹏城云脑的丰富算力资源,完成AI开发任务<br>
鹏城云脑现有AI算力100P FLOPS@FP16(每秒十亿亿次半精度浮点计算),主要硬件基础设施由搭载英伟达Tesla V100 的GPU服务器和搭载鲲鹏、昇腾处理器的Atlas 900 AI集群构成<br>
开发者可以根据使用需求,自由选择相应计算资源,可以测试模型在不同硬件环境下的适配能力、性能、稳定性等<br>
如果您的模型需要更多的计算资源,也可以单独申请<br>
</p>
<a class="ui blue basic button am-mt-20" href="{{AppSubUrl}}/user/sign_up">马上使用</a> <a class="ui grey basic button am-mt-20" href="mailto:aiforge@openi.org.cn">单独申请</a>
</div>
</div>
</div>
</div>
</div>
<div class="am-mt-30"></div>

</div><!-- end railContent -->

</div><!-- end explore -->
<script>
$('.menu .item')
.tab();
$('.ui.sticky')
.sticky({
context: '#railContent',
observeChanges: true,
})
.sticky('refresh');
</script>

</div>
{{template "base/footer" .}}

+ 18
- 14
templates/org/navber.tmpl View File

@@ -1,14 +1,16 @@
<div class="tablet only mobile only sixteen wide mobile sixteen wide tablet column row">
<div class="ui secondary pointing tabular top attached borderless menu navbar">
<a class="{{if $.PageIsOrgHome}}active{{end}} item" href="{{.HomeLink}}">
{{svg "octicon-home" 16}}&nbsp;{{$.i18n.Tr "org.组织主页"}}
</a>
<a class="{{if $.PageIsOrgMembers}}active{{end}} item" href="{{$.OrgLink}}/members">
{{svg "octicon-organization" 16}}&nbsp;{{$.i18n.Tr "org.people"}}
</a>
<a class="{{if $.PageIsOrgTeams}}active{{end}} item" href="{{$.OrgLink}}/teams">
{{svg "octicon-jersey" 16}}&nbsp;{{$.i18n.Tr "org.teams"}}
{{svg "octicon-home" 16}}&nbsp;{{$.i18n.Tr "org.home"}}
</a>
{{if or ($.IsOrganizationMember) ($.IsOrganizationOwner)}}
<a class="{{if $.PageIsOrgMembers}}active{{end}} item" href="{{$.OrgLink}}/members">
{{svg "octicon-organization" 16}}&nbsp;{{$.i18n.Tr "org.people"}}
</a>
<a class="{{if $.PageIsOrgTeams}}active{{end}} item" href="{{$.OrgLink}}/teams">
{{svg "octicon-jersey" 16}}&nbsp;{{$.i18n.Tr "org.teams"}}
</a>
{{end}}
</div>
</div>
<!--平板、移动端-->
@@ -18,15 +20,17 @@
<div class="sixteen wide column ui secondary sticky pointing tabular vertical menu">
{{with .Org}}
<a class="{{if $.PageIsOrgHome}}active{{end}} item" href="{{.HomeLink}}">
{{svg "octicon-home" 16}}&nbsp;{{$.i18n.Tr "org.主页"}}
{{svg "octicon-home" 16}}&nbsp;{{$.i18n.Tr "org.home"}}
</a>
{{end}}
<a class="{{if $.PageIsOrgMembers}}active{{end}} item" href="{{$.OrgLink}}/members">
{{svg "octicon-organization" 16}}&nbsp;{{$.i18n.Tr "org.people"}}
</a>
<a class="{{if $.PageIsOrgTeams}}active{{end}} item" href="{{$.OrgLink}}/teams">
{{svg "octicon-jersey" 16}}&nbsp;{{$.i18n.Tr "org.teams"}}
</a>
{{if or ($.IsOrganizationMember) ($.IsOrganizationOwner)}}
<a class="{{if $.PageIsOrgMembers}}active{{end}} item" href="{{$.OrgLink}}/members">
{{svg "octicon-organization" 16}}&nbsp;{{$.i18n.Tr "org.people"}}
</a>
<a class="{{if $.PageIsOrgTeams}}active{{end}} item" href="{{$.OrgLink}}/teams">
{{svg "octicon-jersey" 16}}&nbsp;{{$.i18n.Tr "org.teams"}}
</a>
{{end}}
</div>
</div>
</div>

+ 2
- 2
templates/repo/create.tmpl View File

@@ -31,13 +31,13 @@
{{end}}
</div>
</div>
<span class="help">Some organizations may not show up in the dropdown due to a maximum repository count limit</span>
<span class="help">{{.i18n.Tr "repo.repo_owner_helper"}}</span>
</div>

<div class="inline required field {{if .Err_RepoName}}error{{end}}">
<label for="repo_name">{{.i18n.Tr "repo.repo_name"}}</label>
<input id="repo_name" name="repo_name" value="{{.repo_name}}" autofocus required>
<span class="help">{{.i18n.Tr "repo.repo_name_helper"}}</span>
<span class="help"></span>
</div>
<div class="inline field">
<label>{{.i18n.Tr "repo.visibility"}}</label>


+ 103
- 38
templates/repo/home.tmpl View File

@@ -1,13 +1,40 @@
{{template "base/head" .}}
<style>
.repository.file.list #repo-desc {
font-size: 1.0em;
margin-bottom: 1.0rem;
}
</style>
<div class="repository file list">
{{template "repo/header" .}}
<div class="ui container">
{{template "base/alert" .}}
<div class="ui repo-description stackable grid">
<div id="repo-desc" class="ui twelve wide column">
{{if .Repository.DescriptionHTML}}<span class="description">{{.Repository.DescriptionHTML}}</span>{{else if .IsRepositoryAdmin}}<span class="no-description text-italic">{{.i18n.Tr "repo.no_desc"}}</span>{{end}}
<a class="link" href="{{.Repository.Website}}">{{.Repository.Website}}</a>
{{if and .Permission.IsAdmin (not .Repository.IsArchived)}}
<div class="ui repo-topic-edit grid form segment error" id="topic_edit" style="display:none">
<div class="fourteen wide column">
<div class="field">
<div class="ui fluid multiple search selection dropdown">
<input type="hidden" name="topics" value="{{range $i, $v := .Topics}}{{.Name}}{{if lt (Add $i 1) (len $.Topics)}},{{end}}{{end}}">
{{range .Topics}}
<div class="ui small label topic transition visible" data-value="{{.Name}}" style="display: inline-block !important; cursor: default;">{{.Name}}<i class="delete icon"></i></div>
{{end}}
<div class="text"></div>
</div>
</div>
</div>
<div class="two wide column">
<a class="ui button primary" href="javascript:;" id="save_topic"
data-link="{{.RepoLink}}/topics">{{.i18n.Tr "repo.topic.done"}}</a>
</div>
</div>
{{end}}
<div class="hide" id="validate_prompt">
<span id="count_prompt">{{.i18n.Tr "repo.topic.count_prompt"}}</span>
<span id="format_prompt">{{.i18n.Tr "repo.topic.format_prompt"}}</span>
</div>
<div class="ui repo-description stackable grid">

{{if .RepoSearchEnabled}}
<div class="ui repo-search four wide column">
<form class="ui form ignore-dirty" action="{{.RepoLink}}/search" method="get">
@@ -23,33 +50,7 @@
</div>
{{end}}
</div>
<div class="ui" id="repo-topics">
{{range .Topics}}<a class="ui repo-topic small label topic" href="{{AppSubUrl}}/explore/repos?q={{.Name}}&topic=1">{{.Name}}</a>{{end}}
{{if and .Permission.IsAdmin (not .Repository.IsArchived)}}<a id="manage_topic">{{.i18n.Tr "repo.topic.manage_topics"}}</a>{{end}}
</div>
{{if and .Permission.IsAdmin (not .Repository.IsArchived)}}
<div class="ui repo-topic-edit grid form segment error" id="topic_edit" style="display:none">
<div class="fourteen wide column">
<div class="field">
<div class="ui fluid multiple search selection dropdown">
<input type="hidden" name="topics" value="{{range $i, $v := .Topics}}{{.Name}}{{if lt (Add $i 1) (len $.Topics)}},{{end}}{{end}}">
{{range .Topics}}
<div class="ui small label topic transition visible" data-value="{{.Name}}" style="display: inline-block !important; cursor: default;">{{.Name}}<i class="delete icon"></i></div>
{{end}}
<div class="text"></div>
</div>
</div>
</div>
<div class="two wide column">
<a class="ui button primary" href="javascript:;" id="save_topic"
data-link="{{.RepoLink}}/topics">{{.i18n.Tr "repo.topic.done"}}</a>
</div>
</div>
{{end}}
<div class="hide" id="validate_prompt">
<span id="count_prompt">{{.i18n.Tr "repo.topic.count_prompt"}}</span>
<span id="format_prompt">{{.i18n.Tr "repo.topic.format_prompt"}}</span>
</div>
{{if .Repository.IsArchived}}
<div class="ui warning message">
{{.i18n.Tr "repo.archive.title"}}
@@ -141,13 +142,77 @@
{{end}}
</div>
</div>
{{if .IsViewFile}}
{{template "repo/view_file" .}}
{{else if .IsBlame}}
{{template "repo/blame" .}}
{{else}}
{{template "repo/view_list" .}}
{{end}}
<div class="ui container">
<div class="ui mobile reversed stackable grid">
<div class="ui ten wide tablet twelve wide computer column">
{{if .IsViewFile}}
{{template "repo/view_file" .}}
{{else if .IsBlame}}
{{template "repo/blame" .}}
{{else}}
{{template "repo/view_list" .}}
{{end}}
</div>
<div class="ui six wide tablet four wide computer column">
<div id="repo-desc">
<h4 class="ui header">简介</h4>
<p>
{{if .Repository.DescriptionHTML}}
<span class="description">{{.Repository.DescriptionHTML}}</span>
{{else}}
<span class="no-description text-italic">{{.i18n.Tr "repo.no_desc"}}</span>
{{end}}
<a class="link" href="{{.Repository.Website}}">{{.Repository.Website}}</a>
</p>
</div>

<p class="ui" id="repo-topics">
<i class="grey bookmark icon"></i>
{{range .Topics}}<a class="ui repo-topic small label topic" href="{{AppSubUrl}}/explore/repos?q={{.Name}}&topic=1">{{.Name}}</a>{{end}}
{{if and .Permission.IsAdmin (not .Repository.IsArchived)}}<a id="manage_topic">{{.i18n.Tr "repo.topic.manage_topics"}}</a>{{end}}
</p>

<p class="ui">
<i class="grey code icon"></i>
{{range .LanguageStats}}
{{.Language}}
{{end}}
</p>
<p class="ui">
<i class="grey clone icon"></i>
{{if .LICENSE}}
{{.LICENSE}}
{{end}}
</p>

<div class="ui divider"></div>

<div>
<h4 class="ui header">
<strong>贡献者 ({{len .ContributorInfo}})</strong>
<div class="ui right">
<a class="text grey" href="">全部 {{svg "octicon-chevron-right" 16}}</a>
</div>
</h4>

<div class="ui members">
{{range .ContributorInfo}}
{{/*<img class="ui avatar image" src="{{.UserInfo.RelAvatarLink}}" alt=""/>&nbsp;&nbsp;<a href="{{AppSubUrl}}/{{.UserInfo.Name}}">{{.UserInfo.Name}}</a>*/}}
{{if .UserInfo}}
<a href="{{AppSubUrl}}/{{.UserInfo.Name}}"><img class="ui avatar image" src="{{.UserInfo.RelAvatarLink}}" alt=""/></a>
{{else if .Email}}
<a href="mailto:{{.Email}}"><img class="ui avatar image" src="{{AvatarLink .Email}}" alt=""/></a>
{{end}}
{{end}}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{{template "base/footer" .}}

+ 9
- 8
templates/status/404.tmpl View File

@@ -1,12 +1,13 @@
{{template "base/head" .}}
{{if .IsRepo}}<div class="repository">{{template "repo/header" .}}</div>{{end}}
<div class="ui container center" style="background:url({{StaticUrlPrefix}}/img/404.png) no-repeat center center fixed;margin-bottom:-80px;height: 100%;width:100%;overflow: hidden;background-size: cover;margin:0!important">
<div style="height:100%;color:white">
<div style="padding-top: 50vh">
<div class="ui divider"></div>
<br>
<p>{{.i18n.Tr "error404" | Safe}}
{{if .ShowFooterVersion}}<p>{{.i18n.Tr "admin.config.app_ver"}}: {{AppVer}}</p>{{end}}
</div>

<div class="ui container center" style="min-height: 70%;">
<div class="ui basic very padded segment">
<img class="ui centered medium image" src="{{StaticUrlPrefix}}/img/icon-403@2x.png">
<h2>{{.i18n.Tr "error404_index"}}</h2>
<p>{{.i18n.Tr "error404" | Safe}}</p>
</div>
</div>

{{template "base/footer" .}}

+ 9
- 12
templates/status/500.tmpl View File

@@ -1,16 +1,13 @@
{{template "base/head" .}}
{{if .IsRepo}}<div class="repository">{{template "repo/header" .}}</div>{{end}}
<div class="ui container center" style="background:url({{StaticUrlPrefix}}/img/500.png) no-repeat center center fixed;margin-bottom:-80px;height: 100%;width:100%;overflow: hidden;background-size: cover;margin:0!important">
<div style="height:100%;color:white">
<h1 style="padding-top: 100px;font-size: 180px;color: white;text-align: center;text-shadow: 1px 20px 2px #666;
letter-spacing: 20px;">
500
</h1>
<div style="padding-bottom: 80px">
<div class="ui divider"></div>
<br>
<p>{{.i18n.Tr "error404" | Safe}}
{{if .ShowFooterVersion}}<p>{{.i18n.Tr "admin.config.app_ver"}}: {{AppVer}}</p>{{end}}
</div>

<div class="ui container center" style="min-height: 70%;">
<div class="ui basic very padded segment">
<img class="ui centered medium image" src="{{StaticUrlPrefix}}/img/icon-500@2x.png">
<h2>{{.i18n.Tr "error500_index"}}</h2>
<p>{{.i18n.Tr "error404" | Safe}}</p>
</div>
</div>

{{template "base/footer" .}}

+ 1
- 1
web_src/js/components/MinioUploader.vue View File

@@ -298,7 +298,7 @@ export default {
File.prototype.slice ||
File.prototype.mozSlice ||
File.prototype.webkitSlice,
chunkSize = 1024 * 1024 * 64,
chunkSize = 1024 * 1024 * 32,
chunks = Math.ceil(file.size / chunkSize),
fileReader = new FileReader(),
time = new Date().getTime();


+ 2
- 2
web_src/less/_base.less View File

@@ -291,7 +291,7 @@ code,
}

#navbar {
width: 100vw;
/*width: 100vw;*/
min-height: 52px;
padding: 0 .5rem;
}
@@ -773,7 +773,7 @@ footer {
color: #888888;

.container {
width: 100vw !important;
/*width: 100vw !important;*/
padding: 0 .5rem;
max-width: calc(100vw - 1rem) !important;



+ 1
- 1
web_src/less/_dataset.less View File

@@ -177,7 +177,7 @@
}

.ui.header {
font-size: 1.5rem;
font-size: 1.3rem;
padding-bottom: 10px;

.name {


+ 2
- 0
web_src/less/_repository.less View File

@@ -2443,6 +2443,8 @@

.page.buttons {
padding-top: 15px;
padding-bottom: 15px;
margin-bottom: 15px;
}

.ui.form {


+ 9
- 7
web_src/less/openi.less View File

@@ -1,3 +1,6 @@
a {
color: #0366d6;
}
.ui .text.yellow a {
color: #fbbd08!important
}
@@ -12,17 +15,19 @@
}
.following.bar #navbar .brand{
padding-left: 0;
padding-top: 0;
padding-bottom: 0;
}
.following.bar .brand .ui.mini.image {
width: auto;
height: 30px;
height: 40px;
}

.following.bar.dark {
background-color: #001F4A;
background-color: #363840;
}
.ui.secondary.menu.dark .item{
color: #E5FAFF;
color: #FFF;
}
.ui.secondary.menu.dark .item:hover{
color: #40A9FF;
@@ -67,11 +72,8 @@ footer {
}
/*PC*/
@media only screen and (min-width: 1200px){
.following.bar #navbar{
min-height: 80px;
}
.following.bar #navbar, footer .container {
padding: 0 32px;
padding: 0;
}
}



Loading…
Cancel
Save