diff --git a/public/css/gitlink.min.css b/public/css/gitlink.min.css
index b1308721b..2fbfc352f 100644
--- a/public/css/gitlink.min.css
+++ b/public/css/gitlink.min.css
@@ -8,6 +8,10 @@
font-family: "pangmen";
src: url("../fonts/PangMenZhengDaoBiaoTiTiMianFeiBan-2.ttf");
}
+@font-face {
+ font-family: "sanjikai";
+ src: url("../fonts/SanJiXingKaiJianTi-Cu-2.ttf");
+}
@font-face {
font-family: "alibaba";
src: url("../fonts/ALIBABA-PUHUITI-MEDIUM.TTF");
@@ -16,6 +20,10 @@
font-family: "alibabaReg";
src: url("../fonts/ALIBABA-PUHUITI-REGULAR.TTF");
}
+@font-face {
+ font-family: "alibabaBold";
+ src: url("../fonts/ALIBABA-PUHUITI-BOLD.TTF");
+}
@font-face {
font-family: "ziyouwenyihei";
src: url("../fonts/ziyouwenyihei.ttf");
diff --git a/public/css/iconfont-color/demo.css b/public/css/iconfont-color/demo.css
new file mode 100644
index 000000000..a67054a0a
--- /dev/null
+++ b/public/css/iconfont-color/demo.css
@@ -0,0 +1,539 @@
+/* Logo 字体 */
+@font-face {
+ font-family: "iconfont logo";
+ src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
+ src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
+ url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
+ url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
+ url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
+}
+
+.logo {
+ font-family: "iconfont logo";
+ font-size: 160px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+/* tabs */
+.nav-tabs {
+ position: relative;
+}
+
+.nav-tabs .nav-more {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ height: 42px;
+ line-height: 42px;
+ color: #666;
+}
+
+#tabs {
+ border-bottom: 1px solid #eee;
+}
+
+#tabs li {
+ cursor: pointer;
+ width: 100px;
+ height: 40px;
+ line-height: 40px;
+ text-align: center;
+ font-size: 16px;
+ border-bottom: 2px solid transparent;
+ position: relative;
+ z-index: 1;
+ margin-bottom: -1px;
+ color: #666;
+}
+
+
+#tabs .active {
+ border-bottom-color: #f00;
+ color: #222;
+}
+
+.tab-container .content {
+ display: none;
+}
+
+/* 页面布局 */
+.main {
+ padding: 30px 100px;
+ width: 960px;
+ margin: 0 auto;
+}
+
+.main .logo {
+ color: #333;
+ text-align: left;
+ margin-bottom: 30px;
+ line-height: 1;
+ height: 110px;
+ margin-top: -50px;
+ overflow: hidden;
+ *zoom: 1;
+}
+
+.main .logo a {
+ font-size: 160px;
+ color: #333;
+}
+
+.helps {
+ margin-top: 40px;
+}
+
+.helps pre {
+ padding: 20px;
+ margin: 10px 0;
+ border: solid 1px #e7e1cd;
+ background-color: #fffdef;
+ overflow: auto;
+}
+
+.icon_lists {
+ width: 100% !important;
+ overflow: hidden;
+ *zoom: 1;
+}
+
+.icon_lists li {
+ width: 100px;
+ margin-bottom: 10px;
+ margin-right: 20px;
+ text-align: center;
+ list-style: none !important;
+ cursor: default;
+}
+
+.icon_lists li .code-name {
+ line-height: 1.2;
+}
+
+.icon_lists .icon {
+ display: block;
+ height: 100px;
+ line-height: 100px;
+ font-size: 42px;
+ margin: 10px auto;
+ color: #333;
+ -webkit-transition: font-size 0.25s linear, width 0.25s linear;
+ -moz-transition: font-size 0.25s linear, width 0.25s linear;
+ transition: font-size 0.25s linear, width 0.25s linear;
+}
+
+.icon_lists .icon:hover {
+ font-size: 100px;
+}
+
+.icon_lists .svg-icon {
+ /* 通过设置 font-size 来改变图标大小 */
+ width: 1em;
+ /* 图标和文字相邻时,垂直对齐 */
+ vertical-align: -0.15em;
+ /* 通过设置 color 来改变 SVG 的颜色/fill */
+ fill: currentColor;
+ /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
+ normalize.css 中也包含这行 */
+ overflow: hidden;
+}
+
+.icon_lists li .name,
+.icon_lists li .code-name {
+ color: #666;
+}
+
+/* markdown 样式 */
+.markdown {
+ color: #666;
+ font-size: 14px;
+ line-height: 1.8;
+}
+
+.highlight {
+ line-height: 1.5;
+}
+
+.markdown img {
+ vertical-align: middle;
+ max-width: 100%;
+}
+
+.markdown h1 {
+ color: #404040;
+ font-weight: 500;
+ line-height: 40px;
+ margin-bottom: 24px;
+}
+
+.markdown h2,
+.markdown h3,
+.markdown h4,
+.markdown h5,
+.markdown h6 {
+ color: #404040;
+ margin: 1.6em 0 0.6em 0;
+ font-weight: 500;
+ clear: both;
+}
+
+.markdown h1 {
+ font-size: 28px;
+}
+
+.markdown h2 {
+ font-size: 22px;
+}
+
+.markdown h3 {
+ font-size: 16px;
+}
+
+.markdown h4 {
+ font-size: 14px;
+}
+
+.markdown h5 {
+ font-size: 12px;
+}
+
+.markdown h6 {
+ font-size: 12px;
+}
+
+.markdown hr {
+ height: 1px;
+ border: 0;
+ background: #e9e9e9;
+ margin: 16px 0;
+ clear: both;
+}
+
+.markdown p {
+ margin: 1em 0;
+}
+
+.markdown>p,
+.markdown>blockquote,
+.markdown>.highlight,
+.markdown>ol,
+.markdown>ul {
+ width: 80%;
+}
+
+.markdown ul>li {
+ list-style: circle;
+}
+
+.markdown>ul li,
+.markdown blockquote ul>li {
+ margin-left: 20px;
+ padding-left: 4px;
+}
+
+.markdown>ul li p,
+.markdown>ol li p {
+ margin: 0.6em 0;
+}
+
+.markdown ol>li {
+ list-style: decimal;
+}
+
+.markdown>ol li,
+.markdown blockquote ol>li {
+ margin-left: 20px;
+ padding-left: 4px;
+}
+
+.markdown code {
+ margin: 0 3px;
+ padding: 0 5px;
+ background: #eee;
+ border-radius: 3px;
+}
+
+.markdown strong,
+.markdown b {
+ font-weight: 600;
+}
+
+.markdown>table {
+ border-collapse: collapse;
+ border-spacing: 0px;
+ empty-cells: show;
+ border: 1px solid #e9e9e9;
+ width: 95%;
+ margin-bottom: 24px;
+}
+
+.markdown>table th {
+ white-space: nowrap;
+ color: #333;
+ font-weight: 600;
+}
+
+.markdown>table th,
+.markdown>table td {
+ border: 1px solid #e9e9e9;
+ padding: 8px 16px;
+ text-align: left;
+}
+
+.markdown>table th {
+ background: #F7F7F7;
+}
+
+.markdown blockquote {
+ font-size: 90%;
+ color: #999;
+ border-left: 4px solid #e9e9e9;
+ padding-left: 0.8em;
+ margin: 1em 0;
+}
+
+.markdown blockquote p {
+ margin: 0;
+}
+
+.markdown .anchor {
+ opacity: 0;
+ transition: opacity 0.3s ease;
+ margin-left: 8px;
+}
+
+.markdown .waiting {
+ color: #ccc;
+}
+
+.markdown h1:hover .anchor,
+.markdown h2:hover .anchor,
+.markdown h3:hover .anchor,
+.markdown h4:hover .anchor,
+.markdown h5:hover .anchor,
+.markdown h6:hover .anchor {
+ opacity: 1;
+ display: inline-block;
+}
+
+.markdown>br,
+.markdown>p>br {
+ clear: both;
+}
+
+
+.hljs {
+ display: block;
+ background: white;
+ padding: 0.5em;
+ color: #333333;
+ overflow-x: auto;
+}
+
+.hljs-comment,
+.hljs-meta {
+ color: #969896;
+}
+
+.hljs-string,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-strong,
+.hljs-emphasis,
+.hljs-quote {
+ color: #df5000;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+ color: #a71d5d;
+}
+
+.hljs-literal,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-attribute {
+ color: #0086b3;
+}
+
+.hljs-section,
+.hljs-name {
+ color: #63a35c;
+}
+
+.hljs-tag {
+ color: #333333;
+}
+
+.hljs-title,
+.hljs-attr,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+ color: #795da3;
+}
+
+.hljs-addition {
+ color: #55a532;
+ background-color: #eaffea;
+}
+
+.hljs-deletion {
+ color: #bd2c00;
+ background-color: #ffecec;
+}
+
+.hljs-link {
+ text-decoration: underline;
+}
+
+/* 代码高亮 */
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+ color: black;
+ background: none;
+ text-shadow: 0 1px white;
+ font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+ text-align: left;
+ white-space: pre;
+ word-spacing: normal;
+ word-break: normal;
+ word-wrap: normal;
+ line-height: 1.5;
+
+ -moz-tab-size: 4;
+ -o-tab-size: 4;
+ tab-size: 4;
+
+ -webkit-hyphens: none;
+ -moz-hyphens: none;
+ -ms-hyphens: none;
+ hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+
+@media print {
+
+ code[class*="language-"],
+ pre[class*="language-"] {
+ text-shadow: none;
+ }
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+ padding: 1em;
+ margin: .5em 0;
+ overflow: auto;
+}
+
+:not(pre)>code[class*="language-"],
+pre[class*="language-"] {
+ background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre)>code[class*="language-"] {
+ padding: .1em;
+ border-radius: .3em;
+ white-space: normal;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+ color: slategray;
+}
+
+.token.punctuation {
+ color: #999;
+}
+
+.namespace {
+ opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+ color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+ color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+ color: #9a6e3a;
+ background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+ color: #07a;
+}
+
+.token.function,
+.token.class-name {
+ color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+ color: #e90;
+}
+
+.token.important,
+.token.bold {
+ font-weight: bold;
+}
+
+.token.italic {
+ font-style: italic;
+}
+
+.token.entity {
+ cursor: help;
+}
diff --git a/public/css/iconfont-color/iconfont.css b/public/css/iconfont-color/iconfont.css
new file mode 100644
index 000000000..ce650d7de
--- /dev/null
+++ b/public/css/iconfont-color/iconfont.css
@@ -0,0 +1,109 @@
+@font-face {
+ font-family: "iconfont-color"; /* Project id 5169666 */
+ /* Color fonts */
+ src:
+ url('iconfont.woff2?t=1780903107408') format('woff2'),
+ url('iconfont.woff?t=1780903107408') format('woff'),
+ url('iconfont.ttf?t=1780903107408') format('truetype');
+}
+
+.iconfont-color {
+ font-family: "iconfont-color" !important;
+ font-size: 16px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-colorzuojiantou:before {
+ content: "\e6d4";
+}
+
+.icon-coloryoujiantou:before {
+ content: "\e6d5";
+}
+
+.icon-colorqita:before {
+ content: "\e7b3";
+}
+
+.icon-coloryidongkaifa:before {
+ content: "\e7b4";
+}
+
+.icon-colordaimazhijian:before {
+ content: "\e7b5";
+}
+
+.icon-coloryunxiaogongju:before {
+ content: "\e7b6";
+}
+
+.icon-coloryouxiyule:before {
+ content: "\e7b7";
+}
+
+.icon-colorskill:before {
+ content: "\e7b0";
+}
+
+.icon-colorshujuji:before {
+ content: "\e7b1";
+}
+
+.icon-colordaimaku1:before {
+ content: "\e7b2";
+}
+
+.icon-colormoxingku:before {
+ content: "\e7af";
+}
+
+.icon-coloryinpin:before {
+ content: "\e7ad";
+}
+
+.icon-colorremenmoxing-1:before {
+ content: "\e7a3";
+}
+
+.icon-colorkexueyanjiuhejishufuwuye:before {
+ content: "\e7ae";
+}
+
+.icon-colora-zu18210:before {
+ content: "\e7a6";
+}
+
+.icon-colora-zu18240:before {
+ content: "\e7a5";
+}
+
+.icon-colora-zuixin1:before {
+ content: "\e7a7";
+}
+
+.icon-colorziranyuyanchuli:before {
+ content: "\e7a8";
+}
+
+.icon-colorshichangtuiguang-01:before {
+ content: "\e7a4";
+}
+
+.icon-coloryuyin:before {
+ content: "\e7a9";
+}
+
+.icon-colortuxiang:before {
+ content: "\e7aa";
+}
+
+.icon-colora-zu18213:before {
+ content: "\e7ab";
+}
+
+.icon-colorshipinbofang:before {
+ content: "\e7ac";
+}
+
diff --git a/public/css/iconfont-color/iconfont.js b/public/css/iconfont-color/iconfont.js
new file mode 100644
index 000000000..d1e8c8502
--- /dev/null
+++ b/public/css/iconfont-color/iconfont.js
@@ -0,0 +1 @@
+window._iconfont_svg_string_5169666='',(h=>{var a=(l=(l=document.getElementsByTagName("script"))[l.length-1]).getAttribute("data-injectcss"),l=l.getAttribute("data-disable-injectsvg");if(!l){var t,o,i,e,v,c=function(a,l){l.parentNode.insertBefore(a,l)};if(a&&!h.__iconfont__svg__cssinject__){h.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}t=function(){var a,l=document.createElement("div");l.innerHTML=h._iconfont_svg_string_5169666,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(a=document.body).firstChild?c(l,a.firstChild):a.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(t,0):(o=function(){document.removeEventListener("DOMContentLoaded",o,!1),t()},document.addEventListener("DOMContentLoaded",o,!1)):document.attachEvent&&(i=t,e=h.document,v=!1,n(),e.onreadystatechange=function(){"complete"==e.readyState&&(e.onreadystatechange=null,d())})}function d(){v||(v=!0,i())}function n(){try{e.documentElement.doScroll("left")}catch(a){return void setTimeout(n,50)}d()}})(window);
\ No newline at end of file
diff --git a/public/css/iconfont-color/iconfont.json b/public/css/iconfont-color/iconfont.json
new file mode 100644
index 000000000..40b55674e
--- /dev/null
+++ b/public/css/iconfont-color/iconfont.json
@@ -0,0 +1,170 @@
+{
+ "id": "5169666",
+ "name": "newForge-color",
+ "font_family": "iconfont-color",
+ "css_prefix_text": "icon-color",
+ "description": "gitlink/红山开源 带颜色的icon",
+ "glyphs": [
+ {
+ "icon_id": "47799227",
+ "name": "左箭头",
+ "font_class": "zuojiantou",
+ "unicode": "e6d4",
+ "unicode_decimal": 59092
+ },
+ {
+ "icon_id": "47799226",
+ "name": "右箭头",
+ "font_class": "youjiantou",
+ "unicode": "e6d5",
+ "unicode_decimal": 59093
+ },
+ {
+ "icon_id": "47487873",
+ "name": "其他",
+ "font_class": "qita",
+ "unicode": "e7b3",
+ "unicode_decimal": 59315
+ },
+ {
+ "icon_id": "47487872",
+ "name": "移动开发",
+ "font_class": "yidongkaifa",
+ "unicode": "e7b4",
+ "unicode_decimal": 59316
+ },
+ {
+ "icon_id": "47487870",
+ "name": "代码质检",
+ "font_class": "daimazhijian",
+ "unicode": "e7b5",
+ "unicode_decimal": 59317
+ },
+ {
+ "icon_id": "47487871",
+ "name": "云效工具",
+ "font_class": "yunxiaogongju",
+ "unicode": "e7b6",
+ "unicode_decimal": 59318
+ },
+ {
+ "icon_id": "47487869",
+ "name": "游戏娱乐",
+ "font_class": "youxiyule",
+ "unicode": "e7b7",
+ "unicode_decimal": 59319
+ },
+ {
+ "icon_id": "47487614",
+ "name": "skill",
+ "font_class": "skill",
+ "unicode": "e7b0",
+ "unicode_decimal": 59312
+ },
+ {
+ "icon_id": "47487615",
+ "name": "数据集",
+ "font_class": "shujuji",
+ "unicode": "e7b1",
+ "unicode_decimal": 59313
+ },
+ {
+ "icon_id": "47487613",
+ "name": "代码库",
+ "font_class": "daimaku1",
+ "unicode": "e7b2",
+ "unicode_decimal": 59314
+ },
+ {
+ "icon_id": "47487578",
+ "name": "模型库",
+ "font_class": "moxingku",
+ "unicode": "e7af",
+ "unicode_decimal": 59311
+ },
+ {
+ "icon_id": "47470053",
+ "name": "音频",
+ "font_class": "yinpin",
+ "unicode": "e7ad",
+ "unicode_decimal": 59309
+ },
+ {
+ "icon_id": "47470038",
+ "name": "热门模型-1",
+ "font_class": "remenmoxing-1",
+ "unicode": "e7a3",
+ "unicode_decimal": 59299
+ },
+ {
+ "icon_id": "47470036",
+ "name": "科学研究和技术服务业",
+ "font_class": "kexueyanjiuhejishufuwuye",
+ "unicode": "e7ae",
+ "unicode_decimal": 59310
+ },
+ {
+ "icon_id": "47470068",
+ "name": "组 18210",
+ "font_class": "a-zu18210",
+ "unicode": "e7a6",
+ "unicode_decimal": 59302
+ },
+ {
+ "icon_id": "47470067",
+ "name": "组 18240",
+ "font_class": "a-zu18240",
+ "unicode": "e7a5",
+ "unicode_decimal": 59301
+ },
+ {
+ "icon_id": "47470066",
+ "name": "最新 (1)",
+ "font_class": "a-zuixin1",
+ "unicode": "e7a7",
+ "unicode_decimal": 59303
+ },
+ {
+ "icon_id": "47470060",
+ "name": "自然语言处理",
+ "font_class": "ziranyuyanchuli",
+ "unicode": "e7a8",
+ "unicode_decimal": 59304
+ },
+ {
+ "icon_id": "47470052",
+ "name": "市场推广-01",
+ "font_class": "shichangtuiguang-01",
+ "unicode": "e7a4",
+ "unicode_decimal": 59300
+ },
+ {
+ "icon_id": "47470056",
+ "name": "语音",
+ "font_class": "yuyin",
+ "unicode": "e7a9",
+ "unicode_decimal": 59305
+ },
+ {
+ "icon_id": "47470055",
+ "name": "图像",
+ "font_class": "tuxiang",
+ "unicode": "e7aa",
+ "unicode_decimal": 59306
+ },
+ {
+ "icon_id": "47470057",
+ "name": "组 18213",
+ "font_class": "a-zu18213",
+ "unicode": "e7ab",
+ "unicode_decimal": 59307
+ },
+ {
+ "icon_id": "47470047",
+ "name": "视频播放",
+ "font_class": "shipinbofang",
+ "unicode": "e7ac",
+ "unicode_decimal": 59308
+ }
+ ]
+}
diff --git a/public/css/iconfont-color/iconfont.ttf b/public/css/iconfont-color/iconfont.ttf
new file mode 100644
index 000000000..16f8d9083
Binary files /dev/null and b/public/css/iconfont-color/iconfont.ttf differ
diff --git a/public/css/iconfont-color/iconfont.woff b/public/css/iconfont-color/iconfont.woff
new file mode 100644
index 000000000..cba0041d4
Binary files /dev/null and b/public/css/iconfont-color/iconfont.woff differ
diff --git a/public/css/iconfont-color/iconfont.woff2 b/public/css/iconfont-color/iconfont.woff2
new file mode 100644
index 000000000..ce9d5c976
Binary files /dev/null and b/public/css/iconfont-color/iconfont.woff2 differ
diff --git a/public/css/iconfont.css b/public/css/iconfont.css
index 07c91dd4d..71dca2ff5 100644
--- a/public/css/iconfont.css
+++ b/public/css/iconfont.css
@@ -1,8 +1,8 @@
@font-face {
font-family: "iconfont"; /* Project id 2340181 */
- src: url('iconfont.woff2?t=1768876676007') format('woff2'),
- url('iconfont.woff?t=1768876676007') format('woff'),
- url('iconfont.ttf?t=1768876676007') format('truetype');
+ src: url('iconfont.woff2?t=1780902820324') format('woff2'),
+ url('iconfont.woff?t=1780902820324') format('woff'),
+ url('iconfont.ttf?t=1780902820324') format('truetype');
}
.iconfont {
@@ -13,6 +13,258 @@
-moz-osx-font-smoothing: grayscale;
}
+.icon-zuojiantou3:before {
+ content: "\ea05";
+}
+
+.icon-youjiantou2:before {
+ content: "\ea06";
+}
+
+.icon-fanhuagongju:before {
+ content: "\ea02";
+}
+
+.icon-jingxuanxiangmu1:before {
+ content: "\ea03";
+}
+
+.icon-gengduo2:before {
+ content: "\ea04";
+}
+
+.icon-shengwuyiyao:before {
+ content: "\e9f5";
+}
+
+.icon-youjiantou1:before {
+ content: "\e9fa";
+}
+
+.icon-zuojiantou2:before {
+ content: "\e9fd";
+}
+
+.icon-daqihaiyanghuanjing:before {
+ content: "\e9fe";
+}
+
+.icon-tianwendiliwuli:before {
+ content: "\e9ff";
+}
+
+.icon-xinnengyuanxincailiao:before {
+ content: "\ea00";
+}
+
+.icon-gongyeshejizhizao:before {
+ content: "\ea01";
+}
+
+.icon-tiezi:before {
+ content: "\e9f4";
+}
+
+.icon-xiala5:before {
+ content: "\e9df";
+}
+
+.icon-yulan:before {
+ content: "\e9f1";
+}
+
+.icon-arrright:before {
+ content: "\e9fc";
+}
+
+.icon-yunxiaogongju:before {
+ content: "\e9f6";
+}
+
+.icon-daimazhijian:before {
+ content: "\e9f7";
+}
+
+.icon-yidongkaifa:before {
+ content: "\e9f8";
+}
+
+.icon-qita:before {
+ content: "\e9f9";
+}
+
+.icon-meitichuli:before {
+ content: "\e9fb";
+}
+
+.icon-skill:before {
+ content: "\e9f3";
+}
+
+.icon-daimaku1:before {
+ content: "\e9f2";
+}
+
+.icon-dianzan5:before {
+ content: "\e9ee";
+}
+
+.icon-duomotaimoxing:before {
+ content: "\e9ef";
+}
+
+.icon-a-kexueyanjiuhejishufuwuye-1:before {
+ content: "\e9f0";
+}
+
+.icon-yinpin-1:before {
+ content: "\e9e2";
+}
+
+.icon-shujuji-4:before {
+ content: "\e9e4";
+}
+
+.icon-shujuji:before {
+ content: "\e9e5";
+}
+
+.icon-shujuyuanmoxing:before {
+ content: "\e9e6";
+}
+
+.icon-shujuji-3:before {
+ content: "\e9e7";
+}
+
+.icon-a-shujuji5:before {
+ content: "\e9e8";
+}
+
+.icon-a-shujuji-6:before {
+ content: "\e9e9";
+}
+
+.icon-shipinbofang-1:before {
+ content: "\e9ea";
+}
+
+.icon-moxingku:before {
+ content: "\e9eb";
+}
+
+.icon-a-shijianzhongbiao:before {
+ content: "\e9ec";
+}
+
+.icon-remenmoxing-2:before {
+ content: "\e9ed";
+}
+
+.icon-a-Dshujukukaifagongju:before {
+ content: "\e9cd";
+}
+
+.icon-ziranyuyanchuli-2:before {
+ content: "\e9db";
+}
+
+.icon-a-zu18214:before {
+ content: "\e9dc";
+}
+
+.icon-zizhushujuji:before {
+ content: "\e9dd";
+}
+
+.icon-yuyin-1:before {
+ content: "\e9de";
+}
+
+.icon-a-tuxiang-1:before {
+ content: "\e9e0";
+}
+
+.icon-xiazai3:before {
+ content: "\e9e1";
+}
+
+.icon-shijian1:before {
+ content: "\e9cb";
+}
+
+.icon-liulanliang:before {
+ content: "\e9cc";
+}
+
+.icon-guanbi2:before {
+ content: "\e9ca";
+}
+
+.icon-zhanshishangxian1:before {
+ content: "\e9d3";
+}
+
+.icon-tianxiexinxi:before {
+ content: "\e9d8";
+}
+
+.icon-tijiaoshenqing1:before {
+ content: "\e9d9";
+}
+
+.icon-guanliyuanshenhe1:before {
+ content: "\e9da";
+}
+
+.icon-sixin2:before {
+ content: "\e9e3";
+}
+
+.icon-dianzan4:before {
+ content: "\e9d6";
+}
+
+.icon-liulanshu:before {
+ content: "\e9d7";
+}
+
+.icon-tiezishu:before {
+ content: "\e9ce";
+}
+
+.icon-yanjiulingyu:before {
+ content: "\e9cf";
+}
+
+.icon-a-xiugai3:before {
+ content: "\e9d0";
+}
+
+.icon-yitijiaoderuzhuxinxi:before {
+ content: "\e9d1";
+}
+
+.icon-sixin:before {
+ content: "\e9d2";
+}
+
+.icon-gerenjianjie:before {
+ content: "\e9d4";
+}
+
+.icon-guanzhu1:before {
+ content: "\e9d5";
+}
+
+.icon-woyefatie:before {
+ content: "\e9c9";
+}
+
+.icon-yingyongmoban:before {
+ content: "\e9c8";
+}
+
.icon-zhuangtai:before {
content: "\e9c5";
}
diff --git a/public/css/iconfont.js b/public/css/iconfont.js
index 317ae31ee..1f09116a5 100644
--- a/public/css/iconfont.js
+++ b/public/css/iconfont.js
@@ -1 +1 @@
-window._iconfont_svg_string_2340181='',(c=>{var a=(l=(l=document.getElementsByTagName("script"))[l.length-1]).getAttribute("data-injectcss"),l=l.getAttribute("data-disable-injectsvg");if(!l){var h,i,o,z,t,p=function(a,l){l.parentNode.insertBefore(a,l)};if(a&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}h=function(){var a,l=document.createElement("div");l.innerHTML=c._iconfont_svg_string_2340181,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(a=document.body).firstChild?p(l,a.firstChild):a.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(h,0):(i=function(){document.removeEventListener("DOMContentLoaded",i,!1),h()},document.addEventListener("DOMContentLoaded",i,!1)):document.attachEvent&&(o=h,z=c.document,t=!1,m(),z.onreadystatechange=function(){"complete"==z.readyState&&(z.onreadystatechange=null,v())})}function v(){t||(t=!0,o())}function m(){try{z.documentElement.doScroll("left")}catch(a){return void setTimeout(m,50)}v()}})(window);
\ No newline at end of file
+window._iconfont_svg_string_2340181='',(c=>{var a=(l=(l=document.getElementsByTagName("script"))[l.length-1]).getAttribute("data-injectcss"),l=l.getAttribute("data-disable-injectsvg");if(!l){var h,i,o,z,t,p=function(a,l){l.parentNode.insertBefore(a,l)};if(a&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}h=function(){var a,l=document.createElement("div");l.innerHTML=c._iconfont_svg_string_2340181,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(a=document.body).firstChild?p(l,a.firstChild):a.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(h,0):(i=function(){document.removeEventListener("DOMContentLoaded",i,!1),h()},document.addEventListener("DOMContentLoaded",i,!1)):document.attachEvent&&(o=h,z=c.document,t=!1,m(),z.onreadystatechange=function(){"complete"==z.readyState&&(z.onreadystatechange=null,v())})}function v(){t||(t=!0,o())}function m(){try{z.documentElement.doScroll("left")}catch(a){return void setTimeout(m,50)}v()}})(window);
\ No newline at end of file
diff --git a/public/css/iconfont.json b/public/css/iconfont.json
index 7dcb87101..de009d327 100644
--- a/public/css/iconfont.json
+++ b/public/css/iconfont.json
@@ -5,6 +5,447 @@
"css_prefix_text": "icon-",
"description": "",
"glyphs": [
+ {
+ "icon_id": "47798947",
+ "name": "左箭头",
+ "font_class": "zuojiantou3",
+ "unicode": "ea05",
+ "unicode_decimal": 59909
+ },
+ {
+ "icon_id": "47798946",
+ "name": "右箭头",
+ "font_class": "youjiantou2",
+ "unicode": "ea06",
+ "unicode_decimal": 59910
+ },
+ {
+ "icon_id": "47778051",
+ "name": "泛化工具",
+ "font_class": "fanhuagongju",
+ "unicode": "ea02",
+ "unicode_decimal": 59906
+ },
+ {
+ "icon_id": "47778050",
+ "name": "精选项目",
+ "font_class": "jingxuanxiangmu1",
+ "unicode": "ea03",
+ "unicode_decimal": 59907
+ },
+ {
+ "icon_id": "47778049",
+ "name": "更多",
+ "font_class": "gengduo2",
+ "unicode": "ea04",
+ "unicode_decimal": 59908
+ },
+ {
+ "icon_id": "47778058",
+ "name": "生物医药",
+ "font_class": "shengwuyiyao",
+ "unicode": "e9f5",
+ "unicode_decimal": 59893
+ },
+ {
+ "icon_id": "47778057",
+ "name": "右箭头",
+ "font_class": "youjiantou1",
+ "unicode": "e9fa",
+ "unicode_decimal": 59898
+ },
+ {
+ "icon_id": "47778056",
+ "name": "左箭头",
+ "font_class": "zuojiantou2",
+ "unicode": "e9fd",
+ "unicode_decimal": 59901
+ },
+ {
+ "icon_id": "47778052",
+ "name": "大气海洋环境",
+ "font_class": "daqihaiyanghuanjing",
+ "unicode": "e9fe",
+ "unicode_decimal": 59902
+ },
+ {
+ "icon_id": "47778055",
+ "name": "天文地理物理",
+ "font_class": "tianwendiliwuli",
+ "unicode": "e9ff",
+ "unicode_decimal": 59903
+ },
+ {
+ "icon_id": "47778054",
+ "name": "新能源新材料",
+ "font_class": "xinnengyuanxincailiao",
+ "unicode": "ea00",
+ "unicode_decimal": 59904
+ },
+ {
+ "icon_id": "47778053",
+ "name": "工业设计制造",
+ "font_class": "gongyeshejizhizao",
+ "unicode": "ea01",
+ "unicode_decimal": 59905
+ },
+ {
+ "icon_id": "47756092",
+ "name": "帖子",
+ "font_class": "tiezi",
+ "unicode": "e9f4",
+ "unicode_decimal": 59892
+ },
+ {
+ "icon_id": "47540662",
+ "name": "下拉",
+ "font_class": "xiala5",
+ "unicode": "e9df",
+ "unicode_decimal": 59871
+ },
+ {
+ "icon_id": "47540661",
+ "name": "预览",
+ "font_class": "yulan",
+ "unicode": "e9f1",
+ "unicode_decimal": 59889
+ },
+ {
+ "icon_id": "40883122",
+ "name": "长箭头-copy",
+ "font_class": "arrright",
+ "unicode": "e9fc",
+ "unicode_decimal": 59900
+ },
+ {
+ "icon_id": "47487774",
+ "name": "云效工具",
+ "font_class": "yunxiaogongju",
+ "unicode": "e9f6",
+ "unicode_decimal": 59894
+ },
+ {
+ "icon_id": "47487775",
+ "name": "代码质检",
+ "font_class": "daimazhijian",
+ "unicode": "e9f7",
+ "unicode_decimal": 59895
+ },
+ {
+ "icon_id": "47487773",
+ "name": "移动开发",
+ "font_class": "yidongkaifa",
+ "unicode": "e9f8",
+ "unicode_decimal": 59896
+ },
+ {
+ "icon_id": "47487772",
+ "name": "其他",
+ "font_class": "qita",
+ "unicode": "e9f9",
+ "unicode_decimal": 59897
+ },
+ {
+ "icon_id": "47487770",
+ "name": "媒体处理",
+ "font_class": "meitichuli",
+ "unicode": "e9fb",
+ "unicode_decimal": 59899
+ },
+ {
+ "icon_id": "47487669",
+ "name": "skill",
+ "font_class": "skill",
+ "unicode": "e9f3",
+ "unicode_decimal": 59891
+ },
+ {
+ "icon_id": "47487670",
+ "name": "代码库",
+ "font_class": "daimaku1",
+ "unicode": "e9f2",
+ "unicode_decimal": 59890
+ },
+ {
+ "icon_id": "47470076",
+ "name": "点赞",
+ "font_class": "dianzan5",
+ "unicode": "e9ee",
+ "unicode_decimal": 59886
+ },
+ {
+ "icon_id": "47470075",
+ "name": "多模态模型",
+ "font_class": "duomotaimoxing",
+ "unicode": "e9ef",
+ "unicode_decimal": 59887
+ },
+ {
+ "icon_id": "47470074",
+ "name": "科学研究和技术服务业 -1",
+ "font_class": "a-kexueyanjiuhejishufuwuye-1",
+ "unicode": "e9f0",
+ "unicode_decimal": 59888
+ },
+ {
+ "icon_id": "47470091",
+ "name": "音频-1",
+ "font_class": "yinpin-1",
+ "unicode": "e9e2",
+ "unicode_decimal": 59874
+ },
+ {
+ "icon_id": "47470090",
+ "name": "数据集-4",
+ "font_class": "shujuji-4",
+ "unicode": "e9e4",
+ "unicode_decimal": 59876
+ },
+ {
+ "icon_id": "47470088",
+ "name": "数据集",
+ "font_class": "shujuji",
+ "unicode": "e9e5",
+ "unicode_decimal": 59877
+ },
+ {
+ "icon_id": "47470089",
+ "name": "数据源模型",
+ "font_class": "shujuyuanmoxing",
+ "unicode": "e9e6",
+ "unicode_decimal": 59878
+ },
+ {
+ "icon_id": "47470087",
+ "name": "数据集-3",
+ "font_class": "shujuji-3",
+ "unicode": "e9e7",
+ "unicode_decimal": 59879
+ },
+ {
+ "icon_id": "47470086",
+ "name": "数据集 (5)",
+ "font_class": "a-shujuji5",
+ "unicode": "e9e8",
+ "unicode_decimal": 59880
+ },
+ {
+ "icon_id": "47470083",
+ "name": "数据集 -6",
+ "font_class": "a-shujuji-6",
+ "unicode": "e9e9",
+ "unicode_decimal": 59881
+ },
+ {
+ "icon_id": "47470084",
+ "name": "视频播放-1",
+ "font_class": "shipinbofang-1",
+ "unicode": "e9ea",
+ "unicode_decimal": 59882
+ },
+ {
+ "icon_id": "47470081",
+ "name": "模型库",
+ "font_class": "moxingku",
+ "unicode": "e9eb",
+ "unicode_decimal": 59883
+ },
+ {
+ "icon_id": "47470080",
+ "name": "时间 钟表",
+ "font_class": "a-shijianzhongbiao",
+ "unicode": "e9ec",
+ "unicode_decimal": 59884
+ },
+ {
+ "icon_id": "47470079",
+ "name": "热门模型-2",
+ "font_class": "remenmoxing-2",
+ "unicode": "e9ed",
+ "unicode_decimal": 59885
+ },
+ {
+ "icon_id": "47470107",
+ "name": "D+数据库开发工具",
+ "font_class": "a-Dshujukukaifagongju",
+ "unicode": "e9cd",
+ "unicode_decimal": 59853
+ },
+ {
+ "icon_id": "47470101",
+ "name": "自然语言处理-2",
+ "font_class": "ziranyuyanchuli-2",
+ "unicode": "e9db",
+ "unicode_decimal": 59867
+ },
+ {
+ "icon_id": "47470102",
+ "name": "组 18214",
+ "font_class": "a-zu18214",
+ "unicode": "e9dc",
+ "unicode_decimal": 59868
+ },
+ {
+ "icon_id": "47470098",
+ "name": "自助数据集",
+ "font_class": "zizhushujuji",
+ "unicode": "e9dd",
+ "unicode_decimal": 59869
+ },
+ {
+ "icon_id": "47470095",
+ "name": "语音-1",
+ "font_class": "yuyin-1",
+ "unicode": "e9de",
+ "unicode_decimal": 59870
+ },
+ {
+ "icon_id": "47470094",
+ "name": "图像 -1",
+ "font_class": "a-tuxiang-1",
+ "unicode": "e9e0",
+ "unicode_decimal": 59872
+ },
+ {
+ "icon_id": "47470092",
+ "name": "下载",
+ "font_class": "xiazai3",
+ "unicode": "e9e1",
+ "unicode_decimal": 59873
+ },
+ {
+ "icon_id": "47464883",
+ "name": "时间",
+ "font_class": "shijian1",
+ "unicode": "e9cb",
+ "unicode_decimal": 59851
+ },
+ {
+ "icon_id": "47464882",
+ "name": "浏览量",
+ "font_class": "liulanliang",
+ "unicode": "e9cc",
+ "unicode_decimal": 59852
+ },
+ {
+ "icon_id": "47337195",
+ "name": "关闭",
+ "font_class": "guanbi2",
+ "unicode": "e9ca",
+ "unicode_decimal": 59850
+ },
+ {
+ "icon_id": "47202525",
+ "name": "展示上线",
+ "font_class": "zhanshishangxian1",
+ "unicode": "e9d3",
+ "unicode_decimal": 59859
+ },
+ {
+ "icon_id": "47202524",
+ "name": "填写信息",
+ "font_class": "tianxiexinxi",
+ "unicode": "e9d8",
+ "unicode_decimal": 59864
+ },
+ {
+ "icon_id": "47202523",
+ "name": "提交申请",
+ "font_class": "tijiaoshenqing1",
+ "unicode": "e9d9",
+ "unicode_decimal": 59865
+ },
+ {
+ "icon_id": "47202522",
+ "name": "管理员审核",
+ "font_class": "guanliyuanshenhe1",
+ "unicode": "e9da",
+ "unicode_decimal": 59866
+ },
+ {
+ "icon_id": "47195847",
+ "name": "私信",
+ "font_class": "sixin2",
+ "unicode": "e9e3",
+ "unicode_decimal": 59875
+ },
+ {
+ "icon_id": "47195594",
+ "name": "点赞",
+ "font_class": "dianzan4",
+ "unicode": "e9d6",
+ "unicode_decimal": 59862
+ },
+ {
+ "icon_id": "47195591",
+ "name": "浏览数",
+ "font_class": "liulanshu",
+ "unicode": "e9d7",
+ "unicode_decimal": 59863
+ },
+ {
+ "icon_id": "47195601",
+ "name": "帖子数",
+ "font_class": "tiezishu",
+ "unicode": "e9ce",
+ "unicode_decimal": 59854
+ },
+ {
+ "icon_id": "47195600",
+ "name": "研究领域",
+ "font_class": "yanjiulingyu",
+ "unicode": "e9cf",
+ "unicode_decimal": 59855
+ },
+ {
+ "icon_id": "47195597",
+ "name": "修改 (3)",
+ "font_class": "a-xiugai3",
+ "unicode": "e9d0",
+ "unicode_decimal": 59856
+ },
+ {
+ "icon_id": "47195598",
+ "name": "已提交的入驻信息",
+ "font_class": "yitijiaoderuzhuxinxi",
+ "unicode": "e9d1",
+ "unicode_decimal": 59857
+ },
+ {
+ "icon_id": "47195599",
+ "name": "私信",
+ "font_class": "sixin",
+ "unicode": "e9d2",
+ "unicode_decimal": 59858
+ },
+ {
+ "icon_id": "47195593",
+ "name": "个人简介",
+ "font_class": "gerenjianjie",
+ "unicode": "e9d4",
+ "unicode_decimal": 59860
+ },
+ {
+ "icon_id": "47195595",
+ "name": "关注",
+ "font_class": "guanzhu1",
+ "unicode": "e9d5",
+ "unicode_decimal": 59861
+ },
+ {
+ "icon_id": "47139445",
+ "name": "我也发帖",
+ "font_class": "woyefatie",
+ "unicode": "e9c9",
+ "unicode_decimal": 59849
+ },
+ {
+ "icon_id": "46808654",
+ "name": "应用模板",
+ "font_class": "yingyongmoban",
+ "unicode": "e9c8",
+ "unicode_decimal": 59848
+ },
{
"icon_id": "46593376",
"name": "状态",
diff --git a/public/css/iconfont.ttf b/public/css/iconfont.ttf
index 5e4a2d46e..3a25ea7a3 100644
Binary files a/public/css/iconfont.ttf and b/public/css/iconfont.ttf differ
diff --git a/public/css/iconfont.woff b/public/css/iconfont.woff
index 6d8d8a286..5356b3253 100644
Binary files a/public/css/iconfont.woff and b/public/css/iconfont.woff differ
diff --git a/public/css/iconfont.woff2 b/public/css/iconfont.woff2
index 8c92b7d01..c706d0270 100644
Binary files a/public/css/iconfont.woff2 and b/public/css/iconfont.woff2 differ
diff --git a/public/fonts/ALIBABA-PUHUITI-BOLD.TTF b/public/fonts/ALIBABA-PUHUITI-BOLD.TTF
new file mode 100644
index 000000000..af57de0e7
Binary files /dev/null and b/public/fonts/ALIBABA-PUHUITI-BOLD.TTF differ
diff --git a/public/fonts/SanJiXingKaiJianTi-Cu-2.ttf b/public/fonts/SanJiXingKaiJianTi-Cu-2.ttf
new file mode 100644
index 000000000..a7c6b6882
Binary files /dev/null and b/public/fonts/SanJiXingKaiJianTi-Cu-2.ttf differ
diff --git a/public/index.html b/public/index.html
index 71d7b0054..4b1c375e9 100755
--- a/public/index.html
+++ b/public/index.html
@@ -31,6 +31,7 @@
+
diff --git a/src/forge/Information/Component/UserAward.jsx b/src/forge/Information/Component/UserAward.jsx
new file mode 100644
index 000000000..594bc7084
--- /dev/null
+++ b/src/forge/Information/Component/UserAward.jsx
@@ -0,0 +1,175 @@
+import React, { useEffect, useState } from 'react';
+import { Modal, Button, Form, Input } from 'antd';
+import cookie from 'react-cookies';
+import { getZoneUrl } from 'educoder';
+
+import IconImg from '../img/user/icon1.png';
+import TemplateImg from '../img/user/template.png';
+
+import { applyAward } from '../api';
+import { httpUrl } from '../fetch';
+
+import '../indexUser.scss';
+
+function UserAward({ visible , onCancel , onSure , member , id, form }) {
+ const [ loading , setLoading ] = useState(false);
+ const [ score , setScore ] = useState(0);
+ const [ scoreLeft , setScoreLeft ] = useState(0);
+ const { getFieldDecorator, validateFields, getFieldsValue } = form;
+
+ useEffect(()=>{
+ if(visible && member && member.zonePointsAccount && member.zonePointsAccount.availablePoints) {
+ setScore(member.zonePointsAccount.availablePoints);
+ setScoreLeft(member.zonePointsAccount.availablePoints - 200);
+ }
+ },[visible, member])
+
+ function onOk() {
+ validateFields(async (err, values) => {
+ if (!err) {
+ try{
+ setLoading(true);
+ let imgInfo = await createImg(values.realName);
+
+ let certificateUrl = '';
+ if (imgInfo && imgInfo.code == 200 && imgInfo.url) {
+ certificateUrl = imgInfo.url || '';
+ }
+
+ const res = await applyAward({zoneId: id, sourceData: certificateUrl});
+ setLoading(false);
+
+ if (res && res.data && res.data.code === 200) {
+ onSure(res.data.msg);
+ }
+ }finally{
+ setLoading(false);
+ }
+ }
+ });
+ }
+
+ async function waitFontLoaded() {
+ // 等待自定义字体加载完成
+ if (document.fonts) {
+ await document.fonts.ready;
+ if(!document.fonts.check('64px sanjikai')) {
+ try {
+ const font = new FontFace('sanjikai', `url(${process.env.PUBLIC_URL}/fonts/SanJiXingKaiJianTi-Cu-2.ttf)`);
+ await font.load();
+ document.fonts.add(font);
+ } catch (e) {
+ console.warn('sanjikai 字体加载失败:', e);
+ }
+ }
+
+ if(!document.fonts.check('18px alibabaReg')) {
+ try {
+ const font = new FontFace('alibabaReg', `url(${process.env.PUBLIC_URL}/fonts/ALIBABA-PUHUITI-REGULAR.TTF)`);
+ await font.load();
+ document.fonts.add(font);
+ } catch (e) {
+ console.warn('alibabaReg 字体加载失败:', e);
+ }
+ }
+ }
+ }
+
+
+ async function createImg(realName) {
+ const canvas = document.createElement('canvas');
+ const ctx = canvas.getContext('2d');
+
+ const img = new Image();
+ img.crossOrigin = 'anonymous';
+ img.src = TemplateImg;
+
+ await new Promise((resolve, reject) => {
+ img.onload = resolve;
+ img.onerror = reject;
+ });
+
+ // 等待字体加载完成后再绘制
+ await waitFontLoaded();
+
+ canvas.width = img.width;
+ canvas.height = img.height;
+ ctx.drawImage(img, 0, 0);
+
+ const memberName = realName || member?.name || member?.nickname || '学员';
+ const awardDate = new Date().toLocaleDateString('zh-CN', { year: 'numeric', month: 'long', day: 'numeric' });
+
+ // 设置文字样式
+ ctx.font = '64px sanjikai';
+ ctx.fillStyle = '#04060c';
+ ctx.textAlign = 'center';
+ ctx.textBaseline = 'bottom';
+ ctx.fillText(memberName, canvas.width / 2, 705);
+
+ ctx.font = '18px alibabaReg';
+ ctx.fillStyle = '#04060c';
+ ctx.textAlign = 'left';
+ ctx.textBaseline = 'middle';
+ ctx.fillText(awardDate, 240, 1008);
+
+ const blob = await new Promise(resolve => canvas.toBlob(resolve, 'image/png'));
+ const formData = new FormData();
+ formData.append('file', blob, `${realName}_电子荣誉证书.png`);
+ formData.append('type', 'resource');
+
+ const uploadRes = await fetch(`${getZoneUrl(`/api/file/common/upload`)}`, {
+ method: 'POST',
+ body: formData,
+ credentials: 'include',
+ });
+
+ const uploadData = await uploadRes.json();
+ return uploadData;
+ }
+
+ return(
+ }
+ className="user_modal"
+ visible={visible}
+ title={
+

+
+
+ 兑换专属电子荣誉证书
+
+
超算专区 · 积分兑换
+
+
}
+ closable={true}
+ width={672}
+ footer={
+
+
+
+
+ }
+ okText="确定"
+ cancelText="取消"
+ >
+
+
您将消耗兑换「专属电子荣誉证书」,当前可用积分 {score.toLocaleString()} 分,兑换后剩余 {scoreLeft.toLocaleString()} 分。积分扣除后将自动生成证书,无法退回,请确认操作。请确认是否兑换专属电子荣誉证书?
+
+ {getFieldDecorator('realName', {
+ rules: [
+ {
+ required: true,
+ message: '请输入真实姓名'
+ }
+ ],
+ })(
+ ,
+ )}
+
+
+
+
+ )
+}
+export default Form.create()(UserAward);
\ No newline at end of file
diff --git a/src/forge/Information/Component/UserEdit.jsx b/src/forge/Information/Component/UserEdit.jsx
new file mode 100644
index 000000000..e545d736b
--- /dev/null
+++ b/src/forge/Information/Component/UserEdit.jsx
@@ -0,0 +1,136 @@
+import React, { useEffect, useState } from 'react';
+import { Modal, Form, Input, Button, Upload, message, Icon } from 'antd';
+import { getImageUrlAbsolute, getZoneUrl } from 'educoder';
+import cookie from 'react-cookies';
+
+const TokenKey = 'autologin_trustie';
+const { TextArea } = Input;
+
+import IconImg from '../img/user/icon.png';
+import '../indexUser.scss';
+
+function UserEdit({ visible, onCancel, form, onSure, type, zoneName, choosed, history, showCompeleteDialog, member, maxSize = 2 }) {
+ const [imageUrl, setImageUrl] = useState(undefined)
+ const [loading, setLoading] = useState(false);
+ const { getFieldDecorator, validateFields } = form;
+
+ useEffect(() => {
+ if (visible && member) {
+ form.setFieldsValue({
+ name: member.name || '',
+ introduction: member.introduction || ''
+ });
+
+ setImageUrl(member.imageUrl || '');
+ }
+ }, [visible, member]);
+
+ function onOk() {
+ validateFields((err, values) => {
+ if (!err) {
+ let temp = Object.assign({}, values, { imageUrl: imageUrl })
+ if (onSure) {
+ onSure(temp);
+ }
+ }
+ });
+ }
+
+ function closeHandler() {
+ // form.resetFields();
+ onCancel();
+ }
+
+ // 上传前
+ function beforeUpload(file){
+ const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png';
+ if (!isJpgOrPng) {
+ message.error('上传的图片只能是JPG或者PNG格式!');
+ }
+ const isLt2M = file.size / 1024 / 1024 < maxSize;
+ if (!isLt2M) {
+ message.error(`上传的图片不能超过${maxSize}MB!`);
+ }
+ isJpgOrPng && isLt2M && setLoading(true);
+ return isJpgOrPng && isLt2M;
+ }
+ // 上传完成后
+ function handleChange(info){
+ if(info && info.file && info.file.status === "done"){
+ setLoading(false);
+ setImageUrl(info.file.response.url);
+ }
+ }
+
+ return(
+ }
+ className="user_modal"
+ visible={visible}
+ title={
+

+
+
+ 个人资料管理
+
+
{zoneName} · 会员资料设置
+
+
}
+ closable={true}
+ width={672}
+ footer={
+
+
+
+
+ }
+ okText="确定"
+ cancelText="取消"
+ >
+
+
+

+
+
+
+
+ {/* */}
+
+ 上传本地图片
+ {/* */}
+
+
+
支持 JPG、PNG 格式 · 大小不超过 2MB。建议尺寸 200×200px 以上,效果更佳
+
+
+
+ {getFieldDecorator('name', {
+ rules: [
+ {
+ required:true,
+ message:"请输入您的昵称(1-20个字符)"
+ }
+ ],
+ })(
+ ,
+ )}
+
+
+ {getFieldDecorator('introduction')(
+ ,
+ )}
+
+
+
+
+ )
+}
+export default Form.create()(UserEdit);
\ No newline at end of file
diff --git a/src/forge/Information/Component/applyAcitvity.jsx b/src/forge/Information/Component/applyAcitvity.jsx
new file mode 100644
index 000000000..344daaeac
--- /dev/null
+++ b/src/forge/Information/Component/applyAcitvity.jsx
@@ -0,0 +1,133 @@
+import React, { useEffect, useState } from 'react';
+import { Modal, Form, Input, Button, Row, Col } from 'antd';
+
+import { doApplyActivity } from '../api';
+
+const { TextArea } = Input;
+
+import IconImg from '../img/user/icon1.png';
+import '../indexUser.scss';
+
+function ApplyActivity({ visible, onCancel, onSure, form, member, zoneName, }) {
+ const [loading, setLoading] = useState(false);
+ const { getFieldDecorator, validateFields } = form;
+
+ useEffect(() => {
+ if (visible) {
+ }
+ }, [visible]);
+
+ function onOk() {
+ validateFields((err, values) => {
+ if (!err) {
+ setLoading(true);
+ const data = Object.assign({}, values, { zoneId: member.zoneId });
+ doApplyActivity(data).then(res => {
+ if (res && res.data && res.data.code === 200) {
+ onSure(res.data.msg);
+ }
+ }).finally(() => { setLoading(false) });
+ }
+ });
+ }
+
+ function closeHandler() {
+ // form.resetFields();
+ onCancel();
+ }
+
+ return(
+ }
+ className="qa_modal"
+ visible={visible}
+ title={
+

+
+
+ 线下参观/沙龙报名
+
+
{zoneName} · 线下参观/沙龙报名
+
+
}
+ closable={true}
+ width={672}
+ footer={
+
+
+
+
+ }
+ okText="确定"
+ cancelText="取消"
+ >
+
+
+
+
+
申请将冻结对应积分,服务达成后正式扣除;若关闭申请,积分将退回
+
+
+
+ {getFieldDecorator('description')(
+ ,
+ )}
+
+
+ {getFieldDecorator('organization')(
+ ,
+ )}
+
+
+
+
+ {getFieldDecorator('wechat')(
+ ,
+ )}
+
+
+
+
+ {getFieldDecorator('email')(
+ ,
+ )}
+
+
+
+
+
+
+ )
+}
+export default Form.create()(ApplyActivity);
\ No newline at end of file
diff --git a/src/forge/Information/Component/applyQA.jsx b/src/forge/Information/Component/applyQA.jsx
new file mode 100644
index 000000000..2ed93dce7
--- /dev/null
+++ b/src/forge/Information/Component/applyQA.jsx
@@ -0,0 +1,133 @@
+import React, { useEffect, useState } from 'react';
+import { Modal, Form, Input, Button, Row, Col } from 'antd';
+
+import { doApplyQA } from '../api';
+
+const { TextArea } = Input;
+
+import IconImg from '../img/user/icon1.png';
+import '../indexUser.scss';
+
+function ApplyQA({ visible, onCancel, onSure, form, member, zoneName }) {
+ const [loading, setLoading] = useState(false);
+ const { getFieldDecorator, validateFields } = form;
+
+ useEffect(() => {
+ if (visible) {
+ }
+ }, [visible]);
+
+ function onOk() {
+ validateFields((err, values) => {
+ if (!err) {
+ setLoading(true);
+ const data = Object.assign({}, values, { zoneId: member.zoneId });
+ doApplyQA(data).then(res => {
+ if (res && res.data && res.data.code === 200) {
+ onSure(res.data.msg);
+ }
+ }).finally(() => { setLoading(false) });
+ }
+ });
+ }
+
+ function closeHandler() {
+ // form.resetFields();
+ onCancel();
+ }
+
+ return(
+ }
+ className="qa_modal"
+ visible={visible}
+ title={
+

+
+
+ 专家一对一答疑
+
+
{zoneName} · 专家一对一答疑
+
+
}
+ closable={true}
+ width={672}
+ footer={
+
+
+
+
+ }
+ okText="确定"
+ cancelText="取消"
+ >
+
+
+
+
+
申请将冻结对应积分,服务达成后正式扣除;若关闭申请,积分将退回
+
+
+
+ {getFieldDecorator('description')(
+ ,
+ )}
+
+
+ {getFieldDecorator('organization')(
+ ,
+ )}
+
+
+
+
+ {getFieldDecorator('wechat')(
+ ,
+ )}
+
+
+
+
+ {getFieldDecorator('email')(
+ ,
+ )}
+
+
+
+
+
+
+ )
+}
+export default Form.create()(ApplyQA);
\ No newline at end of file
diff --git a/src/forge/Information/Component/memberList.jsx b/src/forge/Information/Component/memberList.jsx
index 71c553325..2360c1795 100644
--- a/src/forge/Information/Component/memberList.jsx
+++ b/src/forge/Information/Component/memberList.jsx
@@ -1,16 +1,36 @@
-import React,{useCallback, useEffect,useState} from 'react';
+import React,{useCallback, useEffect,useState,useMemo,useRef} from 'react';
import { Link } from 'react-router-dom';
import { tempEnum } from '../tempInfo';
import Crown from '../img/crown.png';
import Nodata from '../../Nodata';
import nodata from '../img/nodata.png';
import { Input } from 'antd';
+import Slider from 'react-slick';
+import 'slick-carousel/slick/slick.css';
+import 'slick-carousel/slick/slick-theme.css';
+import Left from '../img/ringleft.png';
+import Right from '../img/ringright.png';
const { Search } = Input;
function Member(props) {
const { vipLists, temp , deptId , headIcon , hoverIcon } = props;
const isUOS = deptId === "uos";//id===91:泛在的开发社区成员,定制
+
const [ list , setList ] = useState(vipLists);
+ const sliderRef = useRef(null);
+ const [currentSlide, setCurrentSlide] = useState(0);
+
+ // 将成员列表按每行8个进行分组
+ const groupMembersByRow = (members) => {
+ if (!members || members.length === 0) return [];
+ const grouped = [];
+ for (let i = 0; i < members.length; i += 24) {
+ grouped.push(members.slice(i, i + 24));
+ }
+ console.log(grouped);
+
+ return grouped;
+ };
useEffect(()=>{
if(vipLists && vipLists.length > 0 ){
@@ -30,6 +50,51 @@ function Member(props) {
setList(ele);
}
+ const PrevArrow = (props) => {
+ const { onClick } = props;
+ const isDisabled = currentSlide === 0;
+ return (
+
+
+
+ );
+ };
+
+ const NextArrow = (props) => {
+ const { onClick, currentSlide, slideCount } = props;
+ const isDisabled = currentSlide >= slideCount - 1;
+ return (
+
+
+
+ );
+ };
+
+ const cateSetting={
+ dots: false,
+ arrows: true,
+ infinite: false,
+ speed: 800,
+ slidesToShow: 1,
+ slidesToScroll: 1,
+ centerMode: false,
+ centerPadding: '0px',
+ autoplay: false,
+ autoplaySpeed: 5000,
+ pauseOnHover: true,
+ prevArrow: ,
+ nextArrow: ,
+ afterChange: (index) => {
+ setCurrentSlide(index);
+ },
+ }
+
return(
{
@@ -60,13 +125,38 @@ function Member(props) {
}
{
i.zoneMemberList && i.zoneMemberList.length > 0 ?
-
+ (i.typeName.indexOf("社区成员")>-1 && !deptId ?
+
+
成员总览共{i.zoneMemberList.length}个
+
+ {
+ groupMembersByRow(i.zoneMemberList).map((row, rowIndex) => (
+
+
+ {row.map((member, colIndex) => (
+
+
+
+

+
+
{member.name}
+
{member.memberLevel && {member.memberLevel} }
+
+
+ ))}
+
+
+ ))
+ }
+
+
+ :
{
i.zoneMemberList.map((j,key)=>{
return(
-
- { !(isUOS && i.id === 91) &&
}
+ { !(isUOS && i.id === 91) &&
}
{j.name}
@@ -81,10 +171,9 @@ function Member(props) {
})
}
- :
- (
- temp === tempEnum.zone1 ? :
)
+ :
+ (temp === tempEnum.zone1 ? : )
}
)
diff --git a/src/forge/Information/Component/pointsDoc.jsx b/src/forge/Information/Component/pointsDoc.jsx
new file mode 100644
index 000000000..29b4d9edc
--- /dev/null
+++ b/src/forge/Information/Component/pointsDoc.jsx
@@ -0,0 +1,142 @@
+import React, { useEffect, useState } from 'react';
+import { Modal, Form, Input, Button, Spin, Pagination } from 'antd';
+
+import Nodata from '../../Nodata';
+
+import { getNewsMyList, getMyTopArticle, doDocTop } from '../api';
+
+
+const { TextArea } = Input;
+
+
+import { getImageUrl } from 'educoder'
+
+import '../indexUser.scss';
+
+function PointsDoc({ visible , onCancel , onSure , type , username , choosed , history , showCompeleteDialog , member }) {
+ const limit = 5;
+
+ const [ page , setPage ] = useState(1);
+ const [ total , setTotal ] = useState(0);
+ const [ isSpin , setIsSpin ] = useState(true);
+ const [ list , setList ] = useState(undefined);
+ const [ currentId , setCurrentId ] = useState(null);
+ const [ currentRow , setCurrentRow ] = useState(null);
+
+ useEffect(()=>{
+ if(visible && member) {
+ setPage(1);
+ }
+ },[visible, member])
+
+ useEffect(()=>{
+ if(visible && member) {
+ init();
+ }
+ },[visible, member])
+
+
+ useEffect(()=>{
+ if(visible && member) {
+ getMyNews();
+ }
+ },[page])
+
+ async function init() {
+ setIsSpin(true);
+ try{
+ let res = await getMyTopArticle(member.zoneId);
+ if(res && res.data.code === 200){
+ setCurrentRow(res.data.data);
+ let newId = null;
+ if(res.data.data) {
+ newId = res.data.data.docId;
+ }
+ setCurrentId(newId);
+ await getMyNews(newId);
+ }
+ }finally{
+ setIsSpin(false)
+ }
+ }
+
+ async function getMyNews(overrideId){
+ const excludeId = overrideId !== undefined ? overrideId : currentId;
+ let result = await getNewsMyList(member.zoneId,{auditStatus:1, excludeId, pageSize:limit, pageNum:page});
+ let rows = result.data && result.data.rows;
+ if(rows && rows.length>0){
+ setList(rows);
+ }else{
+ setList([]);
+ }
+ setTotal(result.data.total);
+ }
+
+ function onOk() {
+ }
+
+ async function handlePin(item) {
+ setIsSpin(true);
+ try {
+ let data = Object.assign({}, item, {zoneId: member.zoneId});
+ await doDocTop(data);
+ onSure();
+ } finally {
+ setIsSpin(false);
+ }
+ }
+
+ return(
+
}
+ className="doc_modal"
+ visible={visible}
+ title={
+ 专区首页新闻推荐
+
}
+ closable={true}
+ width={800}
+ footer={
+
+
+
+ }
+ okText="确定"
+ cancelText="取消"
+ >
+
+
+
+ 新闻标题
+ 操作
+
+ {currentRow && (
+
+ {currentRow.docName}
+
+
+
+
+ )}
+ {list && list.map((item) => (
+
+ {item.name}
+
+
+
+
+ ))}
+ { !isSpin && !currentId && (!list || !list.length) &&
+ }
+
+ {
+ total > limit &&
+
+ }
+
+
+ )
+}
+export default PointsDoc;
\ No newline at end of file
diff --git a/src/forge/Information/Component/pointsProject.jsx b/src/forge/Information/Component/pointsProject.jsx
new file mode 100644
index 000000000..699378286
--- /dev/null
+++ b/src/forge/Information/Component/pointsProject.jsx
@@ -0,0 +1,142 @@
+import React, { useEffect, useState } from 'react';
+import { Modal, Form, Input, Button, Spin, Pagination } from 'antd';
+
+import Nodata from '../../Nodata';
+
+import { getProjectMyList, getMyTopProject, doProjectTop } from '../api';
+
+
+const { TextArea } = Input;
+
+
+import { getImageUrl } from 'educoder'
+
+import '../indexUser.scss';
+
+function PointsDoc({ visible , onCancel , onSure , type , username , choosed , history , showCompeleteDialog , member }) {
+ const limit = 5;
+
+ const [ page , setPage ] = useState(1);
+ const [ total , setTotal ] = useState(0);
+ const [ isSpin , setIsSpin ] = useState(true);
+ const [ list , setList ] = useState(undefined);
+ const [ currentId , setCurrentId ] = useState(null);
+ const [ currentRow , setCurrentRow ] = useState(null);
+
+ useEffect(()=>{
+ if(visible && member) {
+ setPage(1);
+ }
+ },[visible, member])
+
+ useEffect(()=>{
+ if(visible && member) {
+ init();
+ }
+ },[visible, member])
+
+
+ useEffect(()=>{
+ if(visible && member) {
+ getMyProject();
+ }
+ },[page])
+
+ async function init() {
+ setIsSpin(true);
+ try{
+ let res = await getMyTopProject(member.zoneId);
+ if(res && res.data.code === 200){
+ setCurrentRow(res.data.data);
+ let newId = null;
+ if(res.data.data) {
+ newId = res.data.data.id;
+ }
+ setCurrentId(newId);
+ await getMyProject(newId);
+ }
+ }finally{
+ setIsSpin(false)
+ }
+ }
+
+ async function getMyProject(overrideId){
+ const excludeId = overrideId !== undefined ? overrideId : currentId;
+ let result = await getProjectMyList({zoneId: member.zoneId, auditStatus:1, excludeId, pageSize:limit, pageNum:page});
+ let rows = result.data && result.data.rows;
+ if(rows && rows.length>0){
+ setList(rows);
+ }else{
+ setList([]);
+ }
+ setTotal(result.data.total);
+ }
+
+ function onOk() {
+ }
+
+ async function handlePin(item) {
+ setIsSpin(true);
+ try {
+ let data = Object.assign({}, item, {zoneId: member.zoneId});
+ await doProjectTop(data);
+ onSure();
+ } finally {
+ setIsSpin(false);
+ }
+ }
+
+ return(
+
}
+ className="doc_modal"
+ visible={visible}
+ title={
+ 专区首页项目推荐
+
}
+ closable={true}
+ width={800}
+ footer={
+
+
+
+ }
+ okText="确定"
+ cancelText="取消"
+ >
+
+
+
+ 项目名称
+ 操作
+
+ {currentRow && (
+
+ {currentRow.name}
+
+
+
+
+ )}
+ {list && list.map((item) => (
+
+ {item.projectProperties?.name}
+
+
+
+
+ ))}
+ { !isSpin && !currentId && (!list || !list.length) &&
+ }
+
+ {
+ total > limit &&
+
+ }
+
+
+ )
+}
+export default PointsDoc;
\ No newline at end of file
diff --git a/src/forge/Information/Component/publicBanner.jsx b/src/forge/Information/Component/publicBanner.jsx
index 948875201..25bc003e2 100644
--- a/src/forge/Information/Component/publicBanner.jsx
+++ b/src/forge/Information/Component/publicBanner.jsx
@@ -11,10 +11,9 @@ import uosIcon from "../img/uos.png";
const { Search } = Input;
function PublicBanner(props) {
- const [key, setKey] = useState("1");
const { deptId } = props.match.params;
const { pathname } = props.history.location;
- const { data: { sectionHomepageShow, sectionHomepageTitle, sectionProjectShow, sectionDataSetShow, sectionDataSetTitle, sectionProjectTitle, sectionResourceShow, sectionResourceTitle, sectionCmsShow, sectionCmsTitle, sectionMemberShow, sectionMemberTitle, sectionHelperShow, sectionHelperTitle }, data, adminUrl, temp, showLoginDialog, showNotification, checkIfLogin, id } = props;
+ const { data: { sectionHomepageShow, sectionHomepageTitle, sectionProjectShow, sectionDataSetShow, sectionDataSetTitle, sectionProjectTitle, sectionResourceShow, sectionResourceTitle, sectionCmsShow, sectionCmsTitle, sectionMemberShow, sectionPointsShow, sectionMemberTitle, sectionHelperShow, sectionHelperTitle }, data, adminUrl, temp, showLoginDialog, showNotification, checkIfLogin, id } = props;
const isNSCC = deptId === "NSCC";
const isUOS = deptId === "uos";
const [memberStatus, setMemberStatus] = useState(memberStatusEnum.notMember);
@@ -27,41 +26,21 @@ function PublicBanner(props) {
return Boolean(sectionHomepageShow | sectionProjectShow | sectionDataSetShow | sectionResourceShow | sectionCmsShow | sectionMemberShow | sectionHelperShow | adminUrl)
}, [sectionHomepageShow, sectionProjectShow, sectionDataSetShow, sectionResourceShow, sectionCmsShow, sectionMemberShow, sectionHelperShow, adminUrl])
- useEffect(() => {
- if (pathname) {
- const info = /[A-Za-z0-9]{0,}\/news/g;
- const infodetail = /[A-Za-z0-9]{0,}\/newdetail/g;
- const project = /[A-Za-z0-9]{0,}\/projects/g;
- const source = /[A-Za-z0-9]{0,}\/source/g;
- const vip = /[A-Za-z0-9]{0,}\/VIP/g;
- const help = /[A-Za-z0-9]{0,}\/help/g;
- const dataset = /[A-Za-z0-9]{0,}\/dataset/g;
- const lesson = /[A-Za-z0-9]{0,}\/lessons/g;
- if (pathname === `/zone/${deptId}`) {
- setKey("1");
- }
- else if (project.test(pathname)) {
- setKey("2");
- }
- else if (source.test(pathname)) {
- setKey("3");
- }
- else if (info.test(pathname) || infodetail.test(pathname)) {
- setKey("4");
- }
- else if (vip.test(pathname)) {
- setKey("6");
- }
- else if (help.test(pathname)) {
- setKey("8");
- }
- else if (dataset.test(pathname)) {
- setKey("9");
- }else if(lesson.test(pathname)) {
- setKey("10");
- }
+ const key = useMemo(() => {
+ if (!pathname) return "1";
+ if (pathname === `/zone/${deptId}`) return "1";
+ if (/[A-Za-z0-9]{0,}\/projects/g.test(pathname)) return "2";
+ if (/[A-Za-z0-9]{0,}\/source/g.test(pathname)) return "3";
+ if (/[A-Za-z0-9]{0,}\/(news|newdetail)/g.test(pathname)) return "4";
+ if (/[A-Za-z0-9]{0,}\/VIP/g.test(pathname)) return "6";
+ if (/[A-Za-z0-9]{0,}\/help/g.test(pathname)) return "8";
+ if (/[A-Za-z0-9]{0,}\/dataset/g.test(pathname)) return "9";
+ if (/[A-Za-z0-9]{0,}\/lessons/g.test(pathname)) return "10";
+ if (/[A-Za-z0-9]{0,}\/(user|score)/gi.test(pathname)) {
+ return (!adminUrl && sectionPointsShow) ? "11" : "1";
}
- }, [pathname])
+ return "1";
+ }, [pathname, deptId, adminUrl, sectionPointsShow])
useEffect(() => {
if (id && deptId && deptId === "NSCC") {
@@ -187,6 +166,7 @@ function PublicBanner(props) {
{/*
Sig小组 */}
{isNSCC &&
课程实训}
{sectionMemberShow &&
{sectionMemberTitle}}
+ {(!adminUrl && sectionPointsShow) &&
积分中心}
{sectionHelperShow &&
{data.sectionHelperTitle}}
{adminUrl &&
{ window.location.href = adminUrl }}>
后台管理}
diff --git a/src/forge/Information/Pages/custom/index.less b/src/forge/Information/Pages/custom/index.less
index dd08e4b00..c7524307b 100644
--- a/src/forge/Information/Pages/custom/index.less
+++ b/src/forge/Information/Pages/custom/index.less
@@ -13,13 +13,18 @@
font-family: 'alibaba PuHuiTi';
background-image: url(../../img/custom/bc.png);
background-size: 100%;
+ .statistics-cards-bc{
+ background-image: url(../../img/vipTitleBc.png);
+ background-size: 100% 124%;
+ padding: 25px 0;
+ background-position-y: bottom;
+ }
.statistics-cards{
width: 80%;
- margin: 25px auto;
+ margin: 0 auto;
text-align: center;
border: 2px solid #ffffff;
border-radius: 15px;
- background: rgba(255, 255, 255, 0.2352941176);
backdrop-filter: blur(10px);
padding: 30px 0;
color:#091221;
diff --git a/src/forge/Information/Pages/custom/vip.jsx b/src/forge/Information/Pages/custom/vip.jsx
index f1af76b14..b0b698791 100644
--- a/src/forge/Information/Pages/custom/vip.jsx
+++ b/src/forge/Information/Pages/custom/vip.jsx
@@ -27,8 +27,7 @@ function CustomVip(props){
const [ applyVisible , setApplyVisible ] = useState(false);
const [ memberStatus , setMemberStatus] = useState(memberStatusEnum.notMember);
const { id, showNotification, checkIfLogin, showLoginDialog, temp, sectionMemberTitle } = props;
- const isNSCC = deptId === "NSCC";
-
+
useEffect(()=>{
let uuid = getUniqueIdentifier()
let url = props.location.pathname
@@ -50,7 +49,7 @@ function CustomVip(props){
function getLists(){
getVIPLists(id).then(response=>{
- if(response){
+ if(response && response.data){
setVIPLists(response.data.rows);
setIsSpin(false);
}
@@ -86,19 +85,27 @@ function CustomVip(props){
}
setApplyVisible(!applyVisible)
}
- const nsccTitle = (title, delay=0.1, classname)=>
- {title && title.split("").map((char, index) => (
-
- {char}
-
- ))}
+ const nsccTitle = (title, delay = 0.1, classname, emptyIndex) =>
+ {title && title.split("").map((char, index) => {
+ return (
+ <>
+
+ {char}
+
+ {emptyIndex && index === emptyIndex - 1 && }
+ >
+ )
+ }
+ )}
return(
setApplyVisible(!applyVisible)} current_user={props.current_user}/>
- { nsccTitle(sectionMemberTitle) }
-
{tempConfig[temp].vipDesc}
+ { nsccTitle(`社区会员` + "聚力前行", 0.1, "", 4) }
+
+
{tempConfig[temp].vipDesc}
+
{ memberStatus === memberStatusEnum.notMember &&
申请加入}
{ memberStatus === memberStatusEnum.applying &&
您的申请已提交,请耐心等待管理员审核!
}
diff --git a/src/forge/Information/Pages/homepage/component/newsByNSCC.jsx b/src/forge/Information/Pages/homepage/component/newsByNSCC.jsx
index 76d5b6335..eb2caad6e 100644
--- a/src/forge/Information/Pages/homepage/component/newsByNSCC.jsx
+++ b/src/forge/Information/Pages/homepage/component/newsByNSCC.jsx
@@ -1,6 +1,6 @@
import React , { useEffect, useRef, useState } from 'react';
import { Link } from 'react-router-dom';
-import { getDirListById, getSubDocList } from '../../../api';
+import { getDirListById, getSubDocList, getPointsDocList } from '../../../api';
import { Badge, Col, Divider, Icon, Row } from 'antd';
import '../index.scss';
import Nodata from '../../../../Nodata';
@@ -19,6 +19,11 @@ function News(props) {
const [activeDirId, setActiveDirId] = useState(undefined);
const [total, setTotal] = useState(0);
const newsSectionRef = useRef(null);
+ const topBoxRef = useRef(null);
+ const [hasAppended, setHasAppended] = useState(false);
+ const [activeIndex, setActiveIndex] = useState(0);
+ const scrollIndexRef = useRef(0);
+ const scrollTimerRef = useRef(null);
useEffect(() => {
let hasAnimated = false; // 标记动画是否已触发
@@ -60,11 +65,8 @@ function News(props) {
rows[0] && getDocById(rows[0].id, 5, (data)=>{
setDocListByFirstDir(data)
})
- // 获取第2个栏目的3篇文章
- rows[1] && getDocById(rows[1].id, 3, (data)=>{
- setDocListBySecondDir(data)
- })
- // rows[2] && setActiveDirId(rows[2].id)
+
+ getPointsDoc();
}
})
}, [id])
@@ -74,6 +76,97 @@ function News(props) {
setDocListByDir(data)
}, (data)=>{setTotal(data)})
}, [activeDirId])
+
+ // 监控topBox高度,当高度>593时复制docListBySecondDir追加到自身
+ useEffect(() => {
+ if (!topBoxRef.current || !docListBySecondDir.length) return;
+
+ const observer = new ResizeObserver((entries) => {
+ for (const entry of entries) {
+ const height = entry.contentRect.height;
+ if (height > 593 && !hasAppended) {
+ setDocListBySecondDir(prev => [...prev, ...docListBySecondDir]);
+ setHasAppended(true);
+ // 滚动动画由hasAppended变化触发的useEffect自动启动
+ }
+ }
+ });
+
+ observer.observe(topBoxRef.current);
+
+ return () => {
+ observer.disconnect();
+ };
+ }, [docListBySecondDir, hasAppended])
+
+ // 滚动动画:每隔3秒将下一个docBySecondDir_NSCC元素滚动到topBox顶部
+ useEffect(() => {
+ if (!hasAppended || !topBoxRef.current) return;
+
+ const topBox = topBoxRef.current;
+ scrollIndexRef.current = 0;
+ // 给topBox添加transition实现平滑动画
+ topBox.style.transition = 'transform 0.5s linear';
+
+ scrollTimerRef.current = setInterval(() => {
+ const items = topBox.querySelectorAll('.docBySecondDir_NSCC');
+ if (!items.length) return;
+
+ const targetIndex = scrollIndexRef.current % items.length;
+
+ // 计算目标元素之前所有元素的总高度(含margin),作为translateY偏移量
+ let offset = 0;
+ for (let i = 0; i < targetIndex; i++) {
+ offset += items[i].offsetHeight;
+ const styles = window.getComputedStyle(items[i]);
+ offset += parseFloat(styles.marginBottom) || 0;
+ }
+ topBox.style.transform = `translateY(-${offset}px)`;
+
+ // 滚动到第一个复制元素时,等待动画完成后瞬间重置offset为0,实现无缝循环
+ if (targetIndex === docListBySecondDir.length / 2) {
+ setActiveIndex((targetIndex + 1) % (docListBySecondDir.length / 2));
+ setTimeout(() => {
+ topBox.style.transition = 'none';
+ topBox.style.transform = 'translateY(0)';
+ void topBox.offsetWidth;
+ topBox.style.transition = 'transform 0.5s linear';
+ setActiveIndex(1);
+ }, 500);
+ scrollIndexRef.current = 0;
+ } else {
+ setActiveIndex((targetIndex + 1) % (docListBySecondDir.length / 2));
+ }
+
+ scrollIndexRef.current++;
+ }, 3000);
+
+ return () => {
+ if (scrollTimerRef.current) {
+ clearInterval(scrollTimerRef.current);
+ scrollTimerRef.current = null;
+ }
+ // 清理时恢复topBox样式
+ topBox.style.transition = '';
+ topBox.style.transform = '';
+ };
+ }, [hasAppended])
+
+ function getPointsDoc() {
+ getPointsDocList(id).then(result=>{
+ let docList = [];
+ if(result && Array.isArray(result.data.data) && result.data.data.length){
+ docList = result.data.data.map(item => {
+ item.id = item.docId;
+ item.name = item.docName;
+ item.summary = item.summary;
+ item.zoneId = item.zoneId;
+ return item;
+ });
+ }
+ setDocListBySecondDir(docList);
+ });
+ }
// 根据招聘专栏的id获取其栏目下的招聘文章
function getDocById(dirId, pageSize=10, setData, setTotal1){
@@ -114,21 +207,33 @@ function News(props) {
}
}
{/* 第二个顺序栏目 */}
- {secondDir &&
-
-
{window.scrollTo(0,450)}} className="font-18 font-bd">{secondDir.name}
- {docListBySecondDir.map(item=>{
- return
-
- {window.scrollTo(0,450)}}>{item.name}
-
-
- {item.summary}
+ {secondDir &&
+ {/*
*/}
+ {/*
{window.scrollTo(0,450)}} className="font-18 font-bd">{secondDir.name} */}
+
+
+
+ {docListBySecondDir.map((item, index)=>{
+ return
+
+ {window.scrollTo(0,450)}}>{item.name}
+
+
+ {item.summary}
+
+
查看详情
-
查看详情
+ })}
- })}
- {docListBySecondDir && !docListBySecondDir.length &&
}
+ {docListBySecondDir && !docListBySecondDir.length &&
}
+
}
diff --git a/src/forge/Information/Pages/homepage/component/projectByNSCC.jsx b/src/forge/Information/Pages/homepage/component/projectByNSCC.jsx
index b35d69ec9..28f9a1f8f 100644
--- a/src/forge/Information/Pages/homepage/component/projectByNSCC.jsx
+++ b/src/forge/Information/Pages/homepage/component/projectByNSCC.jsx
@@ -1,6 +1,6 @@
import React, { useEffect, useRef, useState } from 'react';
import '../index.scss';
-import { getProjectListByScore, getProjectsTypeLists } from '../../../api';
+import { getProjectListByScore, getProjectsTypeLists, getPointsProjectList } from '../../../api';
import { Carousel, Divider, Pagination, Spin } from 'antd';
import Nodata from '../../../../Nodata';
import Slider from 'react-slick';
@@ -24,6 +24,7 @@ function TypeCarousel({pageSize=4, list=[], typeId, onClick}) {
{page.map((item, i) => {
const order = index*pageSize+i
const iconName = {
+ "精选项目": "icon-jingxuanxiangmu1",
"并行计算框架": "icon-binghangjisuankuangjia",
"异构数据库": "icon-yigoushujuku",
"性能基准与评测": "icon-xingnengjizhunyupingce",
@@ -55,6 +56,7 @@ function Project({ data, nsccTitle }) {
const [typeList, setTypeList] = useState([]);
const [typeId, setTypeId] = useState(undefined);
const [lists, setLists] = useState([]);
+ const [topList, setTopList] = useState([]);
const [loading, setLoading] = useState(false);
const [page, setPage] = useState(1);
const [total, setTotal] = useState(0);
@@ -93,20 +95,41 @@ function Project({ data, nsccTitle }) {
}, []);
useEffect(() => {
- id && getProjectsTypeLists(id, {
- pageNum: 1,
- pageSize: 100,
- }).then(result => {
- if (result) {
- const rows = result.data.rows;
- rows[0] && setTypeId(rows[0].id)
- setTypeList(rows);
+ async function fetchTypeData() {
+ let typeList = [];
+ let typeId = null;
+ if(id) {
+ let res = await getPointsProjectList(id);
+ if(res && Array.isArray(res.data.data) && res.data.data.length){
+ setTopList(res.data.data);
+ typeList.push({id: -1, zoneId: id, name: '精选项目'});
+ typeId = -1;
+ }
+
+ getProjectsTypeLists(id, {
+ pageNum: 1,
+ pageSize: 100,
+ }).then(result => {
+ if (result) {
+ const rows = result.data.rows;
+ if(Array.isArray(rows) && rows.length) {
+ typeList = [...typeList, ...rows];
+ setTypeList(typeList);
+ if (typeId === null) {
+ setTypeId(rows[0].id);
+ } else {
+ setTypeId(typeId);
+ }
+ }
+ }
+ }).catch(() => { })
}
- }).catch(() => { })
+ }
+ fetchTypeData();
}, [id])
useEffect(() => {
- if (typeId) {
+ if (typeId && typeId !== -1) { // 非置顶项目查询数据
setLoading(true);
getProjectListByScore(id, {
pageNum: page,
@@ -168,25 +191,86 @@ function Project({ data, nsccTitle }) {
}
+ const topDetail = (className="top_detail", i, index, length) => {
+ const { extra: { } } = i || {}
+ return window.open(i.projectURL)}>
+
+ {i.projectProperties && i.projectProperties.name}
+
+
+ {i.projectProperties.description || "暂无描述"}
+
+
+
+ {
+ i.projectProperties && i.projectProperties.topics &&
+ i.projectProperties.topics.split(",").map(t => {
+ return (
+ - {t}
+ )
+ })
+ }
+
+
+
+
+ {i.projectProperties.language && (
+ <>
+
+
{i.projectProperties.language}
+
+ >
+ )}
+ {i.projectProperties.timeAgo &&
更新于{i.projectProperties.timeAgo}}
+
+
+ 赞 {i.projectProperties.praisesCount}
+ fork {i.projectProperties.forkedCount}
+
+
+
+ }
+
return
{nsccTitle(homepageProjectTitle, 0.1, "font-bd font-30 mb50 align task-hide")}
{setTypeId(id); setPage(1)}}/>
-
-
- {lists.slice(0, 3).map((i, index)=>{
- return projectDetail("online_detail", i, index, 3)
- })}
-
- {lists.length > 3 &&
- {lists.slice(3).map((i, index)=>{
- return projectDetail("second_detail", i, index, lists.slice(4).length)
- })}
-
}
- {setPage(page)}} className='center mt30'/>
- {!loading && lists.length === 0 && }
-
+ {
+ typeId !== -1 &&
+
+
+ {lists.slice(0, 3).map((i, index)=>{
+ return projectDetail("online_detail", i, index, 3)
+ })}
+
+ {lists.length > 3 &&
+ {lists.slice(3).map((i, index)=>{
+ return projectDetail("second_detail", i, index, lists.slice(4).length)
+ })}
+
}
+ {setPage(page)}} className='center mt30'/>
+ {!loading && lists.length === 0 && }
+
+ }
+ {
+ typeId === -1 &&
+
+
+ {topList.slice(0, 3).map((i, index)=>{
+ return topDetail("top_detail", i, index, 3)
+ })}
+
+ {topList.length > 3 &&
+ {topList.slice(3).map((i, index)=>{
+ return topDetail("top_detail", i, index, topList.slice(4).length)
+ })}
+
}
+ {/* {setPage(page)}} className='center mt30'/> */}
+ {!loading && topList.length === 0 && }
+
+ }
+
diff --git a/src/forge/Information/Pages/homepage/component/sourceByNSCC.jsx b/src/forge/Information/Pages/homepage/component/sourceByNSCC.jsx
index 9243289c1..e11b091d8 100644
--- a/src/forge/Information/Pages/homepage/component/sourceByNSCC.jsx
+++ b/src/forge/Information/Pages/homepage/component/sourceByNSCC.jsx
@@ -56,9 +56,9 @@ function Source({data, nsccTitle}) {
- {sourceList.map(i => {
+ {sourceList.map((i, index) => {
const time = i.updateTime || i.createTime
- return
+ return
diff --git a/src/forge/Information/Pages/homepage/image/projectBk4.png b/src/forge/Information/Pages/homepage/image/projectBk4.png
new file mode 100644
index 000000000..c93238443
Binary files /dev/null and b/src/forge/Information/Pages/homepage/image/projectBk4.png differ
diff --git a/src/forge/Information/Pages/homepage/image/python_color.png b/src/forge/Information/Pages/homepage/image/python_color.png
new file mode 100644
index 000000000..a186d9519
Binary files /dev/null and b/src/forge/Information/Pages/homepage/image/python_color.png differ
diff --git a/src/forge/Information/Pages/homepage/image/python_white.png b/src/forge/Information/Pages/homepage/image/python_white.png
new file mode 100644
index 000000000..1d02ab265
Binary files /dev/null and b/src/forge/Information/Pages/homepage/image/python_white.png differ
diff --git a/src/forge/Information/Pages/homepage/index.scss b/src/forge/Information/Pages/homepage/index.scss
index d661a8acc..df5933451 100644
--- a/src/forge/Information/Pages/homepage/index.scss
+++ b/src/forge/Information/Pages/homepage/index.scss
@@ -829,7 +829,7 @@
}
}
.firstDir_NSCC{
- width:690px;
+ width:910px;
background-color: #F6F8FD;
border-radius:15px;
box-shadow:0px 0px 12px rgba(33, 73, 212, 0.1);
@@ -875,7 +875,7 @@
}
.firstDoc_Img{
- width:690px;
+ width:910px;
object-fit: cover;
transition: transform 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}
@@ -894,17 +894,26 @@
background: linear-gradient(180deg,#f4f7ff 0%,#F6F8FD 100%), url('./image/bkImg6.png') top/contain no-repeat;
background-blend-mode: multiply;
padding: 30px 25px;
+ max-height:653px;
+ overflow: hidden;
+ }
+ .topBox{
}
.docBySecondDir_NSCC{
+ cursor: pointer;
background-image:linear-gradient(180deg,#f4f7ff 0%,#ffffff 100%);
border-radius:15px;
box-shadow:0px 0px 12px rgba(33, 73, 212, 0.06);
padding: 16px 20px;
transition: all 0.3s ease;
+ margin-bottom:15px;
+ &:last-child{
+ margin-bottom:0px;
+ }
a.font-14{
color: $primary-color;
}
- &:hover{
+ &:hover, &.active{
background-image: url('./image/bkImg7.png');
background-size: 100% 100%;
div, a, p{
@@ -954,7 +963,7 @@
background-size: 100% 100%;
}
.proTypeBox {
- padding: 4px 15px;
+ padding: 4px 24px;
&.active {
color: $primary-color;
background-color: #ffffff;
@@ -1035,6 +1044,87 @@
}
}
}
+ .top_detail{
+ background-image: url('./image/projectBk1.png');
+ background-size: 100% 100%;
+ flex: 0 0 calc(33.333% - 15px);
+ padding: 22px 20px 20px 20px;
+ border-radius:15px;
+ box-shadow:0px 0px 12px rgba(33, 73, 212, 0.1);
+ font-family: alibabaReg;
+ color: #091221;
+ .topitem{
+ background-color: rgba(76, 88, 118, 0.04);
+ padding: 4px 8px;
+ border-radius: 4px;
+ }
+ .topTitle{
+ font-family: alibaba;
+ font-size: 16px;
+ }
+ .pythonicon{
+ width: 14px;
+ height: 14px;
+ margin-right: 6px;
+ background-image: url('./image/python_color.png');
+ background-position: center;
+ background-size: 100% 100%;
+ }
+ &:hover{
+ cursor: pointer;
+ background-image: url('./image/projectBk4.png');
+ span, div{
+ color: white;
+ }
+ .color5d6:not(.task-hide-2){
+ opacity: 0.8;
+ }
+ .pd_tag_NSCC li{
+ color:#ffffff;
+ background-color:rgba(255, 255, 255, 0.12);
+ border: 1px solid rgba(255, 255, 255, 0.5);
+ }
+ .topitem{
+ background-color: rgba(255, 255, 255, 0.1);
+ }
+ .top_tag_NSCC{
+ li{
+ padding: 0 8px;
+ border-radius:4px;
+ margin-right: 8px;
+ color:#ffffff;
+ background-color:rgba(255, 255, 255, 0.12);
+ border: 1px solid rgba(255, 255, 255, 0.5);
+ }
+ }
+ .pythonicon{
+ width: 14px;
+ height: 14px;
+ margin-right: 6px;
+ background-image: url('./image/python_white.png');
+ background-position: center;
+ background-size: 100% 100%;
+ }
+ }
+ &.top:hover{
+ background-image: url('./image/projectBk4.png');
+ }
+ .top_tag_NSCC{
+ li{
+ padding: 0 8px;
+ border-radius:4px;
+ border: 1px solid transparent;
+ background:linear-gradient(281.55deg,rgba(10, 145, 255, 0.08) 1.48%,rgba(43, 103, 238, 0.08) 53.53%,rgba(133, 110, 250, 0.08) 95.62%);
+ margin-right: 8px;
+ }
+ }
+ }
+ .top_detailBox{
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ column-gap: 20px;
+ row-gap: 20px;
+ }
}
.source_1_bg_NSCC{
background-image: url('./image/bkImg9.png');
@@ -1184,4 +1274,5 @@
}
}
}
-}
\ No newline at end of file
+}
+
diff --git a/src/forge/Information/Pages/newsCreate.jsx b/src/forge/Information/Pages/newsCreate.jsx
index 59b3bb868..a78100fbd 100644
--- a/src/forge/Information/Pages/newsCreate.jsx
+++ b/src/forge/Information/Pages/newsCreate.jsx
@@ -97,11 +97,11 @@ function NewsCreate(props){
if(isEdit){
delete params.editorType;
return updateDoc(newsId, params).then(res=>{
- const {data:{code, msg}} = res;
+ const {data:{code, msg , data}} = res;
setLoading(false);
if(code === 200){
message.success("提交成功");
- history.push(`/zone/${deptId}/newdetail/${newsId}`);
+ history.push(`/zone/${deptId}/newdetail/${data}`);
}else{
message.error(msg || '提交失败,请联系管理员!')
}
diff --git a/src/forge/Information/Pages/project/cateList/CategorySection.jsx b/src/forge/Information/Pages/project/cateList/CategorySection.jsx
index aef937b47..9379d67ec 100644
--- a/src/forge/Information/Pages/project/cateList/CategorySection.jsx
+++ b/src/forge/Information/Pages/project/cateList/CategorySection.jsx
@@ -34,16 +34,16 @@ function CategorySection({ category, index, zoneId, nsccTitle }) {
return projects.map((item, pIndex)=>{
return(
(!range || (range && pIndex >= range[0] && pIndex < range[1])) ?
-
- {item.projectProperties && item.projectProperties.authorImageUrl &&

}
-
{item.projectProperties && item.projectProperties.fromOwner}/{item.projectProperties && item.projectProperties.name && item.projectProperties.name.split("/").pop()}
+
-
+
{item.projectProperties && item.projectProperties.description}
{item.projectProperties && item.projectProperties.topics && (
-
+
{item.projectProperties.topics.split(",").map((t, k) => (
- {t}
))}
diff --git a/src/forge/Information/Pages/project/cateList/index.jsx b/src/forge/Information/Pages/project/cateList/index.jsx
index d0be27746..32b6e769e 100644
--- a/src/forge/Information/Pages/project/cateList/index.jsx
+++ b/src/forge/Information/Pages/project/cateList/index.jsx
@@ -4,6 +4,7 @@ import { getProjectsTypeLists, getZoneStatistics, getProjectListByScore, getProj
import { projectCateConfig } from '../projectCateConfig';
import { getUniqueIdentifier, getUserName, getBrowserPlatform, getBrowserBrand } from '../../../utils';
import { setZoneVisits } from '../../../api';
+import CountUp from 'react-countup';
import '../index.scss';
import './index.scss';
import Nodata from '../../../../Nodata';
@@ -183,23 +184,31 @@ function ProjectCateList(props) {
))}
+ const countUpProps = {
+ redraw: false,
+ start: 0,
+ duration: 2,
+ // suffix: "+"
+ };
return (
setVisible(false)} role={role && role.role} onFresh={()=>{getTypeList();}}/>
{/* 数据统计部分 */}
{nsccTitle("数聚开源力量,实时见证开源生态的每一次进化", 0.1, "center pt80 fadeInChar")}
-
-
- {statsData.map((stat, index) => (
-
-
-
{stat.value}
- {stat.suffix}
+
+
+
+ {statsData.map((stat, index) => (
+
+
+
+ {stat.suffix}
+
+
{stat.label}
-
{stat.label}
-
- ))}
+ ))}
+
{role && role.role !== "None" &&
{role.role === "Member" ?
我的项目:""}
diff --git a/src/forge/Information/Pages/project/cateList/index.scss b/src/forge/Information/Pages/project/cateList/index.scss
index e607ce9bb..310995f32 100644
--- a/src/forge/Information/Pages/project/cateList/index.scss
+++ b/src/forge/Information/Pages/project/cateList/index.scss
@@ -23,6 +23,7 @@
padding: 25px;
background-image: url('../../../img/project/cate_page_img2.png');
background-size: 100% 100%;
+ border-radius:15px;
&:hover {
.placeholder-img>img {
@@ -152,7 +153,7 @@
flex: 0 0 calc(33.7% - 20px);
background-color: #ffffff;
border-radius:15px;
- padding:40px;
+ padding:35px 40px;
&:hover{
background-image: url('../../../img/project/cate_page_card.png');
background-size: 101% 100%;
@@ -176,8 +177,13 @@
background: url('../../../img/project/5_h_b.png') 98% 98% no-repeat;
color: #fff;
justify-content: flex-start;
- padding:50px 80px 50px 45px;
+ padding:35px;
background-size: 100% 100%;
+ .project-list-item-tag{
+ li{
+ background-color: rgba(255,255,255,0.15);
+ }
+ }
.project-list-item-title{
a{
color: #fff;
@@ -251,6 +257,7 @@
margin-bottom: 20px;
background-size: 100% 100%;
margin-right: 20px;
+ border-radius:15px;
.cateSixMainBox{
overflow: hidden;
}
@@ -274,6 +281,7 @@
}
&:nth-child(2),&:nth-child(3){
width: calc(27.5% - 20px);
+ padding-bottom:54px;
}
}
}
@@ -336,9 +344,15 @@
}
}
+ .statistics-cards-bc{
+ background-image: url(../../../img/vipTitleBc.png);
+ background-size: 100% 124%;
+ padding: 25px 0;
+ background-position-y: bottom;
+ }
.statistics-cards {
width: 80%;
- margin: 25px auto;
+ margin: 0px auto;
display: grid;
justify-items: center;
grid-template-columns: repeat(4, 1fr);
@@ -363,7 +377,7 @@
.cate_project_list_box .cate-project-card {
min-width: 0;
- padding: 30px;
+ padding:26px;
border-radius: 15px;
display: flex;
flex-direction: column;
@@ -377,7 +391,7 @@
}
.icon-jiantou21 {
color: inherit;
- top: 0px;
+ top: 4px;
left: 0px;
opacity: 1;
transition: top 0.5s ease, left 0.5s ease, opacity 0.3s ease 0.1s;
@@ -417,9 +431,9 @@
text-align: center;
height: 38px;
line-height: 38px;
- margin-top: 35px;
+ margin-top: 30px;
background:linear-gradient(272.02deg,rgba(10, 145, 255, 0.12) 0.05%,rgba(43, 103, 238, 0.12) 55.23%,rgba(133, 110, 250, 0.12) 99.86%);
-
+ display:block;
&:hover {
background-color: #091221;
color: #fff;
diff --git a/src/forge/Information/Pages/scoreDetail.jsx b/src/forge/Information/Pages/scoreDetail.jsx
new file mode 100644
index 000000000..9480291f9
--- /dev/null
+++ b/src/forge/Information/Pages/scoreDetail.jsx
@@ -0,0 +1,110 @@
+import React , { useState , useEffect } from 'react';
+import { Tag , Pagination } from 'antd';
+
+import { getMemberAccountDetail, getPointsTransaction } from '../api';
+
+import '../indexUser.scss';
+
+export const memberStatusEnum = {
+ applying: '0',
+ isMember: '1',
+ notMember: '2'
+}
+const transactionTypeMap = {
+ add: { className: 'green', prefix: '+', valueKey: 'points', status: '已到账', statusClass: 'green' },
+ deduct: { className: 'red', prefix: '-', valueKey: 'points', status: '已支付', statusClass: 'blue' },
+ freezed: { className: 'orange', prefix: '-', valueKey: 'points', status: '冻结中', statusClass: 'orange' },
+ unfreezed: { className: 'green', prefix: '+', valueKey: 'points', status: '已退回', statusClass: 'gray' },
+};
+
+function getPointsShow(item) {
+ const config = transactionTypeMap[item.transactionType];
+ if (!config) {
+ return { className: '', pointsTxt: item.score, statusClass: '', status: '' };
+ }
+ const value = item[config.valueKey] || 0;
+ return {
+ className: config.className,
+ pointsTxt: `${config.prefix}${value}`,
+ status: config.status,
+ statusClass: config.statusClass
+ };
+}
+
+function scoreDetail(props){
+ const { id } = props;
+ const [ list , setList] = useState([]);
+ const [ page , setPage ] = useState(1);
+ const [ total , setTotal ] = useState(0);
+ const limit = 10;
+
+ useEffect(()=>{
+ if(id){
+ getDetail();
+ }
+ },[id, page])
+
+ function getDetail() {
+ getPointsTransaction(id, { pageNum: page, pageSize: limit }).then(res => {
+ if (res && res.data && res.data.code === 200) {
+ const processedRows = (res.data.rows || []).map(item => ({
+ ...item,
+ pointsShow: getPointsShow(item)
+ }));
+ setList(processedRows)
+ setTotal(res.data.total || 0)
+ } else {
+ setList([])
+ setTotal(0)
+ }
+ }).catch(() => { setList([]); setTotal(0) })
+ }
+
+ return(
+
+
+
+
+
+
+ | 时间 |
+ 积分明细 |
+ 分值变动 |
+ 状态 |
+ 备注/回复 |
+
+
+
+ {list.map((item, index) => (
+
+ | {item.createTime} |
+ {item.subject}
{item.subjectDesc} |
+ {item.pointsShow?.pointsTxt} |
+
+ {item.pointsShow?.status}
+ |
+
+ {item.reason}
+ {
+ item.replyContent &&
+
+
+ 管理员:{item.replyContent}
+
+ }
+ |
+
+ ))}
+
+
+ { total > limit && (
+
+
{ setPage(p); window.scrollTo(0, 450) }} />
+
+ )}
+
+
+
+ )
+}
+export default scoreDetail;
\ No newline at end of file
diff --git a/src/forge/Information/Pages/scoreRule.jsx b/src/forge/Information/Pages/scoreRule.jsx
new file mode 100644
index 000000000..32a60b400
--- /dev/null
+++ b/src/forge/Information/Pages/scoreRule.jsx
@@ -0,0 +1,110 @@
+import React , { useState , useEffect } from 'react';
+import { Tag } from 'antd';
+
+import '../indexUser.scss';
+
+export const memberStatusEnum = {
+ applying: '0',
+ isMember: '1',
+ notMember: '2'
+}
+ function ScoreRlue(props){
+
+ return(
+
+ {/* className="font-bd font-30 mt70 mb40 align task-hide edu-txt-center" */}
+
超算专区 · 积分规则
+
+
+
+
积分获取规则
+
每日登录、浏览互动等均可获得对应积分。积分实时更新,可在积分中心查看明细,累计积分越多,可解锁的福利与兑换权益越丰富,轻松积累,随心使用。
+
+
+
+
+
+ | 类别 |
+ 行为项 |
+ 奖励 |
+ 限制说明 |
+
+
+
+
+ |
+ 准入
+ |
+ 入会审核通过 |
+ +5 |
+ 管理员审核通过后一次性发放 |
+
+
+ | 活跃 |
+ 每日登录 |
+ +1 |
+ 每天首次加载专区页面触发,上限1次/天 |
+
+
+ | 内容 |
+ 发布文章 |
+ +5 |
+ 资讯审核通过后发放 |
+
+
+ | 文章设为精选 |
+ +5 |
+ 管理员后台勾选“精选”标记时额外发放 |
+
+
+ | 发布资源 |
+ +5 |
+ 资源附件审核通过后发放 |
+
+
+ | 影响力 |
+ 文章阅读量 |
+ +2 |
+ 每满 100 次阅读触发,上限 50分/每篇 |
+
+
+ | 资源下载量 |
+ +1 |
+ 每下载 1 次触发,上限 100分/每个资源 |
+
+
+ | 生态 |
+ 关联项目 |
+ +10 |
+ 个人项目成功关联至专区后发放 |
+
+ {/*
+ | 项目 Star |
+ +3 |
+ 累计获得,上限 60分/每个项目 |
+
+
+ | 项目 Fork |
+ +2 |
+ 累计获得,上限 40分/每个项目 |
+
+
+ | 互动 |
+ 提交 Issue |
+ +5 |
+ 提交有效 Issue 后发放,上限 20分/天 |
+
+
+ | 贡献 |
+ 提交 PR |
+ +10 |
+ 提交 PR 获 1 分,PR 被 Merged 后奖 20 分 |
+
*/}
+
+
+
+
+
+ )
+}
+export default ScoreRlue;
\ No newline at end of file
diff --git a/src/forge/Information/Pages/selfList.jsx b/src/forge/Information/Pages/selfList.jsx
index 3c983be81..680598527 100644
--- a/src/forge/Information/Pages/selfList.jsx
+++ b/src/forge/Information/Pages/selfList.jsx
@@ -173,7 +173,8 @@ function SelfList(props){
const auditTypeEnom = {
create: '发布',
update: '编辑',
- delete: '删除'
+ delete: '删除',
+ nonRepoUpdate: '编辑'
}
const statueName =(auditType)=>{
diff --git a/src/forge/Information/Pages/zoneScore.jsx b/src/forge/Information/Pages/zoneScore.jsx
new file mode 100644
index 000000000..e57ac78b9
--- /dev/null
+++ b/src/forge/Information/Pages/zoneScore.jsx
@@ -0,0 +1,119 @@
+import React , { useState , useEffect } from 'react';
+import { Spin } from 'antd';
+import { getImageUrl } from 'educoder'
+import { getVIPLists, getAuditStatus, applyJoin, getMemberStatus, getMemberInfo, getMemberPointsAccount, getMemberAccountDetail } from '../api';
+import {getUniqueIdentifier,getBrowserPlatform,getBrowserBrand} from '../utils';
+
+import { Link } from 'react-router-dom';
+
+import FrozenImg from '../img/user/frozenScore.png';
+import GainImg from '../img/user/gainScore.png';
+import CostImg from '../img/user/costScore.png';
+
+
+import ScoreDetail from './scoreDetail'
+
+import '../indexUser.scss';
+
+export const memberStatusEnum = {
+ applying: '0',
+ isMember: '1',
+ notMember: '2'
+}
+function ZoneScore(props){
+ const { deptId } = props.match.params;
+ const [ visible , setVisible ] = useState(false);
+ const [ awardVisible , setAwardVisible ] = useState(false);
+ const { id, showNotification, checkIfLogin, showLoginDialog, temp, sectionMemberTitle } = props;
+ const [ memberStatus , setMemberStatus] = useState(memberStatusEnum.notMember);
+ const [ accountInfo , setAccountInfo] = useState(null);
+ const [ loading , setLoading ] = useState(false);
+
+ useEffect(()=>{
+ let uuid = getUniqueIdentifier()
+ let url = props.location.pathname
+ let platform = getBrowserPlatform()
+ let browser = getBrowserBrand()
+ let remark = ` 操作系统:${platform};浏览器:${browser};`
+ },[])
+
+ useEffect(()=>{
+ if(id){
+ getMemberStatus();
+ }
+ },[id])
+
+ const infoItemsData = [{
+ img: FrozenImg,
+ title: '当前冻结积分',
+ scoreKey: 'frozenPoints'
+ }, {
+ img: GainImg,
+ title: '累计获取积分',
+ scoreKey: 'totalEarnedPoints'
+ }, {
+ img: CostImg,
+ title: '累计消费积分',
+ scoreKey: 'totalConsumedPoints'
+ }];
+
+ function getMemberStatus() {
+ setLoading(true);
+ getAuditStatus(id).then(res => {
+ if (res && res.data && res.data.code === 200) {
+ setMemberStatus(res.data.data)
+ } else {
+ setMemberStatus(memberStatusEnum.notMember)
+ }
+
+ if(res.data.data == memberStatusEnum.isMember) {
+ getInfo();
+ } else {
+ showNotification && showNotification('您当前不是专区会员,请先加入会员');
+ props.history && props.history.replace(`/zone/${deptId}/User`);
+ }
+ }).catch(() => { setMemberStatus(memberStatusEnum.notMember) })
+ .finally(() => {
+ setLoading(false)
+ });
+ }
+
+ function getInfo() {
+ getMemberPointsAccount(id).then(res => {
+ if (res && res.data && res.data.code === 200) {
+ setAccountInfo(res.data.data)
+ } else {
+ setAccountInfo(null)
+ }
+ }).catch(() => { setAccountInfo(null) })
+ }
+
+ return(
+
+
+
+
+
+
+ 积分流水明细
+
+
每一笔积分变动清晰可查,收支明细一目了然。
+
+
+ {infoItemsData.map((item, index) => (
+
+

+
+
{item.title}
+
{accountInfo ? accountInfo[item.scoreKey]?.toLocaleString() : '-'}
+
+
+ ))}
+
+
+
+
+
+ )
+}
+export default ZoneScore;
\ No newline at end of file
diff --git a/src/forge/Information/Pages/zoneUser.jsx b/src/forge/Information/Pages/zoneUser.jsx
new file mode 100644
index 000000000..7eba4e7ea
--- /dev/null
+++ b/src/forge/Information/Pages/zoneUser.jsx
@@ -0,0 +1,433 @@
+import React , { useState , useEffect } from 'react';
+import { Spin, Modal, Button } from 'antd';
+import { getMainInfos, getAuditStatus, getMemberInfo, applyJoin, updateSelfInfo, setZoneVisits, getCurrentRole } from '../api';
+import { Link } from 'react-router-dom';
+import {getUniqueIdentifier,getUserName,getBrowserPlatform,getBrowserBrand} from '../utils';
+
+import BannerSvg from '../img/user/banner.svg';
+import JszdImg from '../img/user/jszd.png';
+import HyslImg from '../img/user/hysl.png';
+import RyxzImg from '../img/user/ryxz.png';
+import ZdtgImg from '../img/user/zdtg.png';
+
+import RyzsImg from '../img/user/ryzs.png';
+import XwtjImg from '../img/user/xwtj.png';
+import ZdtjImg from '../img/user/zdtj.png';
+import XxcgImg from '../img/user/xxcg.png';
+import ZjdyImg from '../img/user/zjdy.png';
+
+import StarImg from '../img/user/star.png';
+
+
+import SuccessImg from '../img/user/success.png';
+
+import ScoreRlue from './scoreRule';
+import UserEdit from '../Component/UserEdit';
+import UserAward from '../Component/UserAward';
+import MemberApply from '../Component/memberApply';
+import PointsDoc from '../Component/pointsDoc';
+import PointsProject from '../Component/pointsProject';
+import ApplyAcitvity from '../Component/applyAcitvity';
+import ApplyQA from '../Component/applyQA';
+
+import '../indexUser.scss';
+
+export const memberStatusEnum = {
+ applying: '0',
+ isMember: '1',
+ notMember: '2',
+ isAdmin: '3'
+}
+function ZoneUser(props){
+ const [ memberStatus , setMemberStatus] = useState(memberStatusEnum.notMember);
+ const [ memberInfo , setMemberInfo] = useState(null);
+ const [ zoneInfo , setZoneInfo] = useState(null);
+ const [ loading , setLoading ] = useState(false);
+ const { deptId } = props.match.params;
+ const [ visible , setVisible ] = useState(false);
+ const [ applyVisible , setApplyVisible ] = useState(false);
+ const [ awardVisible , setAwardVisible ] = useState(false);
+ const [ docVisible , setDocVisible ] = useState(false);
+ const [ projectVisible , setProjectVisible ] = useState(false);
+ const [ acitvityVisible , setAcitvityVisible ] = useState(false);
+ const [ qaVisible , setQaVisible ] = useState(false);
+ const [ successVisible , setSuccessVisible ] = useState(false);
+ const [ timeNum, setTimeNum] = useState(3);
+ const [ memberAccountInfo, setMemberAccountInfo ] = useState([]);
+ const [msg, setMsg] = useState('');
+
+ const { id, showNotification, checkIfLogin, showLoginDialog, temp, sectionMemberTitle } = props;
+
+ useEffect(()=>{
+ let uuid = getUniqueIdentifier()
+ let url = props.location.pathname
+ let platform = getBrowserPlatform()
+ let browser = getBrowserBrand()
+ let username = getUserName(props.current_user)
+ // if(!username) uuid = getUniqueIdentifier()
+ let remark = ` 操作系统:${platform};浏览器:${browser};`
+ setZoneVisits({url,username,uuid,remark})
+ },[])
+
+ useEffect(()=>{
+ if(id){
+ getMemberStatus();
+ getZoneInfo();
+ }
+ },[id])
+
+ useEffect(() => {
+ let temp = awardsInfoData.map(item => {
+ let tempData = Object.assign({}, item);
+ if(!memberInfo) return tempData;
+
+ if(item.key === 'certificate' && memberInfo.pointsEvent?.id) {
+ tempData.exist = true;
+ tempData.txt = '下载证书';
+ }
+ if(item.key === 'acitvity' && Array.isArray(memberInfo.applyList)) {
+ let index = memberInfo.applyList.findIndex(item => item.applyType === 'offlineActivityFreeze');
+ if(index !== -1) {
+ tempData.disabled = true;
+ tempData.txt = '待跟进';
+ }
+ }
+ if(item.key === 'qa' && Array.isArray(memberInfo.applyList)) {
+ let index = memberInfo.applyList.findIndex(item => item.applyType === 'expertQaFreeze');
+ if(index !== -1) {
+ tempData.disabled = true;
+ tempData.txt = '待跟进';
+ }
+ }
+
+ return tempData;
+ })
+
+ setMemberAccountInfo(temp);
+ }, [memberInfo])
+
+ useEffect(() => {
+ if (successVisible) {
+ const pid = setInterval(() => {
+ setTimeNum(prev => {
+ const newVal = prev - 1;
+ if (newVal <= 0) {
+ clearInterval(pid);
+ setSuccessVisible(false);
+ }
+ return newVal;
+ });
+ }, 1000);
+ return () => clearInterval(pid);
+ }
+ }, [successVisible]);
+
+ const infoItemsData = [{
+ img: JszdImg,
+ title: '专家技术指导',
+ desc: '超算顶尖专家一对一在线答疑及科研课题指导资格。'
+ }, {
+ img: HyslImg,
+ title: '行业沙龙优先权',
+ desc: '超算中心线下参观、沙龙及技术峰会名额优先预约。'
+ }, {
+ img: RyxzImg,
+ title: '贡献荣誉勋章',
+ desc: '社区电子荣誉证书,个人开源项目社区首页置顶推荐。'
+ }, {
+ img: ZdtgImg,
+ title: '内容与项目置顶推广',
+ desc: '文章、项目首页 7 天置顶推荐,提升曝光影响力。'
+ }];
+
+ const awardsInfoData= [{
+ key: 'certificate',
+ img: RyzsImg,
+ title: '专属电子荣誉证书',
+ desc: '贡献类证书,积分扣除自动生成',
+ score: 200,
+ unit: '张',
+ txt: '立即兑换'
+ },{
+ key: 'doc',
+ img: XwtjImg,
+ title: '专区首页新闻推荐',
+ desc: '将您的技术文章置顶至专区首页(7天)',
+ score: 500,
+ unit: '7天',
+ txt: '立即兑换'
+ },{
+ key: 'repo',
+ img: ZdtjImg,
+ title: '项目首页置顶推荐',
+ desc: '个人开源项目社区首页置顶推荐(7天)',
+ score: 800,
+ unit: '7天',
+ txt: '立即兑换'
+ },{
+ key: 'acitvity',
+ img: XxcgImg,
+ title: '线下参观/沙龙报名',
+ desc: '超算中心线下参观,沙龙优先报名权',
+ score: 1500,
+ unit: '次',
+ txt: '锁定资格'
+ },{
+ key: 'qa',
+ img: ZdtjImg,
+ title: '专家一对一答疑',
+ desc: '对接顶尖专家,解决核心技术难题',
+ score: 4000,
+ unit: '次',
+ txt: '立即预约'
+ }
+ ];
+
+ function getMemberStatus() {
+ setLoading(true);
+ getCurrentRole(id).then(res => {
+ if (res && res.data && res.data.code === 200) {
+ if(res.data.data?.role === 'Member') {
+ setMemberStatus(memberStatusEnum.isMember)
+ getInfo();
+ } else if(res.data.data?.role === 'Manager') {
+ setMemberStatus(memberStatusEnum.isAdmin)
+ }
+ } else {
+ setMemberStatus(memberStatusEnum.notMember)
+ }
+
+ }).catch(() => { setMemberStatus(memberStatusEnum.notMember) })
+ .finally(() => {
+ setLoading(false)
+ });
+ // getAuditStatus(id).then(res => {
+ // if (res && res.data && res.data.code === 200) {
+ // setMemberStatus(res.data.data)
+ // } else {
+ // setMemberStatus(memberStatusEnum.notMember)
+ // }
+
+ // if(res.data.data == memberStatusEnum.isMember) {
+ // getInfo();
+ // }
+ // }).catch(() => { setMemberStatus(memberStatusEnum.notMember) })
+ // .finally(() => {
+ // console.log('api-over', memberStatus);
+ // setLoading(false)
+ // });
+ }
+
+ function getZoneInfo() {
+ getMainInfos(deptId).then(result=>{
+ if(result){
+ let data = result.data.data || {};
+ setZoneInfo(data);
+ }
+ })
+ }
+
+ function getInfo() {
+ getMemberInfo(id).then(res => {
+ if (res && res.data && res.data.code === 200) {
+ setMemberInfo(res.data.data)
+ } else {
+ setMemberInfo(null)
+ }
+ }).catch(() => { setMemberInfo(null) })
+ }
+
+ function onOk(e) {
+ applyJoin(id, e).then(res => {
+ if (res && res.data) {
+ showNotification(res.data.msg)
+ setApplyVisible(!applyVisible)
+ if (res.data.code === 200) {
+ setMemberStatus(memberStatusEnum.applying)
+ }
+ }
+ })
+ }
+
+ function onSure(e) {
+ updateSelfInfo(id, e).then(res => {
+ if (res && res.data) {
+ showNotification(res.data.msg)
+ setVisible(!visible)
+ if (res.data.code === 200) {
+ getInfo()
+ }
+ }
+ })
+ }
+
+ function apply() {
+ if(checkIfLogin()===false){
+ // showLoginDialog()
+ showLoginDialog(`/zone/${deptId}/user`)
+ return false;
+ }
+ setApplyVisible(!applyVisible)
+ }
+
+ function handleAwardSure(msg) {
+ showNotification(msg);
+ setAwardVisible(false);
+ getInfo();
+ }
+
+ function pointsCustom(item) {
+ if(item.disabled) return;
+ if(item.key == 'certificate') {
+ if(!item.exist) {
+ setAwardVisible(true);
+ } else {
+ let url = memberInfo.pointsEvent?.sourceData;
+ const link = document.createElement('a');
+ link.href = url;
+ link.click();
+ }
+ } else if(item.key == 'doc') {
+ setDocVisible(true);
+ } else if(item.key == 'repo') {
+ setProjectVisible(true);
+ } else if(item.key == 'acitvity') {
+ setAcitvityVisible(true);
+ } else if(item.key == 'qa') {
+ setQaVisible(true);
+ }
+ }
+
+ return(
+
+
+ {memberStatus !== memberStatusEnum.isMember &&
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+ {infoItemsData.map((item, index) => (
+
+

+
{item.title}
+
{item.desc}
+
+ ))}
+
+
+ }
+
+ {memberStatus === memberStatusEnum.isMember && memberInfo != null &&
+
+
+

+
+
+ {setVisible(true)}}>
+ {memberInfo.name}
+
+
+
+
+
+

+ {memberInfo.zoneMemberLevel?.name}
+
+
{memberInfo.introduction}
+
+
+
+
{memberInfo.zonePointsAccount?.availablePoints?.toLocaleString() || '0'}
+
+ 积分明细
+
+
+
+
+
+ {
+ memberAccountInfo.map((item, index) => (
+
+
{item.title}
+
{item.desc}
+
+
/{item.unit}
+ {memberInfo?.zonePointsAccount?.availablePoints >= item.score ? (
+
pointsCustom(item)}>
+ {item.txt}
+
+ ) : (
+
+ 积分不足
+
+ )}
+
+
+ ))
+ }
+
+
+ }
+
+
+
+
setApplyVisible(!applyVisible)} current_user={props.current_user}/>
+ setVisible(false)}
+ />
+ handleAwardSure(msg)}
+ onCancel={()=>setAwardVisible(false)}
+ />
+ setDocVisible(false)} onSure={() => { setDocVisible(false); setMsg('首页新闻推荐'); setSuccessVisible(true);getInfo();}}
+ />
+ setProjectVisible(false)} onSure={() => { setProjectVisible(false); setMsg('首页项目推荐'); setSuccessVisible(true);getInfo();}}
+ />
+ setAcitvityVisible(false)} onSure={(msg) => { showNotification(msg); setAcitvityVisible(false); getInfo();}}
+ />
+ setQaVisible(false)} onSure={(msg) => { showNotification(msg); setQaVisible(false); getInfo();}}
+ />
+
+ {setSuccessVisible(false)}}>}
+ visible={successVisible}
+ closable={true}
+ footer={null}
+ width={466}
+ >
+
+

+
恭喜获得专区
+
+
+
+
+ )
+}
+export default ZoneUser;
\ No newline at end of file
diff --git a/src/forge/Information/api.js b/src/forge/Information/api.js
index 9221f8479..89ddf1b57 100644
--- a/src/forge/Information/api.js
+++ b/src/forge/Information/api.js
@@ -218,6 +218,43 @@ export function getAuditStatus(id){
})
}
+export function getMemberInfo(id){
+ return fetch({
+ url:`/zone/member/zone/${id}/memberInfo`,
+ method: 'get',
+ })
+}
+
+export function getMemberPointsAccount(id){
+ return fetch({
+ url:`/zone/points/account/overview/${id}`,
+ method: 'get',
+ })
+}
+
+export function getPointsAccountEvent(id){
+ return fetch({
+ url:`/zone/points/event/currentUser/${id}`,
+ method: 'get',
+ })
+}
+
+export function getPointsTransaction(id, params){
+ return fetch({
+ url:`/zone/points/transaction/currentUser/${id}`,
+ method: 'get',
+ params
+ })
+}
+
+export function getMemberAccountDetail(id, params){
+ return fetch({
+ url:`/zone/points/transaction/my/${id}`,
+ method: 'get',
+ params
+ })
+}
+
/**会员申请状态 */
export function applyJoin(id,data) {
return fetch({
@@ -227,6 +264,24 @@ export function applyJoin(id,data) {
});
}
+// 更新会员信息
+export function updateMemberInfo(id, data) {
+ return fetch({
+ url: `/zone/member/${ id }`,
+ method: 'PUT',
+ data: data
+ })
+}
+
+// 用户更新会员信息
+export function updateSelfInfo(id, data) {
+ return fetch({
+ url: `/zone/member/customEdit/zone/${ id }`,
+ method: 'PUT',
+ data: data
+ })
+}
+
// 资源模块
export function addResource(data) {
return fetch({
@@ -498,6 +553,22 @@ export function getProjectListByScore(id,params) {
})
}
+// 专区获取我的置顶文章
+export function getMyTopArticle(id){
+ return fetch({
+ url:`/zone/points/account/article/top/${id}`,
+ method:"get",
+ })
+}
+
+// 专区获取我的置顶项目
+export function getMyTopProject(id){
+ return fetch({
+ url:`/zone/points/account/project/top/${id}`,
+ method:"get",
+ })
+}
+
// 获取已开通企业的组织列表
export function getOrzCompanyList(){
return fetch({
@@ -584,4 +655,60 @@ export function deleteMemberProject(ids){
url: `/zone/zoneFront/removeProject/${ids}`,
method: 'delete',
})
-}
\ No newline at end of file
+}
+
+export function applyAward(data) {
+ return fetch({
+ url: `/zone/points/account/certificate/redeem`,
+ method: 'post',
+ data
+ });
+}
+export function doApplyQA(data) {
+ return fetch({
+ url: `/zone/points/account/expert/qa/freeze`,
+ method: 'post',
+ data
+ });
+}
+
+export function doApplyActivity(data) {
+ return fetch({
+ url: `/zone/points/account/offlineActivity/freeze`,
+ method: 'post',
+ data
+ });
+}
+
+export function doDocTop(data) {
+ return fetch({
+ url: `/zone/points/account/article/top`,
+ method: 'post',
+ data
+ });
+}
+
+export function doProjectTop(data) {
+ return fetch({
+ url: `/zone/points/account/project/top`,
+ method: 'post',
+ data
+ });
+}
+
+
+// 获取文章列表
+export function getPointsDocList(id){
+ return fetch({
+ url:`/zone/open/getTopDoc/${id}`,
+ method: 'get',
+ })
+}
+
+// 获取文章列表
+export function getPointsProjectList(id){
+ return fetch({
+ url:`/zone/open/getTopProject/${id}`,
+ method: 'get',
+ })
+}
diff --git a/src/forge/Information/img/right.png b/src/forge/Information/img/right.png
new file mode 100644
index 000000000..f5a134bd9
Binary files /dev/null and b/src/forge/Information/img/right.png differ
diff --git a/src/forge/Information/img/ringleft.png b/src/forge/Information/img/ringleft.png
new file mode 100644
index 000000000..e51738608
Binary files /dev/null and b/src/forge/Information/img/ringleft.png differ
diff --git a/src/forge/Information/img/ringright.png b/src/forge/Information/img/ringright.png
new file mode 100644
index 000000000..f5a134bd9
Binary files /dev/null and b/src/forge/Information/img/ringright.png differ
diff --git a/src/forge/Information/img/user/awardBg.png b/src/forge/Information/img/user/awardBg.png
new file mode 100644
index 000000000..90fbe5cbb
Binary files /dev/null and b/src/forge/Information/img/user/awardBg.png differ
diff --git a/src/forge/Information/img/user/banner.svg b/src/forge/Information/img/user/banner.svg
new file mode 100644
index 000000000..e2a355a8a
--- /dev/null
+++ b/src/forge/Information/img/user/banner.svg
@@ -0,0 +1,262 @@
+
\ No newline at end of file
diff --git a/src/forge/Information/img/user/bg.png b/src/forge/Information/img/user/bg.png
new file mode 100644
index 000000000..19745da44
Binary files /dev/null and b/src/forge/Information/img/user/bg.png differ
diff --git a/src/forge/Information/img/user/costScore.png b/src/forge/Information/img/user/costScore.png
new file mode 100644
index 000000000..2971d7f99
Binary files /dev/null and b/src/forge/Information/img/user/costScore.png differ
diff --git a/src/forge/Information/img/user/docMBg.png b/src/forge/Information/img/user/docMBg.png
new file mode 100644
index 000000000..8b4699b4b
Binary files /dev/null and b/src/forge/Information/img/user/docMBg.png differ
diff --git a/src/forge/Information/img/user/docMBg2.png b/src/forge/Information/img/user/docMBg2.png
new file mode 100644
index 000000000..858f7e9b8
Binary files /dev/null and b/src/forge/Information/img/user/docMBg2.png differ
diff --git a/src/forge/Information/img/user/edit.png b/src/forge/Information/img/user/edit.png
new file mode 100644
index 000000000..4db23155e
Binary files /dev/null and b/src/forge/Information/img/user/edit.png differ
diff --git a/src/forge/Information/img/user/extensions.json b/src/forge/Information/img/user/extensions.json
new file mode 100644
index 000000000..96995a52e
--- /dev/null
+++ b/src/forge/Information/img/user/extensions.json
@@ -0,0 +1 @@
+[{"identifier":{"id":"alphabotsec.vscode-eclipse-keybindings","uuid":"0c9d43ad-d1d0-4e2a-8246-fe7b296162a8"},"version":"0.16.1","location":{"$mid":1,"path":"/c:/Users/AmyPeng/.vscode/extensions/alphabotsec.vscode-eclipse-keybindings-0.16.1","scheme":"file"},"relativeLocation":"alphabotsec.vscode-eclipse-keybindings-0.16.1","metadata":{"installedTimestamp":1752647006530,"pinned":false,"source":"gallery","id":"0c9d43ad-d1d0-4e2a-8246-fe7b296162a8","publisherId":"a9e49c66-52a1-4cb2-a5e7-7b109ab15be6","publisherDisplayName":"Alphabot Security","targetPlatform":"undefined","updated":false,"private":false,"isPreReleaseVersion":false,"hasPreReleaseVersion":false}},{"identifier":{"id":"formulahendry.auto-rename-tag","uuid":"6e440e71-8ed9-4f25-bb78-4b13096b8a03"},"version":"0.1.10","location":{"$mid":1,"path":"/c:/Users/AmyPeng/.vscode/extensions/formulahendry.auto-rename-tag-0.1.10","scheme":"file"},"relativeLocation":"formulahendry.auto-rename-tag-0.1.10","metadata":{"installedTimestamp":1752647066800,"pinned":false,"source":"gallery","id":"6e440e71-8ed9-4f25-bb78-4b13096b8a03","publisherId":"38bbe3f0-5204-4170-845e-c2f966d979b8","publisherDisplayName":"Jun Han","targetPlatform":"undefined","updated":false,"private":false,"isPreReleaseVersion":false,"hasPreReleaseVersion":false}},{"identifier":{"id":"formulahendry.auto-close-tag","uuid":"d3836729-9cc1-42c1-b2af-d50071f57d29"},"version":"0.5.15","location":{"$mid":1,"path":"/c:/Users/AmyPeng/.vscode/extensions/formulahendry.auto-close-tag-0.5.15","scheme":"file"},"relativeLocation":"formulahendry.auto-close-tag-0.5.15","metadata":{"installedTimestamp":1752647068019,"pinned":false,"source":"gallery","id":"d3836729-9cc1-42c1-b2af-d50071f57d29","publisherId":"38bbe3f0-5204-4170-845e-c2f966d979b8","publisherDisplayName":"Jun Han","targetPlatform":"undefined","updated":false,"private":false,"isPreReleaseVersion":false,"hasPreReleaseVersion":false}},{"identifier":{"id":"alibaba-cloud.tongyi-lingma","uuid":"b90347d7-e182-4b37-8314-4cde59e48d27"},"version":"2.5.20","location":{"$mid":1,"path":"/c:/Users/AmyPeng/.vscode/extensions/alibaba-cloud.tongyi-lingma-2.5.20","scheme":"file"},"relativeLocation":"alibaba-cloud.tongyi-lingma-2.5.20","metadata":{"isApplicationScoped":false,"isMachineScoped":false,"isBuiltin":false,"installedTimestamp":1772607098995,"pinned":false,"source":"gallery","id":"b90347d7-e182-4b37-8314-4cde59e48d27","publisherId":"556a8c2e-6e5a-478d-8744-32f8e634339c","publisherDisplayName":"Alibaba-Cloud","targetPlatform":"undefined","updated":true,"private":false,"isPreReleaseVersion":false,"hasPreReleaseVersion":false,"preRelease":false}},{"identifier":{"id":"esbenp.prettier-vscode","uuid":"96fa4707-6983-4489-b7c5-d5ffdfdcce90"},"version":"12.4.0","location":{"$mid":1,"path":"/c:/Users/AmyPeng/.vscode/extensions/esbenp.prettier-vscode-12.4.0","scheme":"file"},"relativeLocation":"esbenp.prettier-vscode-12.4.0","metadata":{"isApplicationScoped":false,"isMachineScoped":false,"isBuiltin":false,"installedTimestamp":1773899651707,"pinned":false,"source":"gallery","id":"96fa4707-6983-4489-b7c5-d5ffdfdcce90","publisherId":"d16f4e39-2ffb-44e3-9c0d-79d873570e3a","publisherDisplayName":"Prettier","targetPlatform":"undefined","updated":true,"private":false,"isPreReleaseVersion":false,"hasPreReleaseVersion":false,"preRelease":false}},{"identifier":{"id":"wenxin.nvm-auto-switcher","uuid":"97384fc0-606f-4d9b-94d8-499aa5a8bd43"},"version":"0.0.1","location":{"$mid":1,"path":"/c:/Users/AmyPeng/.vscode/extensions/wenxin.nvm-auto-switcher-0.0.1","scheme":"file"},"relativeLocation":"wenxin.nvm-auto-switcher-0.0.1","metadata":{"installedTimestamp":1775801813275,"pinned":false,"source":"gallery","id":"97384fc0-606f-4d9b-94d8-499aa5a8bd43","publisherId":"6407d79b-0c27-45a4-9a17-394f7abfa13a","publisherDisplayName":"wenxin","targetPlatform":"undefined","updated":false,"private":false,"isPreReleaseVersion":false,"hasPreReleaseVersion":false}},{"identifier":{"id":"vue.volar","uuid":"a95ee795-1576-4ffa-acda-8d6e6a95c584"},"version":"3.2.8","location":{"$mid":1,"path":"/c:/Users/AmyPeng/.vscode/extensions/vue.volar-3.2.8","scheme":"file"},"relativeLocation":"vue.volar-3.2.8","metadata":{"isApplicationScoped":false,"isMachineScoped":false,"isBuiltin":false,"installedTimestamp":1778031471450,"pinned":false,"source":"gallery","id":"a95ee795-1576-4ffa-acda-8d6e6a95c584","publisherId":"49983e2f-38ad-4441-beea-d678b53d0549","publisherDisplayName":"Vue","targetPlatform":"undefined","updated":true,"private":false,"isPreReleaseVersion":false,"hasPreReleaseVersion":false,"preRelease":false}},{"identifier":{"id":"ms-ceintl.vscode-language-pack-zh-hans","uuid":"e4ee7751-6514-4731-9cdb-7580ffa9e70b"},"version":"1.118.2026050120","location":{"$mid":1,"path":"/c:/Users/AmyPeng/.vscode/extensions/ms-ceintl.vscode-language-pack-zh-hans-1.118.2026050120","scheme":"file"},"relativeLocation":"ms-ceintl.vscode-language-pack-zh-hans-1.118.2026050120","metadata":{"isApplicationScoped":true,"isMachineScoped":false,"isBuiltin":false,"installedTimestamp":1778031471449,"pinned":false,"source":"gallery","id":"e4ee7751-6514-4731-9cdb-7580ffa9e70b","publisherId":"0b0882c3-aee3-4d7c-b5f9-872f9be0a115","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":true,"private":false,"isPreReleaseVersion":false,"hasPreReleaseVersion":false,"preRelease":false}},{"identifier":{"id":"qwenlm.qwen-code-vscode-ide-companion","uuid":"d630298e-483f-4683-b95b-cf8f4fb2de29"},"version":"0.15.6","location":{"$mid":1,"path":"/c:/Users/AmyPeng/.vscode/extensions/qwenlm.qwen-code-vscode-ide-companion-0.15.6-win32-x64","scheme":"file"},"relativeLocation":"qwenlm.qwen-code-vscode-ide-companion-0.15.6-win32-x64","metadata":{"isApplicationScoped":false,"isMachineScoped":false,"isBuiltin":false,"installedTimestamp":1778031471452,"pinned":false,"source":"gallery","id":"d630298e-483f-4683-b95b-cf8f4fb2de29","publisherId":"98477230-9c82-488f-ba6c-852cfaacfc83","publisherDisplayName":"qwenlm","targetPlatform":"win32-x64","updated":true,"private":false,"isPreReleaseVersion":false,"hasPreReleaseVersion":false,"preRelease":false}},{"identifier":{"id":"vscjava.vscode-java-dependency","uuid":"7865e561-1c83-410e-9b99-aabada597a7e"},"version":"0.27.2","location":{"$mid":1,"path":"/c:/Users/AmyPeng/.vscode/extensions/vscjava.vscode-java-dependency-0.27.2","scheme":"file"},"relativeLocation":"vscjava.vscode-java-dependency-0.27.2","metadata":{"installedTimestamp":1778052405086,"pinned":false,"source":"gallery","id":"7865e561-1c83-410e-9b99-aabada597a7e","publisherId":"bae08b87-578e-41ec-ab1c-0b036e7add88","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"private":false,"isPreReleaseVersion":false,"hasPreReleaseVersion":false}},{"identifier":{"id":"vscjava.vscode-java-pack","uuid":"96f11e1f-1a46-4592-b084-f025b2c2a81f"},"version":"0.30.5","location":{"$mid":1,"path":"/c:/Users/AmyPeng/.vscode/extensions/vscjava.vscode-java-pack-0.30.5","scheme":"file"},"relativeLocation":"vscjava.vscode-java-pack-0.30.5","metadata":{"installedTimestamp":1778052405072,"source":"gallery","id":"96f11e1f-1a46-4592-b084-f025b2c2a81f","publisherId":"bae08b87-578e-41ec-ab1c-0b036e7add88","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"private":false,"isPreReleaseVersion":false,"hasPreReleaseVersion":false}},{"identifier":{"id":"vscjava.vscode-java-test","uuid":"67c06b0d-1891-42ca-b2a8-113e79bff069"},"version":"0.45.0","location":{"$mid":1,"path":"/c:/Users/AmyPeng/.vscode/extensions/vscjava.vscode-java-test-0.45.0","scheme":"file"},"relativeLocation":"vscjava.vscode-java-test-0.45.0","metadata":{"installedTimestamp":1778052405075,"pinned":false,"source":"gallery","id":"67c06b0d-1891-42ca-b2a8-113e79bff069","publisherId":"bae08b87-578e-41ec-ab1c-0b036e7add88","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"private":false,"isPreReleaseVersion":false,"hasPreReleaseVersion":false}},{"identifier":{"id":"vscjava.vscode-java-debug","uuid":"61fcd0cf-64d7-4836-8d6b-d55f4fb83281"},"version":"0.59.0","location":{"$mid":1,"path":"/c:/Users/AmyPeng/.vscode/extensions/vscjava.vscode-java-debug-0.59.0","scheme":"file"},"relativeLocation":"vscjava.vscode-java-debug-0.59.0","metadata":{"installedTimestamp":1778052405079,"pinned":false,"source":"gallery","id":"61fcd0cf-64d7-4836-8d6b-d55f4fb83281","publisherId":"bae08b87-578e-41ec-ab1c-0b036e7add88","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"private":false,"isPreReleaseVersion":false,"hasPreReleaseVersion":false}},{"identifier":{"id":"vscjava.vscode-maven","uuid":"b0f06c6b-24fb-4d7b-bd79-bc5e2fa17312"},"version":"0.45.3","location":{"$mid":1,"path":"/c:/Users/AmyPeng/.vscode/extensions/vscjava.vscode-maven-0.45.3","scheme":"file"},"relativeLocation":"vscjava.vscode-maven-0.45.3","metadata":{"installedTimestamp":1778052405089,"pinned":false,"source":"gallery","id":"b0f06c6b-24fb-4d7b-bd79-bc5e2fa17312","publisherId":"bae08b87-578e-41ec-ab1c-0b036e7add88","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"private":false,"isPreReleaseVersion":false,"hasPreReleaseVersion":false}},{"identifier":{"id":"vscjava.vscode-gradle","uuid":"a226f06e-9b5e-493b-b92a-553d3572f969"},"version":"3.17.3","location":{"$mid":1,"path":"/c:/Users/AmyPeng/.vscode/extensions/vscjava.vscode-gradle-3.17.3","scheme":"file"},"relativeLocation":"vscjava.vscode-gradle-3.17.3","metadata":{"installedTimestamp":1778052405092,"pinned":false,"source":"gallery","id":"a226f06e-9b5e-493b-b92a-553d3572f969","publisherId":"bae08b87-578e-41ec-ab1c-0b036e7add88","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"private":false,"isPreReleaseVersion":false,"hasPreReleaseVersion":false}},{"identifier":{"id":"redhat.java","uuid":"198a707e-28af-4e84-8610-6e2f628dd12d"},"version":"1.54.0","location":{"$mid":1,"path":"/c:/Users/AmyPeng/.vscode/extensions/redhat.java-1.54.0-win32-x64","scheme":"file"},"relativeLocation":"redhat.java-1.54.0-win32-x64","metadata":{"installedTimestamp":1778052405083,"pinned":false,"source":"gallery","id":"198a707e-28af-4e84-8610-6e2f628dd12d","publisherId":"eed56242-9699-4317-8bc7-e9f4b9bdd3ff","publisherDisplayName":"Red Hat","targetPlatform":"win32-x64","updated":false,"private":false,"isPreReleaseVersion":false,"hasPreReleaseVersion":false}},{"identifier":{"id":"dotjoshjohnson.xml","uuid":"0cb81da2-1880-4755-9995-0ae9cc728e20"},"version":"2.5.1","location":{"$mid":1,"path":"/c:/Users/AmyPeng/.vscode/extensions/dotjoshjohnson.xml-2.5.1","scheme":"file"},"relativeLocation":"dotjoshjohnson.xml-2.5.1","metadata":{"installedTimestamp":1778053148854,"pinned":false,"source":"gallery","id":"0cb81da2-1880-4755-9995-0ae9cc728e20","publisherId":"0a72d6f9-f644-4e7d-93fe-34389b97e913","publisherDisplayName":"Josh Johnson","targetPlatform":"undefined","updated":false,"private":false,"isPreReleaseVersion":false,"hasPreReleaseVersion":false}},{"identifier":{"id":"anthropic.claude-code"},"version":"2.1.129","location":{"$mid":1,"fsPath":"c:\\Users\\AmyPeng\\.vscode\\extensions\\anthropic.claude-code-2.1.129-win32-x64","_sep":1,"external":"file:///c%3A/Users/AmyPeng/.vscode/extensions/anthropic.claude-code-2.1.129-win32-x64","path":"/c:/Users/AmyPeng/.vscode/extensions/anthropic.claude-code-2.1.129-win32-x64","scheme":"file"},"relativeLocation":"anthropic.claude-code-2.1.129-win32-x64","metadata":{"installedTimestamp":1778053929784,"pinned":false,"source":"gallery","id":"3c13ae49-babe-45fe-8c48-5e45077a62bf","publisherId":"89769da0-cc4b-40b0-8216-93ffb5a96b56","publisherDisplayName":"Anthropic","targetPlatform":"win32-x64","updated":false,"private":false,"isPreReleaseVersion":false,"hasPreReleaseVersion":false}}]
\ No newline at end of file
diff --git a/src/forge/Information/img/user/frozenScore.png b/src/forge/Information/img/user/frozenScore.png
new file mode 100644
index 000000000..f78510418
Binary files /dev/null and b/src/forge/Information/img/user/frozenScore.png differ
diff --git a/src/forge/Information/img/user/gainScore.png b/src/forge/Information/img/user/gainScore.png
new file mode 100644
index 000000000..ef6321d39
Binary files /dev/null and b/src/forge/Information/img/user/gainScore.png differ
diff --git a/src/forge/Information/img/user/hysl.png b/src/forge/Information/img/user/hysl.png
new file mode 100644
index 000000000..aeb649516
Binary files /dev/null and b/src/forge/Information/img/user/hysl.png differ
diff --git a/src/forge/Information/img/user/icon.png b/src/forge/Information/img/user/icon.png
new file mode 100644
index 000000000..f18b22ad3
Binary files /dev/null and b/src/forge/Information/img/user/icon.png differ
diff --git a/src/forge/Information/img/user/icon1.png b/src/forge/Information/img/user/icon1.png
new file mode 100644
index 000000000..e1001d7dc
Binary files /dev/null and b/src/forge/Information/img/user/icon1.png differ
diff --git a/src/forge/Information/img/user/jszd.png b/src/forge/Information/img/user/jszd.png
new file mode 100644
index 000000000..90652ac40
Binary files /dev/null and b/src/forge/Information/img/user/jszd.png differ
diff --git a/src/forge/Information/img/user/more.png b/src/forge/Information/img/user/more.png
new file mode 100644
index 000000000..289f2a53e
Binary files /dev/null and b/src/forge/Information/img/user/more.png differ
diff --git a/src/forge/Information/img/user/ruleBg.png b/src/forge/Information/img/user/ruleBg.png
new file mode 100644
index 000000000..76a29cc80
Binary files /dev/null and b/src/forge/Information/img/user/ruleBg.png differ
diff --git a/src/forge/Information/img/user/ryxz.png b/src/forge/Information/img/user/ryxz.png
new file mode 100644
index 000000000..efea5e086
Binary files /dev/null and b/src/forge/Information/img/user/ryxz.png differ
diff --git a/src/forge/Information/img/user/ryzs.png b/src/forge/Information/img/user/ryzs.png
new file mode 100644
index 000000000..a6f472658
Binary files /dev/null and b/src/forge/Information/img/user/ryzs.png differ
diff --git a/src/forge/Information/img/user/scoreBg.png b/src/forge/Information/img/user/scoreBg.png
new file mode 100644
index 000000000..cac8e7944
Binary files /dev/null and b/src/forge/Information/img/user/scoreBg.png differ
diff --git a/src/forge/Information/img/user/scoreBg1.png b/src/forge/Information/img/user/scoreBg1.png
new file mode 100644
index 000000000..615c2a3a1
Binary files /dev/null and b/src/forge/Information/img/user/scoreBg1.png differ
diff --git a/src/forge/Information/img/user/star.png b/src/forge/Information/img/user/star.png
new file mode 100644
index 000000000..141bbefe2
Binary files /dev/null and b/src/forge/Information/img/user/star.png differ
diff --git a/src/forge/Information/img/user/success.png b/src/forge/Information/img/user/success.png
new file mode 100644
index 000000000..186d71532
Binary files /dev/null and b/src/forge/Information/img/user/success.png differ
diff --git a/src/forge/Information/img/user/successBg.png b/src/forge/Information/img/user/successBg.png
new file mode 100644
index 000000000..26902f2a9
Binary files /dev/null and b/src/forge/Information/img/user/successBg.png differ
diff --git a/src/forge/Information/img/user/template.png b/src/forge/Information/img/user/template.png
new file mode 100644
index 000000000..54b1433e1
Binary files /dev/null and b/src/forge/Information/img/user/template.png differ
diff --git a/src/forge/Information/img/user/userBg.png b/src/forge/Information/img/user/userBg.png
new file mode 100644
index 000000000..0c777a7df
Binary files /dev/null and b/src/forge/Information/img/user/userBg.png differ
diff --git a/src/forge/Information/img/user/userMBg.png b/src/forge/Information/img/user/userMBg.png
new file mode 100644
index 000000000..1671e0799
Binary files /dev/null and b/src/forge/Information/img/user/userMBg.png differ
diff --git a/src/forge/Information/img/user/userMBg2.png b/src/forge/Information/img/user/userMBg2.png
new file mode 100644
index 000000000..03b40f835
Binary files /dev/null and b/src/forge/Information/img/user/userMBg2.png differ
diff --git a/src/forge/Information/img/user/xwtj.png b/src/forge/Information/img/user/xwtj.png
new file mode 100644
index 000000000..a69db8352
Binary files /dev/null and b/src/forge/Information/img/user/xwtj.png differ
diff --git a/src/forge/Information/img/user/xxcg.png b/src/forge/Information/img/user/xxcg.png
new file mode 100644
index 000000000..a8044feb6
Binary files /dev/null and b/src/forge/Information/img/user/xxcg.png differ
diff --git a/src/forge/Information/img/user/zdtg.png b/src/forge/Information/img/user/zdtg.png
new file mode 100644
index 000000000..443a549c5
Binary files /dev/null and b/src/forge/Information/img/user/zdtg.png differ
diff --git a/src/forge/Information/img/user/zdtj.png b/src/forge/Information/img/user/zdtj.png
new file mode 100644
index 000000000..5178be88b
Binary files /dev/null and b/src/forge/Information/img/user/zdtj.png differ
diff --git a/src/forge/Information/img/user/zjdy.png b/src/forge/Information/img/user/zjdy.png
new file mode 100644
index 000000000..eed414e35
Binary files /dev/null and b/src/forge/Information/img/user/zjdy.png differ
diff --git a/src/forge/Information/img/user/zoneMenu11.png b/src/forge/Information/img/user/zoneMenu11.png
new file mode 100644
index 000000000..410023a83
Binary files /dev/null and b/src/forge/Information/img/user/zoneMenu11.png differ
diff --git a/src/forge/Information/img/vipTitleBc.png b/src/forge/Information/img/vipTitleBc.png
new file mode 100644
index 000000000..bb14786b4
Binary files /dev/null and b/src/forge/Information/img/vipTitleBc.png differ
diff --git a/src/forge/Information/index.jsx b/src/forge/Information/index.jsx
index 27e54f853..2e063c7df 100644
--- a/src/forge/Information/index.jsx
+++ b/src/forge/Information/index.jsx
@@ -36,6 +36,14 @@ const VIP = Loadable({
loader: () => import("./Pages/zoneVIP"),
loading: Loading,
});
+const User = Loadable({
+ loader: () => import("./Pages/zoneUser"),
+ loading: Loading,
+});
+const Score = Loadable({
+ loader: () => import("./Pages/zoneScore"),
+ loading: Loading,
+});
const Apply = Loadable({
loader: () => import("./Pages/apply"),
loading: Loading,
@@ -141,6 +149,7 @@ const DataSetList = Loadable({
function Index(props){
const [ data , setData ] = useState(undefined);
const [ adminUrl , setAdminUrl ] = useState(undefined);
+ const [ adminLoaded, setAdminLoaded ] = useState(false);
const { deptId } = props.match.params;
const [ id , setId ] = useState(undefined);
const [ temp , setTemp ] = useState(tempEnum.zone);
@@ -204,7 +213,7 @@ function Index(props){
}else{
setAdminUrl(undefined);
}
- }).catch(error=>{})
+ }).catch(error=>{}).finally(() => setAdminLoaded(true))
}
function getRole(id){
@@ -218,7 +227,7 @@ function Index(props){
return(
- { (!isSearch && !projectCateDetail && !isSourcedetail && deptId!=="apply") && (id ?
: )}
+ { (!isSearch && !projectCateDetail && !isSourcedetail && deptId!=="apply") && (id && adminLoaded ? : )}
)}
>
+ {(adminLoaded && !adminUrl && data && data.sectionPointsShow) && (
+ (
+
+ )}
+ >
+ )}
+ {(adminLoaded && !adminUrl && data && data.sectionPointsShow) && (
+ (
+
+ )}
+ >
+ )}
(
diff --git a/src/forge/Information/index.scss b/src/forge/Information/index.scss
index 741857448..b7099ca9c 100644
--- a/src/forge/Information/index.scss
+++ b/src/forge/Information/index.scss
@@ -2183,6 +2183,149 @@
}
}
}
+.totalMemeber{
+ font-family:Alibaba PuHuiTi;
+ font-weight:500;
+ color:#091221;
+ font-size:18px;
+ padding:30px 40px;
+ display: flex;
+ align-items: center;
+ line-height:25px;
+ span{
+ padding:0 6px;
+ height:21px;
+ line-height:21px;
+ background:#f1ebff;
+ border-radius:4px;
+ margin-left:12px;
+ color:#7a45ec;
+ font-size:12px;
+ }
+}
+
+.zoneMemberRow {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: flex-start;
+ align-items: flex-start;
+ padding:0 25px 30px;
+}
+.memeberSlider{
+ position: relative;
+ .custom-prev-arrow,.custom-next-arrow{
+ position:absolute;
+ right:45px;
+ top:-55px;
+ left:unset;
+ width: 30px;
+ height: 30px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor:pointer;
+ i{
+ font-size:30px!important;
+ }
+ &.arrow-disabled{
+ i{
+ opacity: 0.4;
+ }
+ cursor: not-allowed;
+ }
+ }
+ .custom-prev-arrow{
+ right:95px;
+ }
+}
+.zoneMemberItem{
+ padding-top:45px;
+ width:163px;
+ margin:15px;
+ position: relative;
+ &:hover{
+ .zoneMI_box .zoneMI_img{
+ a::before{
+ animation: buttonBorderSpin 3s linear infinite forwards;
+ }
+ }
+ .zoneMI_box .zoneMI_name{
+ color:#466aff;
+ }
+ }
+ &::before,&::after{
+ content:"";
+ position: absolute;
+ height: 117px;
+ left:-1px;
+ right: -1px;
+ bottom: -1px;
+ z-index:0;
+ border-radius:8px;
+ background:linear-gradient(180deg,rgba(219, 70, 255, 0.17) 0%,rgba(111, 85, 255, 0.17) 42.36%,rgba(70, 106, 255, 0.17) 100%);
+ }
+ &::after{
+ height: 115px;
+ z-index: 1;
+ left:0;
+ right:0;
+ bottom:0;
+ background: #fff;
+ }
+ .zoneMI_box{
+ height: 115px;
+ padding-bottom: 10px;
+ border-radius:8px;
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-end;
+ position: relative;
+ align-items: center;
+ position: relative;
+ z-index: 10;
+ background:linear-gradient(313.05deg,#ffffff 19.33%,rgba(242, 246, 255, 0.08) 62.79%,rgba(133, 110, 250, 0.08) 97.93%);
+ .zoneMI_img{
+ position: absolute;
+ left:50%;
+ margin-left:-40px;
+ top:-40px;
+ z-index:1000;
+ a{
+ position: relative;
+ &::before{
+ content:"";
+ position: absolute;
+ height: 84px;
+ width:84px;
+ left:-2px;
+ right: -2px;
+ bottom: -2px;
+ top: -2px;
+ z-index:0;
+ border-radius:50%;
+ background:linear-gradient(168.49deg,#466aff -0.45%,#e2e7ff 22.8%,#f3c9ff 42.17%,#ffffff 71.05%);
+ }
+ }
+ img{
+ border-radius:50%;
+ position: relative;
+ z-index:2;
+ background: #fff;
+ }
+ }
+ .zoneMI_name{
+ color:#091221;
+ font-size:18px;
+ font-family:alibaba;
+ height:25px;
+ line-height:25px;
+ width: 100%;
+ text-align: center;
+ padding: 0 10px;
+ }
+ }
+}
+
.NSCC_source_box{
background-image: url('./img/source-bg.png');
background-size: 100% 100%;
@@ -2388,4 +2531,9 @@
opacity: 1;
transform: translateY(0px);
}
+}
+@keyframes buttonBorderSpin {
+ 100% {
+ transform: rotate(360deg);
+ }
}
\ No newline at end of file
diff --git a/src/forge/Information/indexUser.scss b/src/forge/Information/indexUser.scss
new file mode 100644
index 000000000..51a69c08d
--- /dev/null
+++ b/src/forge/Information/indexUser.scss
@@ -0,0 +1,1093 @@
+@import './theme.scss';
+
+.zone_user_box{
+ padding: 50px 0;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ transform: translateY(60px);
+ opacity: 0;
+ animation: slideUpFadeIn60 0.6s ease-out forwards;
+ animation-delay: 0.5s;
+ font-family: alibabaReg;
+ color: #191919;
+ .ant-spin-nested-loading{
+ width: 100%;
+ }
+ .banner_box{
+ width: 100%;
+ background-image: url(./img/user/bg.png);
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+ background-position: 50%;
+ padding: 30px 40px;
+ border-radius: 20px;
+ .info{
+ display: flex;
+ .subject{
+ font-family: alibaba;
+ font-size:28px;
+ height:38px;
+ line-height:38px;
+ &:first-of-type{
+ margin-bottom: 15px !important;
+ }
+ &:last-of-type{
+ margin-bottom: 26px !important;
+ overflow: hidden;
+ }
+ }
+ label{
+ background-clip: text;
+ color: transparent;
+ background-image: linear-gradient(to right, #624eff, #225aff);
+ }
+ .btn{
+ background-image:linear-gradient(95.71deg,#694dff 0%,#1d5bff 100%);
+ border-radius:6px;
+ transition: all 0.3s;
+ padding: 4px 42px;
+ letter-spacing: 1px;
+ display: inline-block;
+ &:hover{
+ background-image:linear-gradient(273.05deg,#694dff 0%,#1d5bff 100%);
+ .icon-jiantou3{
+ left: 5px;
+ }
+ }
+ .icon-jiantou3{
+ position: relative;
+ left: 0px;
+ transition: left .85s ease;
+ }
+ }
+ .svgbox{
+ position: relative;
+ display: inline-block;
+ width: 517px;
+ .scan_line {
+ position: absolute;
+ left: 0; right: 0;
+ height: 2px;
+ background: linear-gradient(90deg, transparent 0%, rgba(74,143,255,0.6) 50%, transparent 100%);
+ animation: scan 4s ease-in-out infinite;
+ z-index: 1;
+ pointer-events: none;
+ }
+ .corner {
+ position: absolute;
+ width: 20px; height: 20px;
+ z-index: 3;
+ opacity: 0.5;
+ }
+ .banner{
+ width: 320px;
+ height: 190px;
+ }
+ }
+ }
+ .items{
+ display: grid;
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+ .detail{
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ align-items: start;
+ padding: 0 40px;
+ &::after{
+ content: '';
+ position: absolute;
+ right: 0;
+ top: 12px;
+ bottom: 12px;
+ border-right: 1px dashed rgba(25, 25, 25, 0.15);
+ }
+ img{
+ width: 32px;
+ height: 32px;
+ }
+ h3{
+ font-size: 18px;
+ line-height: 50px;
+ color: #191919;
+ font-family: alibaba;
+ }
+ p{
+ font-size: 14px;
+ color: #515863;
+ }
+ &:last-child{
+ padding-right: 0;
+ &::after{
+ border-right: none;
+ }
+ }
+ &:first-child{
+ padding-left: 0;
+ }
+ }
+ }
+ }
+
+ .user_box{
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ .info{
+ height: 120px;
+ display: flex;
+ flex-direction: row;
+ width: 100%;
+ background-image: url(./img/user/userBg.png);
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+ padding: 20px 36px;
+ border-radius: 20px;
+ align-items: center;
+ color: white;
+ .info_txt{
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ flex: 1;
+ overflow: hidden;
+ span{
+ color: white;
+ margin-left: 22px;
+ cursor: pointer;
+ font-family: alibaba;
+ &:hover{
+ color: rgba(255, 255, 255, 0.6);
+ }
+ }
+ }
+ .current_img{
+ width: 56px;
+ height: 56px;
+ border: 2px solid white;
+ border-radius: 50%;
+ }
+ .score{
+ height: 56px;
+ color:#ffffff;
+ font-size:44px;
+ display: flex;
+ align-items: center;
+ font-family: alibabaBold;
+ justify-content: end;
+ label{
+ margin-left: 8px;
+ color:#ffffff;
+ font-size:15px;
+ font-family: alibabaReg;
+ }
+ }
+ .score_detail{
+ display: flex;
+ justify-content: end;
+ align-items: center;
+ color:#ffffff;
+ font-size:15px;
+ height: 20px;
+ line-height: 20px;
+ cursor: pointer;
+ .iconfont{
+ font-size: 10px !important;
+ }
+ &:hover{
+ color: rgba(255, 255, 255, 0.6);
+ }
+ }
+ }
+
+ .level{
+ position: relative;
+ display: inline-block;
+ border-radius: 14px;
+ margin-left: 22px;
+ font-size: 12px;
+ padding: 0 10px;
+ text-align: center;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ &::before{
+ content: '';
+ position: absolute;
+ inset: 0;
+ border-radius: 14px;
+ background: linear-gradient(90.3deg,rgba(255, 255, 255, 0.14) 3.96%,rgba(255, 255, 255, 0.23) 51.23%,rgba(255, 255, 255, 0.11) 99.92%);
+ z-index: 0;
+ }
+ &::after{
+ content: '';
+ position: absolute;
+ inset: 0;
+ border-radius: 14px;
+ padding: 1px;
+ background: linear-gradient(90.86deg,rgba(255, 255, 255, 0) 0.15%, rgba(255, 255, 255, 0.25) 50.71%,rgba(255, 255, 255, 0.12) 99.79%);
+ -webkit-mask:
+ linear-gradient(#fff 0 0) content-box,
+ linear-gradient(#fff 0 0);
+ -webkit-mask-composite: xor;
+ mask:
+ linear-gradient(#fff 0 0) content-box,
+ linear-gradient(#fff 0 0);
+ mask-composite: exclude;
+ z-index: 1;
+ pointer-events: none;
+ }
+ }
+
+ .desc{
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ flex: 1;
+ margin-right: 60px;
+ }
+
+ .awards{
+ margin-top: 45px;
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 30px;
+ .award{
+ padding: 16px 20px;
+ border-radius:10px;
+ background-image: url(./img/user/awardBg.png);
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+ color:#191919;
+ border: 1px solid transparent;
+ &:hover{
+ border: 1px solid #466aff;
+ .btn:not(.disabled){
+ color: white !important;
+ border-color: #466aff;
+ background-color: #466aff;
+ }
+ }
+ h3{
+ font-family: alibaba;
+ color:#191919;
+ font-size:15px;
+ }
+ p{
+ color:#5d6483;
+ font-size:13px;
+ margin: 10px 0 16px 0;
+ }
+ .action{
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ align-items: center;
+ color: #191919;
+ font-size: 14px;
+ .btn{
+ border: 1px solid #466aff;
+ border-radius:8px;
+ width:80px;
+ height:32px;
+ color:#466aff;
+ font-size:14px;
+ text-align: center;
+ cursor: pointer;
+ &.disabled{
+ color: rgba(27, 47, 131, 0.21);
+ border-color: rgba(27, 47, 131, 0.21);
+ cursor: not-allowed;
+ }
+ &:hover:not(.disabled),.active{
+ color: white;
+ border-color: #466aff;
+ background-color: #466aff;
+ }
+ }
+ }
+ label{
+ font-family: alibaba;
+ font-size:17px;
+ }
+ }
+ }
+ }
+}
+
+.zone_Score_box{
+ padding: 50px 0;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ font-family: alibabaReg;
+ transform: translateY(60px);
+ opacity: 0;
+ animation: slideUpFadeIn60 0.6s ease-out forwards;
+ animation-delay: 0.5s;
+ color: #191919;
+ .info{
+ height: 158px;
+ display: flex;
+ flex-direction: row;
+ width: 100%;
+ background-image: url(./img/user/scoreBg.png);
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+ padding: 40px 50px 34px 30px;
+ align-items: center;
+ color: white;
+ border-radius: 10px;
+ .info_title{
+ display: flex;
+ flex-direction: column;
+ flex: 1;
+ color: white;
+ .title_a{
+ color:#ffffff;
+ font-size:22px;
+ height:30px;
+ line-height: 30px;
+ margin-bottom: 22px;
+ font-family: alibaba;
+ }
+ p{
+ color:#ffffff;
+ font-size:15px;
+ height:21px;
+ line-height: 21px;
+ }
+ }
+
+ .items{
+ display: flex;
+ flex-direction: row;
+ justify-content: start;
+ align-items: center;
+ background: white;
+ border-radius:10px;
+ padding: 18px;
+ width: 220px;
+ height: 85px;
+ margin-right: 20px;
+ &:last-child{
+ margin-right: 0;
+ }
+ img{
+ width: 38px;
+ height: 38px;
+ margin-right: 26px;
+ }
+ h4{
+ color:#5d6483;
+ height:20px;
+ line-height:22px;
+ margin-bottom: 6px !important;
+ }
+ p{
+ color:#191919;
+ font-size:20px;
+ height:27px;
+ line-height:22px;
+ font-family: alibaba;
+ }
+ &:last-child{
+ padding-right: 0;
+ &::after{
+ border-right: none;
+ }
+ }
+ &:first-child{
+ padding-left: 0;
+ }
+ }
+ }
+}
+
+.rule_subject{
+ color:#181818;
+ font-size:36px;
+ font-family: alibaba;
+ text-align: center;
+ margin-top: 60px;
+ margin-bottom: 45px !important;
+}
+
+.rule_box{
+ width: 100%;
+ background-image: url(./img/user/ruleBg.png);
+ background-position: top center;
+ background-size: 100% auto;
+ background-repeat: no-repeat;
+ border-radius: 10px;
+ font-family: alibabaReg;
+ color: #191919;
+ .desc{
+ display: flex;
+ flex-direction: column;
+ padding: 45px 36px;
+ h2{
+ color:#191919;
+ font-size:20px;
+ font-family: alibaba;
+ }
+ p{
+ font-size: 15px;
+ }
+ }
+ .rules{
+ border-radius: 20px;
+ background-color: white;
+ padding: 40px 30px;
+ }
+}
+
+.detailBox{
+ width: 100%;
+ background-image: url(./img/user/scoreBg1.png);
+ background-position: top center;
+ background-size: 100% auto;
+ background-repeat: no-repeat;
+ border-radius: 20px;
+ margin-top: 36px;
+ padding: 30px;
+ font-family: alibabaReg;
+ color: #191919;
+ .detail{
+ border-radius: 10px;
+ background-color: white;
+ padding: 30px 24px;
+ }
+
+ .detail_table{
+ width: 100%;
+ border-collapse: collapse;
+ border: none;
+ font-family: alibabaReg;
+ td{
+ border: none;
+ }
+ thead th{
+ color:#191919;
+ font-size:16px;
+ font-family: alibaba;
+ }
+ tbody td{
+ padding: 20px 0;
+ .tag{
+ border-radius: 14px;
+ font-weight:500;
+ font-size:15px;
+ padding: 4px 14px;
+ }
+ .blue{
+ color: #1b6fc4;
+ background-color: rgba(27, 111, 196, 0.08);
+ }
+ .green{
+ color: #16b567;
+ background-color: rgba(22, 181, 103, 0.08);
+ }
+ .orange{
+ color: #ff9811;
+ background-color: rgba(255, 152, 17, 0.08);
+ }
+ .purple{
+ color: #7d3aed;
+ background-color: rgba(125, 58, 237, 0.08);
+ }
+ .cyan{
+ color: #02a0cc;
+ background-color: rgba(2, 160, 204, 0.08);
+ }
+ .brown{
+ color: #e05a00;
+ background-color: rgba(224, 90, 0, 0.08);
+ }
+ .pink{
+ color: #f5383b;
+ background-color: rgba(245, 56, 59, 0.08);
+ }
+ .gray{
+ color: #818598;
+ background-color: rgba(129, 133, 152, 0.08);
+ }
+ &.time{
+ color:#4a5377;
+ font-size:14px;
+ }
+ &.desc{
+ // font-weight:500;
+ color:#191919;
+ font-size:15px;
+ font-family: alibaba;
+ p{
+ margin-top: 8px;
+ color:#4a5377;
+ font-size:13px;
+ }
+ }
+ &.score{
+ // font-weight:500;
+ font-size:17px;
+ font-family: alibaba;
+ &.green{
+ color:#1ca73c;
+ }
+ &.red{
+ color:#f5383b;
+ }
+ &.orange{
+ color:#e05a00;
+ }
+ &.gray{
+ color:#818598;
+ }
+ }
+ &.remark{
+ color:#4a5377;
+ font-size:14px;
+ .reply{
+ margin-top: 8px;
+ padding: 7px 5px;
+ display: flex;
+ align-items: center;
+ font-size: 12px;
+ font-family: alibabaReg;
+ color: #1b6fc4;
+ background-color: rgba(27, 111, 196, 0.03);
+ i{
+ padding-top: 2px;
+ margin-left: 10px;
+ }
+ }
+ }
+ }
+ tbody tr:not(:last-child){
+ border-bottom: 1px dashed #e0e0e0;
+ }
+ tbody tr:last-child td{
+ padding-bottom: 12px;
+ }
+ }
+}
+
+.score-table{
+ width: 100%;
+ border-collapse: collapse;
+ border: none;
+ font-family: alibabaReg;
+ color: #191919;
+ td{
+ border: none;
+ }
+ thead th{
+ color:#4a5377;
+ font-size:14px;
+ padding-bottom: 12px;
+ font-family: alibaba;
+ }
+ tbody td{
+ padding: 24px 0;
+ .tag{
+ border-radius: 14px;
+ font-family: alibaba;
+ font-size:15px;
+ padding: 4px 14px;
+ }
+ .blue{
+ color: #1b6fc4;
+ background-color: rgba(27, 111, 196, 0.08);
+ }
+ .green{
+ color: #16b567;
+ background-color: rgba(22, 181, 103, 0.08);
+ }
+ .orange{
+ color: #ff9811;
+ background-color: rgba(255, 152, 17, 0.08);
+ }
+ .purple{
+ color: #7d3aed;
+ background-color: rgba(125, 58, 237, 0.08);
+ }
+ .cyan{
+ color: #02a0cc;
+ background-color: rgba(2, 160, 204, 0.08);
+ }
+ .brown{
+ color: #e05a00;
+ background-color: rgba(224, 90, 0, 0.08);
+ }
+ .pink{
+ color: #f5383b;
+ background-color: rgba(245, 56, 59, 0.08);
+ }
+ &.action{
+ font-family: alibaba;
+ color:#191919;
+ font-size:15px;
+ }
+ &.score{
+ font-family: alibaba;
+ color:#466aff;
+ font-size:17px;
+ }
+ &.remark{
+ color:#4a5377;
+ font-size:15px;
+ }
+ }
+ tbody tr:not(:last-child){
+ border-bottom: 1px dashed #e0e0e0;
+ }
+ tbody tr:last-child td{
+ padding-bottom: 12px;
+ }
+}
+
+.user_modal{
+ .ant-modal-content{
+ padding-top: 20px;
+ border-radius: 16px;
+ background-image: url(./img/user/userMBg.png);
+ background-position: top center;
+ background-size: 100% auto;
+ background-repeat: no-repeat;
+ background-color: #FFF;
+ font-family: alibabaReg;
+ color: #191919;
+ .ant-modal-close{
+ top: 78px !important;
+ right: 50px;
+ span{
+ width: 20px;
+ height: 20px;
+ line-height: 20px;
+ color: #4a5377;
+ }
+ }
+ }
+ .ant-modal-header{
+ padding: 36px 0 24px 0;
+ border-radius: 16px 16px 0px 0;
+ background-image: url(./img/user/userMBg2.png);
+ background-position: top center;
+ background-size: 100% auto;
+ background-repeat: no-repeat;
+ border-bottom: 2px dotted rgba(70, 106, 255, 0.25);
+ .ant-modal-title{
+ height: 60px;
+ line-height: 60px !important;
+ }
+ .title_box{
+ display: flex;
+ margin-left: 40px;
+ align-items: center;
+ .txt{
+ display: flex;
+ flex-direction: column;
+ align-items: start;
+ margin-left: 24px;
+ background: transparent;
+ }
+ h4{
+ text-align: left;
+ color: #191919;
+ height: 24px;
+ line-height: 24px;
+ margin-bottom: 16px !important;
+ font-family: alibaba;
+ font-size: 17px;
+ }
+ p{
+ color:#4a5377;
+ font-size:15px;
+ height: 21px;
+ line-height: 21px;
+ font-weight: 400;
+ }
+ }
+ }
+ .ant-modal-body,.ant-modal-footer{
+ background-color: #FFF;
+ }
+ .ant-modal-body{
+ background-color: #FFF;
+ background-image: url(./img/user/userMBg2.png);
+ background-position: top -124px left 0px;
+ background-size: 100% auto;
+ background-repeat: no-repeat;
+ padding: 30px 40px;
+ .info{
+ display: flex;
+ flex-direction: column;
+ .avatar{
+ display: flex;
+ align-items: center;
+ gap: 32px;
+ margin-bottom: 26px;
+ .box{
+ width: 100%;
+ height:38px;
+ background:#ffffff;
+ border:1px dashed;
+ border-color:rgba(70, 106, 255, 0.18);
+ border-radius:6px;
+ margin-bottom: 16px;
+ display: flex;
+ align-items: center;
+ padding: 0 17px;
+ .uploadtxt{
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ color:#466aff;
+ font-size:15px;
+ font-family: alibaba;
+ cursor: pointer;
+ }
+ }
+ }
+ img{
+ width: 65px;
+ height: 65px;
+ border-radius: 50%;
+ }
+ p{
+ color: #949ec7;
+ font-size: 13px;
+ font-weight: 400;
+ }
+ p.award{
+ line-height:32px;
+ color:#4a5377;
+ font-size:15px;
+ margin-bottom: 30px;
+ label{
+ font-family: alibaba;
+ color: #f5383b;
+ }
+ }
+ }
+ .ant-form-item label{
+ color:#191919;
+ font-size:15px;
+ }
+ }
+ .ant-modal-footer{
+ border-top: none;
+ padding-top: 0;
+ padding-bottom: 32px;
+ text-align: center;
+ border-radius: 16px;
+ button{
+ width: 120px;
+ height: 36px;
+ line-height: 36px;
+ }
+ .btn_ok{
+ border: 1px solid #6e90ff;
+ color: white;
+ background:linear-gradient(91.72deg,#694dff -2.85%,#1d5bff 99.65%);
+ }
+ }
+
+}
+
+.qa_modal{
+ .ant-modal-content{
+ padding-top: 20px;
+ border-radius: 16px;
+ background-image: url(./img/user/userMBg.png);
+ background-position: top center;
+ background-size: 100% auto;
+ background-repeat: no-repeat;
+ background-color: #FFF;
+ font-family: alibabaReg;
+ color: #191919;
+ .ant-modal-close{
+ top: 78px !important;
+ right: 50px;
+ span{
+ width: 20px;
+ height: 20px;
+ line-height: 20px;
+ color: #4a5377;
+ }
+ }
+ }
+ .ant-modal-header{
+ padding: 36px 0 24px 0;
+ border-radius: 16px 16px 0px 0;
+ background-image: url(./img/user/userMBg2.png);
+ background-position: top center;
+ background-size: 100% auto;
+ background-repeat: no-repeat;
+ border-bottom: 2px dotted rgba(70, 106, 255, 0.25);
+ .ant-modal-title{
+ height: 60px;
+ line-height: 60px !important;
+ }
+ .title_box{
+ display: flex;
+ margin-left: 40px;
+ align-items: center;
+ .txt{
+ display: flex;
+ flex-direction: column;
+ align-items: start;
+ margin-left: 24px;
+ background: transparent;
+ }
+ h4{
+ text-align: left;
+ color: #191919;
+ height: 24px;
+ line-height: 24px;
+ margin-bottom: 16px !important;
+ font-family: alibaba;
+ font-size: 17px;
+ }
+ p{
+ color:#4a5377;
+ font-size:15px;
+ height: 21px;
+ line-height: 21px;
+ font-weight: 400;
+ }
+ }
+ }
+ .ant-modal-body,.ant-modal-footer{
+ background-color: #FFF;
+ }
+ .ant-modal-body{
+ background-color: #FFF;
+ background-image: url(./img/user/userMBg2.png);
+ background-position: top -124px left 0px;
+ background-size: 100% auto;
+ background-repeat: no-repeat;
+ padding: 20px 40px 10px 50px;
+ .info{
+ display: flex;
+ flex-direction: column;
+ .tipsline{
+ display: flex;
+ align-items: center;
+ color: #d31215;
+ margin-bottom: 30px;
+ p{
+ margin-left: 10px;
+ font-size: 15px;
+ font-family: alibabaReg;
+ }
+ }
+ }
+ .ant-form-item label{
+ color:#191919;
+ font-size:15px;
+ }
+ }
+ .ant-modal-footer{
+ border-top: none;
+ padding-top: 0;
+ padding-bottom: 32px;
+ text-align: center;
+ border-radius: 16px;
+ button{
+ width: 120px;
+ height: 36px;
+ line-height: 36px;
+ }
+ .btn_ok{
+ border: 1px solid #6e90ff;
+ color: white;
+ background:linear-gradient(91.72deg,#694dff -2.85%,#1d5bff 99.65%);
+ }
+ }
+
+}
+
+.doc_modal{
+ .ant-modal-content{
+ border-radius: 16px;
+ background-image: url(./img/user/docMBg.png);
+ background-position: top center;
+ background-size: 100% auto;
+ background-repeat: no-repeat;
+ background-color: #f9faff;
+ font-family: alibabaReg;
+ color: #191919;
+ .ant-modal-close{
+ top: 23px !important;
+ right: 30px;
+ span{
+ width: 20px;
+ height: 20px;
+ line-height: 20px;
+ color: #FFFFFF;
+ }
+ }
+ }
+ .ant-modal-header{
+ padding: 20px 0;
+ border-radius: 16px 16px 0px 0;
+ background-color: transparent;
+ border: none;
+ .ant-modal-title{
+ height: 25px;
+ line-height: 25px;
+ .title_box{
+ font-family: alibaba;
+ font-size: 18px;
+ text-align: center;
+ color: #FFF;
+ font-weight: 400 !important;
+ height: 25px;
+ line-height: 25px;
+ }
+ }
+ }
+ .ant-modal-body,.ant-modal-footer{
+ background-color: #f9faff;
+ }
+ .ant-modal-body{
+ background-color: #f9faff;
+ background-image: url(./img/user/docMBg2.png);
+ background-size: 100% auto;
+ background-repeat: no-repeat;
+ padding: 30px 40px 30px 35px;
+ border-radius: 11px 11px 0 0;
+ min-height: 300px;
+ .info{
+ display: flex;
+ flex-direction: column;
+ .line{
+ display: flex;
+ overflow: hidden;
+ align-items: center;
+ color: #191919;
+ &.topline{
+ font-size: 16px;
+ font-family: alibaba;
+ padding-top: 16px;
+ }
+ &.dataline{
+ font-size: 15px;
+ font-family: alibabaReg;
+ padding: 30px 0 24px 0;
+ border-bottom: 1px dashed rgba(70, 106, 255, 0.25);
+ }
+ .content{
+ flex: 1;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+ text-align: left;
+ }
+ .action{
+ width: 200px;
+ text-align: right;
+ }
+ }
+ }
+ }
+ .ant-modal-footer{
+ border-top: none;
+ padding-top: 0;
+ padding-bottom: 32px;
+ text-align: center;
+ border-radius: 0 0 16px 16px;
+ button{
+ width: 120px;
+ height: 36px;
+ line-height: 36px;
+ }
+ .btn_ok{
+ border: 1px solid #6e90ff;
+ color: white;
+ background:linear-gradient(91.72deg,#694dff -2.85%,#1d5bff 99.65%);
+ }
+ }
+
+}
+
+.success_modal{
+ .ant-modal-content{
+ border-radius: 16px;
+ background-image: url(./img/user/successBg.png);
+ background-position: top center;
+ background-size: 100% auto;
+ background-repeat: no-repeat;
+ }
+ .ant-modal-close{
+ top: 20px !important ;
+ right: 24px;
+ span{
+ width: 20px;
+ height: 20px;
+ line-height: 20px;
+ color: #191919;
+ }
+ }
+ .ant-modal-body{
+ padding: 50px 24px 50px 24px;
+ .info{
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ img{
+ width: 60px;
+ height: 60px;
+ }
+ p{
+ margin-top: 30px;
+ margin-bottom: 55px !important;
+ font-size: 20px;
+ font-family: alibaba;
+ color: #191919;
+ label{
+ color: #ff7634;
+ }
+ }
+ .btn_ok{
+ border: 1px solid #6e90ff;
+ color: white;
+ background:linear-gradient(91.72deg,#694dff -2.85%,#1d5bff 99.65%);
+ width: 170px;
+ height: 36px;
+ line-height: 36px;
+ }
+ }
+ }
+}
+
+
+body.ant-scrolling-effect {
+ width: auto !important;
+}
+
+.corner-tl { top: 16px; left: 16px; border-top: 2px solid #4a8fff; border-left: 2px solid #4a8fff; }
+.corner-tr { top: 16px; right: 16px; border-top: 2px solid #4a8fff; border-right: 2px solid #4a8fff; }
+.corner-bl { bottom: 16px; left: 16px; border-bottom: 2px solid #4a8fff; border-left: 2px solid #4a8fff; }
+.corner-br { bottom: 16px; right: 16px; border-bottom: 2px solid #4a8fff; border-right: 2px solid #4a8fff; }
+
+@keyframes scan {
+ 0% { top: 0%; opacity: 0; }
+ 5% { opacity: 1; }
+ 95% { opacity: 1; }
+ 100% { top: 100%; opacity: 0; }
+}
+
+@keyframes slideUpFadeIn60 {
+ 0% {
+ opacity: 0;
+ transform: translateY(40px);
+ }
+ 100% {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
diff --git a/src/forge/Information/zoneUser.scss b/src/forge/Information/zoneUser.scss
new file mode 100644
index 000000000..9992be1fa
--- /dev/null
+++ b/src/forge/Information/zoneUser.scss
@@ -0,0 +1,239 @@
+.zone_user_container {
+ display: flex;
+ flex-direction: column;
+ min-height: 100vh;
+ background: #f5f5f5;
+
+ /* 顶部导航栏 */
+ .user_header {
+ background: #1890ff;
+ height: 60px;
+ display: flex;
+ align-items: center;
+ padding: 0 20px;
+
+ .header_content {
+ width: 100%;
+ max-width: 1200px;
+ margin: 0 auto;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ .logo_area {
+ display: flex;
+ align-items: center;
+
+ .logo_icon {
+ width: 40px;
+ height: 40px;
+ background: #fff;
+ border-radius: 8px;
+ margin-right: 12px;
+ }
+
+ .logo_text {
+ display: flex;
+ flex-direction: column;
+
+ .logo_title {
+ color: #fff;
+ font-size: 18px;
+ font-weight: 600;
+ line-height: 1.2;
+ }
+
+ .logo_url {
+ color: rgba(255, 255, 255, 0.8);
+ font-size: 12px;
+ line-height: 1.2;
+ }
+ }
+ }
+
+ .header_nav {
+ display: flex;
+ align-items: center;
+ gap: 24px;
+
+ .nav_item {
+ color: #fff;
+ font-size: 14px;
+ text-decoration: none;
+ opacity: 0.9;
+
+ &:hover {
+ opacity: 1;
+ }
+ }
+
+ .nav_avatar {
+ width: 32px;
+ height: 32px;
+ background: rgba(255, 255, 255, 0.2);
+ border-radius: 50%;
+ }
+ }
+ }
+ }
+
+ /* 登录卡片 */
+ .login_card {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding: 40px 20px;
+
+ .login_card_header {
+ width: 364px;
+ margin-bottom: 20px;
+ position: relative;
+
+ .login_title {
+ font-size: 24px;
+ font-weight: 600;
+ color: #333;
+ margin: 0;
+ }
+
+ .login_decorate {
+ position: absolute;
+ top: 0;
+ right: 0;
+ width: 60px;
+ height: 60px;
+ background: linear-gradient(135deg, #1890ff 0%, #40a9ff 100%);
+ border-radius: 50%;
+ opacity: 0.1;
+ }
+ }
+
+ .login_tabs {
+ width: 364px;
+ background: #fff;
+ border-radius: 12px;
+ padding: 24px;
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
+
+ .ant-tabs-nav {
+ width: 100%;
+ margin-bottom: 20px;
+
+ .ant-tabs-tab {
+ width: 50%;
+ text-align: center;
+ font-size: 15px;
+ padding: 10px 0;
+ margin: 0;
+ }
+ }
+ }
+
+ .login_form {
+ .login_input {
+ height: 44px;
+ border-radius: 6px;
+ font-size: 14px;
+
+ .ant-input-prefix {
+ color: #999;
+ margin-right: 8px;
+ }
+ }
+
+ .login_options {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 24px;
+
+ .forgot_password {
+ color: #1890ff;
+ font-size: 14px;
+
+ &:hover {
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .login_button {
+ height: 44px;
+ border-radius: 6px;
+ font-size: 16px;
+ font-weight: 500;
+ background: #1890ff;
+ border-color: #1890ff;
+
+ &:hover,
+ &:focus {
+ background: #40a9ff;
+ border-color: #40a9ff;
+ }
+ }
+ }
+
+ .code_input_wrapper {
+ display: flex;
+ gap: 12px;
+
+ .code_input {
+ flex: 1;
+ }
+
+ .code_button {
+ width: 110px;
+ height: 44px;
+ border-radius: 6px;
+ white-space: nowrap;
+ }
+ }
+
+ .login_footer {
+ width: 364px;
+ text-align: center;
+ padding: 20px 24px;
+ background: #fff;
+ border-radius: 0 0 12px 12px;
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
+ margin-top: -24px;
+ border-top: 1px solid #f0f0f0;
+ font-size: 14px;
+ color: #666;
+
+ .register_link {
+ color: #1890ff;
+ font-weight: 500;
+
+ &:hover {
+ color: #40a9ff;
+ }
+ }
+ }
+ }
+
+ /* 底部联系栏 */
+ .user_footer {
+ background: #1890ff;
+ padding: 20px;
+ text-align: center;
+
+ .footer_content {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+
+ .contact {
+ color: #fff;
+ font-size: 14px;
+ }
+
+ .copyright {
+ color: rgba(255, 255, 255, 0.8);
+ font-size: 12px;
+ }
+ }
+ }
+}