Browse Source

科技项目开发

2023
chenshihai 2 years ago
parent
commit
a071f308a7
25 changed files with 3988 additions and 4 deletions
  1. +3
    -1
      templates/base/head_navbar.tmpl
  2. +3
    -1
      templates/base/head_navbar_fluid.tmpl
  3. +3
    -1
      templates/base/head_navbar_home.tmpl
  4. +3
    -1
      templates/base/head_navbar_pro.tmpl
  5. +5
    -0
      templates/tech/admin_view.tmpl
  6. +5
    -0
      templates/tech/create.tmpl
  7. +5
    -0
      templates/tech/repo_view.tmpl
  8. +5
    -0
      templates/tech/tech_view.tmpl
  9. +153
    -0
      web_src/vuepages/apis/modules/tech.js
  10. +211
    -0
      web_src/vuepages/pages/tech/adminview/index.vue
  11. +17
    -0
      web_src/vuepages/pages/tech/adminview/vp-tech-adminview.js
  12. +277
    -0
      web_src/vuepages/pages/tech/components/Filters.vue
  13. +157
    -0
      web_src/vuepages/pages/tech/components/PrjResultsItem.vue
  14. +888
    -0
      web_src/vuepages/pages/tech/components/PrjResultsList.vue
  15. +243
    -0
      web_src/vuepages/pages/tech/components/SciAndTechPrjItem.vue
  16. +885
    -0
      web_src/vuepages/pages/tech/components/SciAndTechPrjList.vue
  17. +179
    -0
      web_src/vuepages/pages/tech/components/SearchBar.vue
  18. +141
    -0
      web_src/vuepages/pages/tech/components/TopHeader.vue
  19. +99
    -0
      web_src/vuepages/pages/tech/components/TopMenu.vue
  20. +470
    -0
      web_src/vuepages/pages/tech/create/index.vue
  21. +17
    -0
      web_src/vuepages/pages/tech/create/vp-tech-create.js
  22. +92
    -0
      web_src/vuepages/pages/tech/repoview/index.vue
  23. +17
    -0
      web_src/vuepages/pages/tech/repoview/vp-tech-repoview.js
  24. +93
    -0
      web_src/vuepages/pages/tech/techview/index.vue
  25. +17
    -0
      web_src/vuepages/pages/tech/techview/vp-tech-techview.js

+ 3
- 1
templates/base/head_navbar.tmpl View File

@@ -55,7 +55,8 @@
{{/* <a class="item" href="{{AppSubUrl}}/explore/data_analysis">{{.i18n.Tr "explore.data_analysis"}}</a> */}}
<a class="item" href="{{AppSubUrl}}/kanban/index.html" target="_blank" rel="opener">{{.i18n.Tr "explore.data_analysis"}}</a>
{{end}}
<a class="item" href="{{AppSubUrl}}/OpenI">{{.i18n.Tr "custom.head.openi.repo"}}</a>
<a class="item" href="{{AppSubUrl}}/OpenI">{{.i18n.Tr "custom.head.openi.repo"}}</a>
<a class="item" href="{{AppSubUrl}}/tech/tech_view">2030科技项目</a>
</div>
</div>
{{else if .IsLandingPageHome}}
@@ -97,6 +98,7 @@
<a class="item" href="{{AppSubUrl}}/kanban/index.html" target="_blank" rel="opener">{{.i18n.Tr "explore.data_analysis"}}</a>
{{end}}
<a class="item" href="{{AppSubUrl}}/OpenI">{{.i18n.Tr "custom.head.openi.repo"}}</a>
<a class="item" href="{{AppSubUrl}}/tech/tech_view">2030科技项目</a>
</div>
</div>
{{else if .IsLandingPageExplore}}


+ 3
- 1
templates/base/head_navbar_fluid.tmpl View File

@@ -52,7 +52,8 @@
{{/* <a class="item" href="{{AppSubUrl}}/explore/data_analysis">{{.i18n.Tr "explore.data_analysis"}}</a> */}}
<a class="item" href="{{AppSubUrl}}/kanban/index.html" target="_blank" rel="opener">{{.i18n.Tr "explore.data_analysis"}}</a>
{{end}}
<a class="item" href="{{AppSubUrl}}/OpenI">{{.i18n.Tr "custom.head.openi.repo"}}</a>
<a class="item" href="{{AppSubUrl}}/OpenI">{{.i18n.Tr "custom.head.openi.repo"}}</a>
<a class="item" href="{{AppSubUrl}}/tech/tech_view">2030科技项目</a>
</div>
</div>
{{else if .IsLandingPageHome}}
@@ -92,6 +93,7 @@
<a class="item" href="{{AppSubUrl}}/kanban/index.html" target="_blank" rel="opener">{{.i18n.Tr "explore.data_analysis"}}</a>
{{end}}
<a class="item" href="{{AppSubUrl}}/OpenI">{{.i18n.Tr "custom.head.openi.repo"}}</a>
<a class="item" href="{{AppSubUrl}}/tech/tech_view">2030科技项目</a>
</div>
</div>
{{else if .IsLandingPageExplore}}


+ 3
- 1
templates/base/head_navbar_home.tmpl View File

@@ -44,7 +44,8 @@
{{/* <a class="item" href="{{AppSubUrl}}/explore/data_analysis">{{.i18n.Tr "explore.data_analysis"}}</a> */}}
<a class="item" href="{{AppSubUrl}}/kanban/index.html" target="_blank" rel="opener">{{.i18n.Tr "explore.data_analysis"}}</a>
{{end}}
<a class="item" href="{{AppSubUrl}}/OpenI">{{.i18n.Tr "custom.head.openi.repo"}}</a>
<a class="item" href="{{AppSubUrl}}/OpenI">{{.i18n.Tr "custom.head.openi.repo"}}</a>
<a class="item" href="{{AppSubUrl}}/tech/tech_view">2030科技项目</a>
</div>
</div>
{{else if .IsLandingPageHome}}
@@ -85,6 +86,7 @@
<a class="item" href="{{AppSubUrl}}/kanban/index.html" target="_blank" rel="opener">{{.i18n.Tr "explore.data_analysis"}}</a>
{{end}}
<a class="item" href="{{AppSubUrl}}/OpenI">{{.i18n.Tr "custom.head.openi.repo"}}</a>
<a class="item" href="{{AppSubUrl}}/tech/tech_view">2030科技项目</a>
</div>
</div>
{{else if .IsLandingPageExplore}}


+ 3
- 1
templates/base/head_navbar_pro.tmpl View File

@@ -54,7 +54,8 @@
{{/* <a class="item" href="{{AppSubUrl}}/explore/data_analysis">{{.i18n.Tr "explore.data_analysis"}}</a> */}}
<a class="item" href="{{AppSubUrl}}/kanban/index.html" target="_blank" rel="opener">{{.i18n.Tr "explore.data_analysis"}}</a>
{{end}}
<a class="item" href="{{AppSubUrl}}/OpenI">{{.i18n.Tr "custom.head.openi.repo"}}</a>
<a class="item" href="{{AppSubUrl}}/OpenI">{{.i18n.Tr "custom.head.openi.repo"}}</a>
<a class="item" href="{{AppSubUrl}}/tech/tech_view">2030科技项目</a>
</div>
</div>
{{else if .IsLandingPageHome}}
@@ -95,6 +96,7 @@
<a class="item" href="{{AppSubUrl}}/kanban/index.html" target="_blank" rel="opener">{{.i18n.Tr "explore.data_analysis"}}</a>
{{end}}
<a class="item" href="{{AppSubUrl}}/OpenI">{{.i18n.Tr "custom.head.openi.repo"}}</a>
<a class="item" href="{{AppSubUrl}}/tech/tech_view">2030科技项目</a>
</div>
</div>
{{else if .IsLandingPageExplore}}


+ 5
- 0
templates/tech/admin_view.tmpl View File

@@ -0,0 +1,5 @@
{{template "base/head_home" .}}
<link rel="stylesheet" href="{{StaticUrlPrefix}}/css/vp-tech-adminview.css?v={{MD5 AppVer}}" />
<div id="__vue-root"></div>
<script src="{{StaticUrlPrefix}}/js/vp-tech-adminview.js?v={{MD5 AppVer}}"></script>
{{template "base/footer" .}}

+ 5
- 0
templates/tech/create.tmpl View File

@@ -0,0 +1,5 @@
{{template "base/head_home" .}}
<link rel="stylesheet" href="{{StaticUrlPrefix}}/css/vp-tech-create.css?v={{MD5 AppVer}}" />
<div id="__vue-root"></div>
<script src="{{StaticUrlPrefix}}/js/vp-tech-create.js?v={{MD5 AppVer}}"></script>
{{template "base/footer" .}}

+ 5
- 0
templates/tech/repo_view.tmpl View File

@@ -0,0 +1,5 @@
{{template "base/head_home" .}}
<link rel="stylesheet" href="{{StaticUrlPrefix}}/css/vp-tech-repoview.css?v={{MD5 AppVer}}" />
<div id="__vue-root"></div>
<script src="{{StaticUrlPrefix}}/js/vp-tech-repoview.js?v={{MD5 AppVer}}"></script>
{{template "base/footer" .}}

+ 5
- 0
templates/tech/tech_view.tmpl View File

@@ -0,0 +1,5 @@
{{template "base/head_home" .}}
<link rel="stylesheet" href="{{StaticUrlPrefix}}/css/vp-tech-techview.css?v={{MD5 AppVer}}" />
<div id="__vue-root"></div>
<script src="{{StaticUrlPrefix}}/js/vp-tech-techview.js?v={{MD5 AppVer}}"></script>
{{template "base/footer" .}}

+ 153
- 0
web_src/vuepages/apis/modules/tech.js View File

@@ -0,0 +1,153 @@
/* 科技项目汇聚功能相关 */
import service from '../service';

// 新建申请页面科技项目查询接口 no-项目编号,name-科技项目名称,institution-参与单位
export const getTechs = (params) => {
return service({
url: '/api/v1/tech',
method: 'get',
params: params,
});
}

// 新建启智项目申请页面提交 url-启智项目地址,no-项目立项编号,institution-贡献单位,多个单位用逗号分隔
export const setOpenIApply = (data) => {
return service({
url: '/api/v1/tech/openi',
method: 'post',
data: data,
});
}

// 新建启智项目申请页面提交
// url-启智项目地址,uid-启智项目uid,repo_name-启智项目名称,topics-关键词,description-简介,
// no-项目立项编号,institution-贡献单位,多个单位用逗号分隔
export const setNoOpenIApply = (data) => {
return service({
url: '/api/v1/tech/no_openi',
method: 'post',
data: data,
});
}

// 新建非启智项目申请页面项目路径可选的用户和组织
// 返回 [{id:用户ID,name:用户名字,rel_avatar_link:用户图像地址,short_name:用户短名称},...]
export const getCreateRepoUser = () => {
return service({
url: '/api/v1/create_repo/user',
method: 'get',
params: {},
});
}

// 项目过滤信息列表-筛选信息 type=0查询科技项目页, type=1查询启智项目页
// 返回 {type_name:项目类型的名称, 字符串数组,institution_name:参与单位的名称,字符串数组,execute_year:执行年份,字符串数组,
// apply_year:申请年份,字符串数组,topic-关键词,字符串数组,project_name:科技项目名称,字符串数组}
export const getTechFilterInfo = (params) => {
return service({
url: '/api/v1/tech/filter',
method: 'get',
params: {
type: params.type,
},
});
}

// 按科技项目页查询功能
// 输入 name-科技项目名称,模糊匹配,type_name-项目类型的名称,精确匹配,institution_name-参与单位的名称,精确匹配,execute_year-执行年份,精确匹配,apply_year-申请年份,精确匹配,page,pageSize,sort
// 返回 {"total":10,"data":[{}]}
// data: {id:科技项目id,project_name:科技项目名称,institution:承担单位,all_institution:参与单位,apply_year:申报年份,execute_period:执行周期,repo_numer:项目成果数,repo:[]项目信息数组}
export const getTechSearch = (params) => {
return service({
url: '/api/v1/tech/search',
method: 'get',
params: params,
});
}

// 按启智项目页查询功能
// 输入 name-项目名称,模糊匹配,tech_name-科技项目名称,精确匹配,institution_name-参与单位的名称,精确匹配,topic-关键词,精确匹配,page,pageSize,sort
// 返回 {"total":10,"data":[{}]}
// data: {id:项目id,owner_id:项目拥有者id,name:项目名称,alias:项目别名,topics:关键词 字符串数组,description:项目简介,updated_unix:最后更新时间,institution:贡献单位}
export const getTechOpenISearch = (params) => {
return service({
url: '/api/v1/tech/repo_search',
method: 'get',
params: params,
});
}

// 后台管理项目列表
// 输入 page,pageSize
// 返回 {"total":10,"data":[{}]}
// data: {id:记录的id,name:启智项目名称,owner_name:启智项目拥有者名称,tech_name:科技项目名称,tech_number:科技项目编号,institution:项目承担单位,
// execute_period:执行周期,contact:联系人,contact_phone:联系电话,contact_email:联系邮件,apply_user:申请账号,status:状态}
export const getTechAdminList = (params) => {
return service({
url: '/api/v1/tech/admin',
method: 'get',
params: params,
});
}

// 后台管理项目列表交互(显示或隐藏)
// 输入 type-show/hide,id:[1,2,3]
// 返回 { code:0, message:"" }
export const setTechAdminOperation = (data) => {
return service({
url: `/api/v1/tech/admin/action/${data.type}`,
method: 'post',
data: data.id,
});
}

// 后台管理科技项目编号基本信息导入功能(科技项目管理员有权限)
// 输入 form file
export const setTechImportExcel = () => {
return service({
url: `/api/v1/tech/basic`,
method: 'post',
data: {},
});
}

// 增加科技项目管理员(管理员才有权限)
// 输入 name:['111', '222']
// 返回 { code:0, message:"" }
export const setTechAdminAdd = (data) => {
return service({
url: '/api/v1/tech/admin_add',
method: 'post',
data: data,
});
}

// 判断是否是科技项目管理员
// 输入 name:['111', '222']
export const getIsTechAdmin = () => {
return service({
url: '/api/v1/tech/is_admin',
method: 'get',
params: {},
});
}

// =========================================================
// 搜索Topics q-topic
// 返回 {topics: [{id,repo_count,topic_name,created,updated}]}
export const getTopics = (params) => {
return service({
url: '/api/v1/topics/search',
method: 'get',
params: params,
});
}

// 检测 repo name q:名称, owner:所属者
export const getCheckRepoName = (params) => {
return service({
url: '/repo/check_name',
method: 'get',
params: params,
});
}

+ 211
- 0
web_src/vuepages/pages/tech/adminview/index.vue View File

@@ -0,0 +1,211 @@
<template>
<div>
<div class="ui container">
<div class="top-container">
<el-checkbox class="check-toggle" v-model="allChecked" @change="allSelectChange">全选/全不选</el-checkbox>
<el-button class="btn-agree">批量同意展示</el-button>
<el-button class="btn-cancel">批量取消展示</el-button>
</div>
<div class="table-container">
<div class="table-title">2030科技项目管理</div>
<div class="table-wrap">
<el-table ref="tableRef" border :data="tableData" style="width:100%;" v-loading="loading" stripe row-key="id">
<el-table-column label="" align="center" header-align="center" width="40" fixed>
<template slot-scope="scope">
<el-checkbox v-model="scope.row.checked" @change="rowSelectChange(scope.row)"></el-checkbox>
</template>
</el-table-column>
<el-table-column prop="name" label="启智项目名称" align="center" header-align="center" fixed></el-table-column>
<el-table-column prop="tech_name" label="科技项目名称" align="center" header-align="center"
fixed></el-table-column>
<el-table-column prop="status" label="展示状态" align="center" header-align="center" fixed></el-table-column>
<el-table-column prop="tech_number" label="项目立项编号" align="center" header-align="center"></el-table-column>
<el-table-column prop="institution" label="项目承担单位" align="center" header-align="center"></el-table-column>
<el-table-column prop="execute_period" label="执行周期" align="center" header-align="center"></el-table-column>
<el-table-column prop="contact" label="联系人" align="center" header-align="center"></el-table-column>
<el-table-column prop="contact_phone" label="电话" align="center" header-align="center"></el-table-column>
<el-table-column prop="apply_user" label="申请账号" align="center" header-align="center"></el-table-column>
<el-table-column prop="" label="操作" align="center" header-align="center" fixed="right"></el-table-column>
</el-table>
</div>
<div class="center">
<el-pagination ref="paginationRef" background @current-change="currentChange" @size-change="sizeChange"
:current-page.sync="page" :page-sizes="pageSizes" :page-size.sync="pageSize"
layout="total, sizes, prev, pager, next, jumper" :total="total">
</el-pagination>
</div>
</div>
</div>
</div>
</template>

<script>
import { getTechAdminList, setTechAdminOperation } from '~/apis/modules/tech';

export default {
data() {
return {
allChecked: false,
loading: false,
tableData: [],

page: 1,
pageSizes: [15, 30, 50, 100],
pageSize: 50,
total: 0,
};
},
components: {},
methods: {
getData() {
this.loading = true;
getTechAdminList({
page: this.page,
pageSize: this.pageSize,
}).then(res => {
this.loading = false;
const { total, data } = res.data;
this.tableData = data.map((item, index) => {
return {
checked: false,
id: 'id' + Math.random(),
...item,
}
});
this.total = total;
}).catch(err => {
this.loading = false;
console.log(err);
});
},
allSelectChange() {
for (let i = 0, iLen = this.tableData.length; i < iLen; i++) {
this.tableData[i].checked = this.allChecked;
}
this.tableData.splice(1, 0);
},
rowSelectChange(row) {
if (row.checked == false) {
this.allChecked = false;
} else {
if (this.tableData.filter((item) => item.checked).length == this.tableData.length) {
this.allChecked = true;
}
}
this.tableData.splice(1, 0);
},
currentChange(page) {
this.page = page;
this.getData();
},
sizeChange(pageSize) {
this.pageSize = pageSize;
this.getData();
},
},
beforeMount() {

},
mounted() {
this.tableData = new Array(15).fill(0).map((item, index) => {
return {
id: '记录的id-' + index,
name: '启智项目名称-' + index,
owner_name: '启智项目拥有者名称-' + index,
tech_name: '科技项目名称-' + index,
tech_number: '科技项目编号-' + index,
institution: '项目承担单位-' + index,
execute_period: '执行周期-' + index,
contact: '联系人-' + index,
contact_phone: '联系电话-' + index,
contact_email: '联系邮件-' + index,
apply_user: '申请账号-' + index,
status: '状态-' + index,
}
});
this.total = this.tableData.length;
},
beforeDestroy() { },
};
</script>

<style scoped lang="less">
.top-container {
display: flex;
align-items: center;
margin: 15px 0;

.check-toggle {
margin-right: 20px;
}

.btn-agree {
margin-right: 10px;
background: rgb(50, 145, 248);
color: rgb(255, 255, 255);

&:hover {
opacity: 0.9;
}

&:active {
opacity: 0.8;
}
}

.btn-cancel {
margin-right: 10px;
background: rgb(250, 140, 22);
color: rgb(255, 255, 255);

&:hover {
opacity: 0.9;
}

&:active {
opacity: 0.8;
}
}
}

.table-container {
.table-title {
height: 43px;
font-size: 16px;
font-weight: 700;
padding: 15px;
color: rgb(16, 16, 16);
border-color: rgb(212, 212, 213);
border-width: 1px;
border-style: solid;
border-radius: 5px 5px 0px 0px;
background: rgb(240, 240, 240);
display: flex;
align-items: center;
}

.table-wrap {
margin-bottom: 12px;
overflow-x: auto;

/deep/ .el-table__header {
th {
background: rgb(249, 249, 249);
font-size: 12px;
color: rgb(136, 136, 136);
font-weight: normal;
}
}

/deep/ .el-table__body {
td {
font-size: 12px;
}
}

/deep/ .el-radio__label {
display: none;
}
}
}
</style>

+ 17
- 0
web_src/vuepages/pages/tech/adminview/vp-tech-adminview.js View File

@@ -0,0 +1,17 @@
import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import localeEn from 'element-ui/lib/locale/lang/en';
import localeZh from 'element-ui/lib/locale/lang/zh-CN';
import { i18n, lang } from '~/langs';
import App from './index.vue';

Vue.use(ElementUI, {
locale: lang === 'zh-CN' ? localeZh : localeEn,
size: 'small',
});

new Vue({
i18n,
render: (h) => h(App),
}).$mount('#__vue-root');

+ 277
- 0
web_src/vuepages/pages/tech/components/Filters.vue View File

@@ -0,0 +1,277 @@
<template>
<div>
<div class="filter-main" v-show="!showSecond">
<div class="filter-c" v-for="(item, index) in mainData">
<div class="filter-title">{{ item.title }}</div>
<div class="filter-item-c">
<div class="filter-item" v-for="(_item, _index) in item.showData" @click="changeFilter(item, _item)"
:style="conds[item.key] == _item ? { backgroundColor: item.focusBgColor, color: item.focusColor } : { backgroundColor: item.bgColor, color: item.color }">
{{ _item }}
</div>
</div>
<div class="filter-view-more-c" v-if="item.data.length > item.showMaxLen">
<span class="filter-view-more" @click="goMore(item)">
<i class="el-icon-arrow-down"></i><span>展开更多</span>
</span>
</div>
</div>
</div>
<div class="filter-second" v-show="showSecond">
<div class="filter-second-hd">
<span class="filter-second-go-back" @click="goBack()">
<i class="el-icon-back"></i><span>返回上一级</span>
</span>
</div>
<div class="filter-title">{{ secondData.title }}</div>
<div class="filter-item-c">
<div class="filter-item" v-for="(_item, _index) in secondData.data" @click="changeFilter(secondData, _item)"
:style="conds[secondData.key] == _item ? { backgroundColor: secondData.focusBgColor, color: secondData.focusColor } : { backgroundColor: secondData.bgColor, color: secondData.color }">
{{ _item }}
</div>
</div>
</div>
</div>
</template>

<script>
import { getTechFilterInfo } from '~/apis/modules/tech';

export default {
name: "Filters",
props: {
type: { type: Number, default: -1 }, // 0-tech_view, 1-repo_view
condition: { type: Object, default: () => ({}) },
},
components: {},
data() {
return {
list_tech: [{
title: '项目类型',
key: 'type_name',
bgColor: 'rgb(237, 234, 251)',
color: 'rgb(100, 59, 159)',
focusBgColor: 'rgb(100, 59, 159)',
focusColor: 'rgb(255, 255, 255)',
data: [],
showData: [],
showMaxLen: 6,
}, {
title: '项目参与单位',
key: 'institution_name',
bgColor: 'rgb(234, 241, 251)',
color: 'rgb(18, 76, 157)',
focusBgColor: 'rgb(18, 76, 157)',
focusColor: 'rgb(255, 255, 255)',
data: [],
showData: [],
showMaxLen: 10,
}, {
title: '执行周期包含年份',
key: 'execute_year',
bgColor: 'rgb(225, 242, 234)',
color: 'rgb(8, 96, 96)',
focusBgColor: 'rgb(8, 96, 96)',
focusColor: 'rgb(255, 255, 255)',
data: [],
showData: [],
showMaxLen: 10,
}, {
title: '申报年份',
key: 'apply_year',
bgColor: 'rgb(231, 249, 222)',
color: 'rgb(55, 94, 2)',
focusBgColor: 'rgb(55, 94, 2)',
focusColor: 'rgb(255, 255, 255)',
data: [],
showData: [],
showMaxLen: 10,
}],
list_repo: [{
title: '关键词',
key: 'topic',
bgColor: 'rgb(234, 250, 251)',
color: 'rgb(0, 167, 132)',
focusBgColor: 'rgb(0, 167, 132)',
focusColor: 'rgb(255, 255, 255)',
data: [],
showData: [],
showMaxLen: 10,
}, {
title: '所属科技项目',
key: 'project_name',
bgColor: 'rgb(234, 245, 251)',
color: 'rgb(8, 0, 148)',
focusBgColor: 'rgb(8, 0, 148)',
focusColor: 'rgb(255, 255, 255)',
data: [],
showData: [],
showMaxLen: 10,
}, {
title: '成果贡献单位',
key: 'institution_name',
bgColor: 'rgb(234, 241, 251)',
color: 'rgb(18, 76, 157)',
focusBgColor: 'rgb(18, 76, 157)',
focusColor: 'rgb(255, 255, 255)',
data: [],
showData: [],
showMaxLen: 10,
},
],
conds: {
type_name: '',
institution_name: '',
execute_year: '',
apply_year: '',

topic: '',
project_name: '',
},
mainData: [],
showSecond: false,
secondData: {},
};
},
methods: {
goMore(item) {
this.secondData = item;
this.showSecond = true;
},
goBack() {
this.showSecond = false;
},
changeFilter(item, _item) {
const value = this.conds[item.key] == _item ? '' : _item;
this.$emit('changeCondition', {
[item.key]: value
});
}
},
watch: {
condition: {
handler(newVal) {
console.log('Filters:watch:condition', newVal);
this.conds.type_name = newVal.type_name || '';
this.conds.institution_name = newVal.institution_name || '';
this.conds.execute_year = newVal.execute_year || '';
this.conds.apply_year = newVal.apply_year || '';

this.conds.topic = newVal.topic || '';
this.conds.project_name = newVal.project_name || '';
},
immediate: true,
deep: true,
},
},
beforeMount() {
if (this.type == 0) {
this.mainData = this.list_tech;
} else if (this.type == 1) {
this.mainData = this.list_repo;
}
const data = {
type_name: ['基础前沿', '应用示范研究', '重大共性关键技术', '其他', '基础前沿1', '基础前沿2', '基础前沿3', '基础前沿4', '基础前沿5'],
institution_name: ['北京大学', '北京工业大学', '北京航空航天大学', '北京交通大学', '清华大学'],
execute_year: ['2019', '2020', '2021', '2022', '2023'],
apply_year: ['2018', '2019', '2020', '2021', '2022'],
topic: ['数据库', '操作系统', '云计算', '大数据', '数据可视化', '其他'],
project_name: ['新一代神经网络模型', '小样本条件下的自适应机器学习理论', '面向复杂数据处理的新型神经网络模型'],
}
for (let i = 0, iLen = this.mainData.length; i < iLen; i++) {
const filterItem = this.mainData[i];
const key = filterItem.key;
const max = filterItem.showMaxLen;
if (data[key]) {
filterItem.data = data[key];
filterItem.showData = data[key].slice(0, max);
if (this.conds[key] && filterItem.showData.indexOf(this.conds[key]) < 0) {
filterItem.showData.push(this.conds[key]);
}
}
}
return;
getTechFilterInfo({
type: this.type,
}).then(res => {
console.log(res);
}).catch(err => {
console.log(err);
});
},
mounted() { },
};
</script>

<style scoped lang="less">
.filter-c {
margin-bottom: 32px;

.filter-title {
font-size: 18px;
color: rgb(16, 16, 16);
margin: 14px 0;
}

.filter-item-c {
display: flex;
flex-wrap: wrap;

.filter-item {
border-radius: 3px;
padding: 3px 10px;
margin-right: 10px;
margin-bottom: 10px;
cursor: pointer;
}
}

.filter-view-more-c {
margin-top: 6px;

.filter-view-more {
color: rgb(50, 145, 248);
font-size: 14px;
cursor: pointer;

i {
margin-right: 4px;
}
}
}
}

.filter-second {
.filter-second-hd {
margin: 14px 0 24px 0;

.filter-second-go-back {
color: rgb(50, 145, 248);
font-size: 14px;
cursor: pointer;

i {
margin-right: 4px;
}
}
}

.filter-title {
font-size: 18px;
color: rgb(16, 16, 16);
margin: 14px 0;
}

.filter-item-c {
display: flex;
flex-wrap: wrap;

.filter-item {
border-radius: 3px;
padding: 3px 10px;
margin-right: 10px;
margin-bottom: 10px;
cursor: pointer;
}
}
}
</style>

+ 157
- 0
web_src/vuepages/pages/tech/components/PrjResultsItem.vue View File

@@ -0,0 +1,157 @@
<template>
<div class="item">
<div class="title-c">
<div class="avatar-c">
<img v-if="data.RelAvatarLink" class="avatar" :src="data.RelAvatarLink" />
<img v-else class="avatar" :avatar="data.OwnerName" />
</div>
<div class="title">
<span>{{ data.Alias }}</span>
</div>
</div>
<div class="descr">
{{ data.Description }}
</div>
<div class="topics">
<a v-for="(item, index) in data.Topics" :key="index" class="topic"
:href="`/explore/repos?q=&topic=${item.topic}&sort=hot`">{{ item }}</a>
</div>
<div class="footer">
<div class="contractor">鹏城实验室</div>
<div class="update-time">
<span>{{ $t('repos.updated') }}</span>
<el-tooltip effect="dark" :content="dateFormat(data.UpdatedUnix)" placement="top-start">
<span>{{ calcFromNow(data.UpdatedUnix) }}</span>
</el-tooltip>
</div>
</div>
</div>
</template>

<script>
import dayjs from 'dayjs';
import { lang } from '~/langs';
import { timeSinceUnix } from '~/utils';

export default {
name: "PrjResultsItem",
props: {
data: { type: Object, default: () => ({}) },
},
components: {},
data() {
return {

};
},
methods: {
calcFromNow(unix) {
return timeSinceUnix(unix, Date.now() / 1000);
},
dateFormat(unix) {
return lang == 'zh-CN' ? dayjs(unix * 1000).format('YYYY年MM月DD日 HH时mm分ss秒') :
dayjs(unix * 1000).format('ddd, D MMM YYYY HH:mm:ss [CST]');
}
},
mounted() { },
};
</script>

<style scoped lang="less">
.item {
border-color: rgb(232, 224, 236);
border-width: 1px;
border-style: solid;
box-shadow: rgba(168, 157, 226, 0.2) 0px 5px 10px 0px;
background: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20version%3D%221.1%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%221%22%20x1%3D%220%22%20x2%3D%221%22%20y1%3D%220%22%20y2%3D%220%22%20gradientTransform%3D%22matrix(-0.01900000000000005%2C%200.997%2C%20-0.12862587255310284%2C%20-0.01900000000000005%2C%200.995%2C%200.014)%22%3E%3Cstop%20stop-color%3D%22%23f2edf5%22%20stop-opacity%3D%221%22%20offset%3D%220.01%22%3E%3C%2Fstop%3E%3Cstop%20stop-color%3D%22%23ffffff%22%20stop-opacity%3D%221%22%20offset%3D%220.31%22%3E%3C%2Fstop%3E%3C%2FlinearGradient%3E%3C%2Fdefs%3E%3Crect%20width%3D%22100%25%22%20height%3D%22100%25%22%20fill%3D%22url(%231)%22%3E%3C%2Frect%3E%3C%2Fsvg%3E");
overflow: hidden;
padding: 15px;
}

.title-c {
display: flex;
align-items: center;

.avatar-c {
height: 28px;
width: 28px;
margin-right: 6px;

img {
border-radius: 100%;
height: 100%;
width: 100%;
}
}

.title {
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;

span {
color: rgb(16, 16, 16);
font-size: 16px;
font-weight: 400;
}
}
}

.descr {
height: 40px;
margin-top: 8px;
font-size: 12px;
font-weight: 300;
color: rgb(136, 136, 136);
text-overflow: ellipsis;
word-break: break-all;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
max-height: 41px;
overflow: hidden;
}

.topics {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin-top: 5px;
height: 20px;

.topic {
color: rgba(16, 16, 16, 0.8);
border-radius: 4px;
font-size: 12px;
background: rgba(232, 232, 232, 0.6);
padding: 2px 6px;
margin-right: 8px;
}
}

.footer {
margin-top: 12px;
display: flex;
align-items: center;
justify-content: space-between;
height: 20px;

.contractor {
font-size: 14px;
font-weight: 400;
color: rgba(0, 40, 192, 0.73);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}

.update-time {
text-align: right;
min-width: 140px;
font-size: 12px;
font-weight: 300;
color: rgb(136, 136, 136);
}
}
</style>

+ 888
- 0
web_src/vuepages/pages/tech/components/PrjResultsList.vue View File

@@ -0,0 +1,888 @@
<template>
<div class="list-container">
<div class="list-item-container" style="min-height:540px;" v-loading="loading">
<div class="item-container" v-for="(item, index) in list" :key="item.ID">
<PrjResultsItem :data="item"></PrjResultsItem>
</div>
<div v-show="(!list.length && !loading)" class="no-data">{{ $t('repos.noReposfound') }}</div>
</div>
<div class="center">
<el-pagination ref="paginationRef" background @current-change="currentChange" @size-change="sizeChange"
:current-page.sync="iPage" :page-sizes="iPageSizes" :page-size.sync="iPageSize"
layout="total, sizes, prev, pager, next, jumper" :total="total">
</el-pagination>
</div>
</div>
</template>

<script>
import PrjResultsItem from './PrjResultsItem.vue';
import LetterAvatar from '~/utils/letteravatar';

export default {
name: "PrjResultsList",
props: {
q: { type: String, default: '' },
page: { type: Number, default: 1 },
pageSize: { type: Number, default: 15 },
pageSizes: { type: Array, default: () => [15, 30, 50] }
},
components: { PrjResultsItem },
data() {
return {
loading: false,
list: [
{
"ID": 4781,
"OwnerID": 679,
"OwnerName": "OpenI",
"LowerName": "msadapter",
"Name": "MSAdapter",
"Alias": "MSAdapter",
"NumWatches": 3,
"NumStars": 0,
"NumForks": 0,
"Description": "MindSpore对PyTorch接口的支持工具",
"Topics": null,
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1669691488,
"UpdatedUnix": 1670839285,
"PrimaryLanguage": null,
"RelAvatarLink": "",
"Contributors": [
{
"RelAvatarLink": "/user/avatar/wjtest1207/-1?18",
"UserName": "wjtest1207",
"Email": "wjtest1207@163.com",
"CommitCnt": 1
}
],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 501,
"OwnerID": 224,
"OwnerName": "OpenIOSSG",
"LowerName": "promote",
"Name": "promote",
"Alias": "promote",
"NumWatches": 1,
"NumStars": 0,
"NumForks": 0,
"Description": "",
"Topics": null,
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1642470476,
"UpdatedUnix": 1670256276,
"PrimaryLanguage": {
"ID": 724,
"RepoID": 501,
"CommitID": "2fd3316bcf89250f80b0d1f6a05cb2c69fdb2845",
"IsPrimary": true,
"Language": "Markdown",
"Percentage": 100,
"Color": "#cccccc",
"CreatedUnix": 1642470477
},
"RelAvatarLink": "",
"Contributors": [],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 696,
"OwnerID": 679,
"OwnerName": "OpenI",
"LowerName": "octopus",
"Name": "octopus",
"Alias": "octopus",
"NumWatches": 3,
"NumStars": 1,
"NumForks": 0,
"Description": "面向多计算场景的一站式融合计算平台",
"Topics": [
"openi",
"deep-learning",
"golang"
],
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1647933529,
"UpdatedUnix": 1670899396,
"PrimaryLanguage": {
"ID": 1018,
"RepoID": 696,
"CommitID": "70699543cc3bf19f70ee7b126b27b752b0577469",
"IsPrimary": true,
"Language": "CSS",
"Percentage": 36.5,
"Color": "#563d7c",
"CreatedUnix": 1647933538
},
"RelAvatarLink": "/repo-avatars/696-c9d9105eba8ad76589b65edff1588bc5",
"Contributors": [
{
"RelAvatarLink": "",
"UserName": "",
"Email": "2522636547@qq.com",
"CommitCnt": 253
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "835952234@qq.com",
"CommitCnt": 203
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "linfj@pcl.ac.cn",
"CommitCnt": 174
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "hackmong@163.com",
"CommitCnt": 121
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "liaowsh@pcl.ac.cn",
"CommitCnt": 114
},
{
"RelAvatarLink": "/user/avatar/liwei_test/-1?25",
"UserName": "liwei_test",
"Email": "liw03@pcl.ac.cn",
"CommitCnt": 88
}
],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 697,
"OwnerID": 679,
"OwnerName": "OpenI",
"LowerName": "paddle",
"Name": "Paddle",
"Alias": "Paddle",
"NumWatches": 3,
"NumStars": 0,
"NumForks": 0,
"Description": "PaddlePaddle (PArallel Distributed Deep LEarning) 是一个简单易用、高效灵活、可扩展的深度学习平台,最初由百度科学家和工程师共同开发,目的是将深度学习技术应用到百度的众多产品中。",
"Topics": [
"ai开发工具",
"deep-learning"
],
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1647933857,
"UpdatedUnix": 1670838791,
"PrimaryLanguage": {
"ID": 1021,
"RepoID": 697,
"CommitID": "c46e661dfd4dca4ccb2d8bb83225d2dcb0bff52c",
"IsPrimary": true,
"Language": "Python",
"Percentage": 45.9,
"Color": "#3572A5",
"CreatedUnix": 1647933890
},
"RelAvatarLink": "/repo-avatars/697-c50e829c78c6c3168605586c750887e4",
"Contributors": [
{
"RelAvatarLink": "",
"UserName": "",
"Email": "yuyang18@baidu.com",
"CommitCnt": 2039
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "luotao02@baidu.com",
"CommitCnt": 1101
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "fengjiayi@baidu.com",
"CommitCnt": 864
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "qiaolongfei@baidu.com",
"CommitCnt": 1456
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "tangjian03@baidu.com",
"CommitCnt": 730
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "panxin.grad@gmail.com",
"CommitCnt": 678
}
],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 702,
"OwnerID": 679,
"OwnerName": "OpenI",
"LowerName": "tensorlayerx",
"Name": "TensorLayerX",
"Alias": "TensorLayerX",
"NumWatches": 3,
"NumStars": 0,
"NumForks": 0,
"Description": "TensorLayer3.0一款兼容多深度学习框架后端的深度学习库, 目前可以用TensorFlow、MindSpore、PaddlePaddle作为后端计算引擎。",
"Topics": [
"openi-paper",
"pytorch",
"标签aaa",
"paddlepaddle",
"test-abcdefghijklmno测-试-123456",
"tensorflow",
"mindspore",
"高层次库",
"深度学习",
"支持多计算后端"
],
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1647935532,
"UpdatedUnix": 1671012469,
"PrimaryLanguage": {
"ID": 1039,
"RepoID": 702,
"CommitID": "6eafa9118008338521d3d085d70627b37ccba51d",
"IsPrimary": true,
"Language": "Python",
"Percentage": 99.6,
"Color": "#3572A5",
"CreatedUnix": 1647935549
},
"RelAvatarLink": "/repo-avatars/702-a18a6669062a1a24aea776744c003f34",
"Contributors": [
{
"RelAvatarLink": "",
"UserName": "",
"Email": "dhsig552@163.com",
"CommitCnt": 1598
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "luo.mai.cs@gmail.com",
"CommitCnt": 203
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "37874862+warshallrho@users.noreply.github.com",
"CommitCnt": 130
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "jingqing.zhang15@imperial.ac.uk",
"CommitCnt": 129
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "rundi_wu@pku.edu.cn",
"CommitCnt": 159
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "lg4869@outlook.com",
"CommitCnt": 67
}
],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 4780,
"OwnerID": 218,
"OwnerName": "PCL-Platform.Intelligence",
"LowerName": "pcl_pangu",
"Name": "pcl_pangu",
"Alias": "pcl_pangu",
"NumWatches": 1,
"NumStars": 0,
"NumForks": 0,
"Description": "鹏程·盘古SDK 上线!集成了鹏程·盘古alpha模型、增强版Evolution模型、多语言mPangu模型,欢迎测试和使用。希望鹏程·盘古模型的可持续学习与应用生态快速发展!",
"Topics": [
"大模型"
],
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1669691367,
"UpdatedUnix": 1670921009,
"PrimaryLanguage": null,
"RelAvatarLink": "/repo-avatars/4780-5b45386c19f3e34b4749e6dde7dc3181",
"Contributors": [
{
"RelAvatarLink": "/user/avatar/wjtest1207/-1?40",
"UserName": "wjtest1207",
"Email": "wjtest1207@163.com",
"CommitCnt": 1
}
],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 4405,
"OwnerID": 585,
"OwnerName": "arXiv_Computation_and_Language_2019",
"LowerName": "paddlenlp",
"Name": "PaddleNLP",
"Alias": "PaddleNLP",
"NumWatches": 1,
"NumStars": 0,
"NumForks": 0,
"Description": "",
"Topics": null,
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1667453897,
"UpdatedUnix": 1670256902,
"PrimaryLanguage": null,
"RelAvatarLink": "",
"Contributors": [],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 4127,
"OwnerID": 507,
"OwnerName": "international_conference_on_machine_learning",
"LowerName": "fairseq",
"Name": "fairseq",
"Alias": "fairseq",
"NumWatches": 1,
"NumStars": 0,
"NumForks": 0,
"Description": "",
"Topics": null,
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1667442805,
"UpdatedUnix": 1670256623,
"PrimaryLanguage": {
"ID": 6206,
"RepoID": 4127,
"CommitID": "b8ac3fa6cc95f9dc97085232d4faf125e5bcd2e7",
"IsPrimary": true,
"Language": "Python",
"Percentage": 97.8,
"Color": "#3572A5",
"CreatedUnix": 1667443078
},
"RelAvatarLink": "",
"Contributors": [],
"IsPrivate": false,
"IsFork": false,
"IsMirror": true,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 2176,
"OwnerID": 536,
"OwnerName": "openi_paper",
"LowerName": "paddledetection",
"Name": "PaddleDetection",
"Alias": "PaddleDetection",
"NumWatches": 1,
"NumStars": 0,
"NumForks": 0,
"Description": "",
"Topics": null,
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1666872337,
"UpdatedUnix": 1670257237,
"PrimaryLanguage": null,
"RelAvatarLink": "",
"Contributors": [],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 4619,
"OwnerID": 536,
"OwnerName": "openi_paper",
"LowerName": "fairseq",
"Name": "fairseq",
"Alias": "fairseq",
"NumWatches": 1,
"NumStars": 0,
"NumForks": 0,
"Description": "",
"Topics": null,
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1667461670,
"UpdatedUnix": 1670256376,
"PrimaryLanguage": null,
"RelAvatarLink": "",
"Contributors": [],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 598,
"OwnerID": 251,
"OwnerName": "PCL_AutoML",
"LowerName": "xbbo",
"Name": "XBBO",
"Alias": "XBBO",
"NumWatches": 1,
"NumStars": 0,
"NumForks": 0,
"Description": "超参搜索(黑盒优化)框架",
"Topics": [
"openi-paper",
"自动机器学习",
"优化",
"超参搜索"
],
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1645065667,
"UpdatedUnix": 1671012526,
"PrimaryLanguage": {
"ID": 842,
"RepoID": 598,
"CommitID": "bb089a69ce3541246a948c08bd37e31ab23e439c",
"IsPrimary": true,
"Language": "Python",
"Percentage": 98.7,
"Color": "#3572A5",
"CreatedUnix": 1645065672
},
"RelAvatarLink": "/repo-avatars/598-5c870fdbde9a0457989616263b77c63c",
"Contributors": [
{
"RelAvatarLink": "",
"UserName": "",
"Email": "isleizhang@outlook.com",
"CommitCnt": 103
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "mathcoder.zl@gmail.com",
"CommitCnt": 10
}
],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 999,
"OwnerID": 431,
"OwnerName": "GAMMALab",
"LowerName": "openhgnn",
"Name": "OpenHGNN",
"Alias": "OpenHGNN",
"NumWatches": 1,
"NumStars": 0,
"NumForks": 2,
"Description": "OpenHGNN是由北邮GAMMA Lab开发的基于PyTorch和DGL的开源异质图神经网络工具包。",
"Topics": [
"openi-paper",
"pytorch",
"dgl",
"heterogeneous",
"异质图",
"gnn",
"图神经网络"
],
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1659322878,
"UpdatedUnix": 1671012520,
"PrimaryLanguage": null,
"RelAvatarLink": "",
"Contributors": [
{
"RelAvatarLink": "/user/avatar/wjtest001/-1?56",
"UserName": "wjtest001",
"Email": "towangjing@yeah.net",
"CommitCnt": 1
}
],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 703,
"OwnerID": 679,
"OwnerName": "OpenI",
"LowerName": "apulis-ai-platform",
"Name": "Apulis-AI-Platform",
"Alias": "Apulis-AI-Platform",
"NumWatches": 3,
"NumStars": 2,
"NumForks": 0,
"Description": "依瞳人工智能平台旨在为不同行业的用户提供基于深度学习的端到端解决方案,使用户可以用最快的速度、最少的时间开始高性能的深度学习工作,从而大幅节省研究成本、提高研发效率,同时可为中小企业解决私有云难建成、成本高等问题。 平台融合了Tensorflow、PyTorch、MindSpore等开源深度学习框架,提供了模型训练、超参调优、集群状态监控等开发环境,方便AI开发者快速搭建人工智能开发环境,开展AI开发应用。在监控模块基础上搭建预警模块,自动将平台异常通知管理员,提升平台的预警效率及安全性能。",
"Topics": [
"ai开发工具",
"openi-paper"
],
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1647935724,
"UpdatedUnix": 1671012418,
"PrimaryLanguage": {
"ID": 1054,
"RepoID": 703,
"CommitID": "18a76ed026dfa5a1e71a74f3518e9ba6f830d77f",
"IsPrimary": true,
"Language": "JavaScript",
"Percentage": 57.4,
"Color": "#f1e05a",
"CreatedUnix": 1647935738
},
"RelAvatarLink": "",
"Contributors": [
{
"RelAvatarLink": "",
"UserName": "",
"Email": "869071540@qq.com",
"CommitCnt": 1103
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "jinlmsft@hotmail.com",
"CommitCnt": 745
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "hongzhi.li@microsoft.com",
"CommitCnt": 504
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "xjhan1995@gmail.com",
"CommitCnt": 399
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "hongzhili@users.noreply.github.com",
"CommitCnt": 377
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "xudifsd@gmail.com",
"CommitCnt": 251
}
],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 695,
"OwnerID": 679,
"OwnerName": "OpenI",
"LowerName": "cubeai",
"Name": "cubeai",
"Alias": "cubeai",
"NumWatches": 3,
"NumStars": 3,
"NumForks": 0,
"Description": "CubeAI智立方是中国联通研究院自主研发的集AI模型自动化服务封装、发布、共享、部署和能力开放等功能于一体的开源AI算能服务平台,其核心作用在于打通AI模型开发至实际生产应用之间的壁垒,加速AI创新和应用进程,促进AI应用从设计、开发直到部署、运营整个生命周期的自动化快速迭代和演进。",
"Topics": [
"ai开发工具",
"openi",
"ai模型服务化",
"ai模型共享",
"ai模型部署",
"ai能力开放"
],
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1647933184,
"UpdatedUnix": 1670838880,
"PrimaryLanguage": {
"ID": 1006,
"RepoID": 695,
"CommitID": "09e1a0146612cff32fb01881707c831414494599",
"IsPrimary": true,
"Language": "Shell",
"Percentage": 96.8,
"Color": "#89e051",
"CreatedUnix": 1647933187
},
"RelAvatarLink": "/repo-avatars/695-5d57aff010bceee7d1634ea64ca6a298",
"Contributors": [
{
"RelAvatarLink": "",
"UserName": "",
"Email": "huolongshe@126.com",
"CommitCnt": 15
}
],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 595,
"OwnerID": 251,
"OwnerName": "PCL_AutoML",
"LowerName": "xnas",
"Name": "XNAS",
"Alias": "XNAS",
"NumWatches": 1,
"NumStars": 0,
"NumForks": 0,
"Description": "神经网络结构搜索框架",
"Topics": [
"openi-paper",
"自动机器学习",
"automl",
"神经网络结构搜索"
],
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1645065509,
"UpdatedUnix": 1671012496,
"PrimaryLanguage": {
"ID": 838,
"RepoID": 595,
"CommitID": "2c54ceb09b255cbcabd67f3c39fc777c4b2403f4",
"IsPrimary": true,
"Language": "Python",
"Percentage": 100,
"Color": "#3572A5",
"CreatedUnix": 1645065513
},
"RelAvatarLink": "/repo-avatars/595-4284a9fbc95ba42b7753910d8fcd1828",
"Contributors": [
{
"RelAvatarLink": "",
"UserName": "",
"Email": "zhengxiawu@126.com",
"CommitCnt": 262
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "sdut_snow@163.com",
"CommitCnt": 66
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "1004463561@qq.com",
"CommitCnt": 31
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "thrase@163.com",
"CommitCnt": 23
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "shaokunzhang529@gmail.com",
"CommitCnt": 24
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "51071696+WOODchen7@users.noreply.github.com",
"CommitCnt": 7
}
],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
}
],
iPageSizes: [15, 30, 50],
iPageSize: 15,
iPage: 1,
total: 0,
};
},
methods: {
getListData() {
return;
this.loading = true;
getReposListData({
q: this.q || '',
topic: this.topic || '',
sort: this.sort || 'mostpopular',
pageSize: this.iPageSize || 15,
page: this.iPage || 1,
}).then(res => {
res = res.data;
this.loading = false;
if (res.Code == 0) {
const list = res.Data.Repos || [];
this.list = list.map((item) => {
item.Contributors = (item.Contributors || []).map((_item) => {
return {
..._item,
bgColor: this.randomColor(_item.Email[0].toLocaleUpperCase()),
}
});
const contributors = item.Contributors || [];
return {
...item,
NameShow: this.handlerSearchStr(item.Alias, this.q),
DescriptionShow: this.handlerSearchStr(item.Description, this.q),
TopicsShow: (item.Topics || []).map((_item) => {
return {
topic: _item,
topicShow: this.handlerSearchStr(_item, this.q)
}
}),
}
});
this.total = res.Data.Total;
this.iPage = this.iPage;
this.iPageSize = this.iPageSize;
this.$nextTick(() => {
LetterAvatar.transform();
});
} else {
this.list = [];
this.total = 0;
this.iPage = this.iPage;
this.iPageSize = this.iPageSize;
}
}).catch(err => {
console.log(err);
this.loading = false;
this.list = [];
this.total = 0;
this.iPage = this.iPage;
this.iPageSize = this.iPageSize;
});
},
search() {
this.getListData();
},
currentChange(page) {
this.iPage = page;
this.$emit('current-change', {
page: this.iPage,
pageSize: this.iPageSize,
});
},
sizeChange(pageSize) {
this.iPageSize = pageSize;
this.$emit('size-change', {
page: this.iPage,
pageSize: this.iPageSize,
});
},
},
mounted() { },
};
</script>

<style scoped lang="less">
.list-container {
.list-item-container {
display: flex;
flex-wrap: wrap;

.item-container {
width: 50%;
padding: 12px;
}
}
}

.center {
text-align: center;
}

.no-data {
height: 60px;
display: flex;
justify-content: center;
align-items: center;
}
</style>

+ 243
- 0
web_src/vuepages/pages/tech/components/SciAndTechPrjItem.vue View File

@@ -0,0 +1,243 @@
<template>
<div class="item">
<div class="header">
<div class="header-l">
<div class="title">小样本条件下的自适应机器学习理论与模型研究</div>
<div class="prj-type">应用示范研究</div>
</div>
<div class="header-r">
<a href="">
<span>更多成果</span>
<i class="el-icon-arrow-right"></i>
</a>
</div>
</div>
<div class="content">
<div class="item-l-c">
<div class="row">
<span class="tit">负责单位:</span>
<span class="val">鹏城实验室</span>
</div>
<div class="row">
<span class="tit">参与单位:</span>
<span class="val">大连理工大学、北京理工大学、北京理工大学、北京理工大学、北京理工大学、北京理工大学</span>
</div>
<div class="row">
<span class="tit">申报年份:</span>
<span class="val">2018</span>
</div>
<div class="row">
<span class="tit">执行周期:</span>
<span class="val">2019 - 2023</span>
</div>
<div class="row">
<span class="tit">项目成果数:</span>
<span class="val">10</span>
</div>
</div>
<div class="item-r-c">
<a class="repo-item-c" href="javascript:;" v-for="(item, index) in [1, 2]">
<div class="repo-item">
<div class="repo-hd">
<div class="repo-avatar">
<img v-if="data.RelAvatarLink" class="avatar" :src="data.RelAvatarLink" />
<img v-else class="avatar" :avatar="data.OwnerName" />
</div>
<div class="repo-tit">面向服务的群智化生态化软件开发支撑平台(aiforge)</div>
</div>
<div class="repo-content">
<div class="repo-descr">
本项目是群体化方法与技术的开源实现案例,在基于Gitea的基础上,进一步支持社交化的协同开发、协同学习、协同研究等群体创新实践服务,特别是针对新一代人工智能技术特点,重点支持项目管理、git代码管理、大数据集存储管理与智能计算平台接入。
</div>
</div>
</div>
</a>
</div>
</div>
</div>
</template>

<script>
import dayjs from 'dayjs';
import { lang } from '~/langs';
import { timeSinceUnix } from '~/utils';

export default {
name: "SciAndTechPrjItem",
props: {
data: { type: Object, default: () => ({}) },
},
components: {},
data() {
return {

};
},
methods: {
calcFromNow(unix) {
return timeSinceUnix(unix, Date.now() / 1000);
},
dateFormat(unix) {
return lang == 'zh-CN' ? dayjs(unix * 1000).format('YYYY年MM月DD日 HH时mm分ss秒') :
dayjs(unix * 1000).format('ddd, D MMM YYYY HH:mm:ss [CST]');
}
},
mounted() { },
};
</script>

<style scoped lang="less">
.item {
border-color: rgb(232, 224, 236);
border-width: 1px;
border-style: solid;
box-shadow: rgba(168, 157, 226, 0.2) 0px 5px 10px 0px;
background: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20version%3D%221.1%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%221%22%20x1%3D%220%22%20x2%3D%221%22%20y1%3D%220%22%20y2%3D%220%22%20gradientTransform%3D%22matrix(-0.01900000000000005%2C%200.997%2C%20-0.12862587255310284%2C%20-0.01900000000000005%2C%200.995%2C%200.014)%22%3E%3Cstop%20stop-color%3D%22%23f2edf5%22%20stop-opacity%3D%221%22%20offset%3D%220.01%22%3E%3C%2Fstop%3E%3Cstop%20stop-color%3D%22%23ffffff%22%20stop-opacity%3D%221%22%20offset%3D%220.31%22%3E%3C%2Fstop%3E%3C%2FlinearGradient%3E%3C%2Fdefs%3E%3Crect%20width%3D%22100%25%22%20height%3D%22100%25%22%20fill%3D%22url(%231)%22%3E%3C%2Frect%3E%3C%2Fsvg%3E");
overflow: hidden;
padding: 15px;

.header {
display: flex;
align-items: center;
justify-content: space-between;

.header-l {
display: flex;
align-items: center;

.title {
color: rgb(16, 16, 16);
font-size: 18px;
font-weight: bold;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 800px;
}

.prj-type {
margin-left: 14px;
font-size: 12px;
font-weight: 400;
color: rgb(100, 59, 159);
background: rgb(237, 234, 251);
padding: 2px 5px;
border-radius: 4px;
}
}

.header-r {
display: flex;
align-items: baseline;
text-align: right;
color: rgb(50, 145, 248);
font-size: 12px;
width: 80px;
justify-content: flex-end;

i {
margin-left: 1px;
}
}
}

.content {
display: flex;
margin-top: 10px;

.item-l-c {
flex: 1;

.row {
display: flex;
font-size: 14px;
color: rgb(16, 16, 16);
margin: 8px 0;
font-weight: 400;

.tit {
color: rgba(136, 136, 136, 1);
}

.val {
flex: 1;
width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}

&:last-child {
margin-bottom: 0;
}
}
}

.item-r-c {
flex: 2;
margin-left: 10px;
display: flex;

.repo-item-c {
display: block;
flex: 1;
margin: 10px;
padding: 20px;
border-color: rgba(157, 197, 226, 0.4);
border-width: 1px;
border-style: solid;
border-radius: 5px;
box-shadow: rgba(157, 197, 226, 0.2) 0px 5px 10px 0px;
background: rgb(255, 255, 255);
width: 0;

.repo-item {
.repo-hd {
display: flex;
align-items: center;

.repo-avatar {
width: 28px;
height: 28px;

img {
width: 100%;
height: 100%;
border-radius: 100%;
}
}

.repo-tit {
flex: 1;
margin-left: 8px;
width: 0;
font-size: 14px;
color: rgb(50, 145, 248);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}

.repo-content {
margin-top: 10px;

.repo-descr {
width: 100%;
font-size: 12px;
color: rgb(136, 136, 136);
text-overflow: ellipsis;
word-break: break-all;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
max-height: 41px;
overflow: hidden;
}
}
}
}
}
}
}
</style>

+ 885
- 0
web_src/vuepages/pages/tech/components/SciAndTechPrjList.vue View File

@@ -0,0 +1,885 @@
<template>
<div class="list-container">
<div class="list-item-container" style="min-height:540px;" v-loading="loading">
<div class="item-container" v-for="(item, index) in list" :key="item.ID">
<SciAndTechPrjItem :data="item"></SciAndTechPrjItem>
</div>
<div v-show="(!list.length && !loading)" class="no-data">{{ $t('repos.noReposfound') }}</div>
</div>
<div class="center">
<el-pagination ref="paginationRef" background @current-change="currentChange" @size-change="sizeChange"
:current-page.sync="iPage" :page-sizes="iPageSizes" :page-size.sync="iPageSize"
layout="total, sizes, prev, pager, next, jumper" :total="total">
</el-pagination>
</div>
</div>
</template>

<script>
import SciAndTechPrjItem from './SciAndTechPrjItem.vue';
import LetterAvatar from '~/utils/letteravatar';

export default {
name: "SciAndTechPrjList",
props: {
q: { type: String, default: '' },
page: { type: Number, default: 1 },
pageSize: { type: Number, default: 15 },
pageSizes: { type: Array, default: () => [15, 30, 50] }
},
components: { SciAndTechPrjItem },
data() {
return {
loading: false,
list: [
{
"ID": 4781,
"OwnerID": 679,
"OwnerName": "OpenI",
"LowerName": "msadapter",
"Name": "MSAdapter",
"Alias": "MSAdapter",
"NumWatches": 3,
"NumStars": 0,
"NumForks": 0,
"Description": "MindSpore对PyTorch接口的支持工具",
"Topics": null,
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1669691488,
"UpdatedUnix": 1670839285,
"PrimaryLanguage": null,
"RelAvatarLink": "",
"Contributors": [
{
"RelAvatarLink": "/user/avatar/wjtest1207/-1?18",
"UserName": "wjtest1207",
"Email": "wjtest1207@163.com",
"CommitCnt": 1
}
],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 501,
"OwnerID": 224,
"OwnerName": "OpenIOSSG",
"LowerName": "promote",
"Name": "promote",
"Alias": "promote",
"NumWatches": 1,
"NumStars": 0,
"NumForks": 0,
"Description": "",
"Topics": null,
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1642470476,
"UpdatedUnix": 1670256276,
"PrimaryLanguage": {
"ID": 724,
"RepoID": 501,
"CommitID": "2fd3316bcf89250f80b0d1f6a05cb2c69fdb2845",
"IsPrimary": true,
"Language": "Markdown",
"Percentage": 100,
"Color": "#cccccc",
"CreatedUnix": 1642470477
},
"RelAvatarLink": "",
"Contributors": [],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 696,
"OwnerID": 679,
"OwnerName": "OpenI",
"LowerName": "octopus",
"Name": "octopus",
"Alias": "octopus",
"NumWatches": 3,
"NumStars": 1,
"NumForks": 0,
"Description": "面向多计算场景的一站式融合计算平台",
"Topics": [
"openi",
"deep-learning",
"golang"
],
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1647933529,
"UpdatedUnix": 1670899396,
"PrimaryLanguage": {
"ID": 1018,
"RepoID": 696,
"CommitID": "70699543cc3bf19f70ee7b126b27b752b0577469",
"IsPrimary": true,
"Language": "CSS",
"Percentage": 36.5,
"Color": "#563d7c",
"CreatedUnix": 1647933538
},
"RelAvatarLink": "/repo-avatars/696-c9d9105eba8ad76589b65edff1588bc5",
"Contributors": [
{
"RelAvatarLink": "",
"UserName": "",
"Email": "2522636547@qq.com",
"CommitCnt": 253
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "835952234@qq.com",
"CommitCnt": 203
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "linfj@pcl.ac.cn",
"CommitCnt": 174
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "hackmong@163.com",
"CommitCnt": 121
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "liaowsh@pcl.ac.cn",
"CommitCnt": 114
},
{
"RelAvatarLink": "/user/avatar/liwei_test/-1?25",
"UserName": "liwei_test",
"Email": "liw03@pcl.ac.cn",
"CommitCnt": 88
}
],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 697,
"OwnerID": 679,
"OwnerName": "OpenI",
"LowerName": "paddle",
"Name": "Paddle",
"Alias": "Paddle",
"NumWatches": 3,
"NumStars": 0,
"NumForks": 0,
"Description": "PaddlePaddle (PArallel Distributed Deep LEarning) 是一个简单易用、高效灵活、可扩展的深度学习平台,最初由百度科学家和工程师共同开发,目的是将深度学习技术应用到百度的众多产品中。",
"Topics": [
"ai开发工具",
"deep-learning"
],
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1647933857,
"UpdatedUnix": 1670838791,
"PrimaryLanguage": {
"ID": 1021,
"RepoID": 697,
"CommitID": "c46e661dfd4dca4ccb2d8bb83225d2dcb0bff52c",
"IsPrimary": true,
"Language": "Python",
"Percentage": 45.9,
"Color": "#3572A5",
"CreatedUnix": 1647933890
},
"RelAvatarLink": "/repo-avatars/697-c50e829c78c6c3168605586c750887e4",
"Contributors": [
{
"RelAvatarLink": "",
"UserName": "",
"Email": "yuyang18@baidu.com",
"CommitCnt": 2039
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "luotao02@baidu.com",
"CommitCnt": 1101
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "fengjiayi@baidu.com",
"CommitCnt": 864
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "qiaolongfei@baidu.com",
"CommitCnt": 1456
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "tangjian03@baidu.com",
"CommitCnt": 730
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "panxin.grad@gmail.com",
"CommitCnt": 678
}
],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 702,
"OwnerID": 679,
"OwnerName": "OpenI",
"LowerName": "tensorlayerx",
"Name": "TensorLayerX",
"Alias": "TensorLayerX",
"NumWatches": 3,
"NumStars": 0,
"NumForks": 0,
"Description": "TensorLayer3.0一款兼容多深度学习框架后端的深度学习库, 目前可以用TensorFlow、MindSpore、PaddlePaddle作为后端计算引擎。",
"Topics": [
"openi-paper",
"pytorch",
"标签aaa",
"paddlepaddle",
"test-abcdefghijklmno测-试-123456",
"tensorflow",
"mindspore",
"高层次库",
"深度学习",
"支持多计算后端"
],
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1647935532,
"UpdatedUnix": 1671012469,
"PrimaryLanguage": {
"ID": 1039,
"RepoID": 702,
"CommitID": "6eafa9118008338521d3d085d70627b37ccba51d",
"IsPrimary": true,
"Language": "Python",
"Percentage": 99.6,
"Color": "#3572A5",
"CreatedUnix": 1647935549
},
"RelAvatarLink": "/repo-avatars/702-a18a6669062a1a24aea776744c003f34",
"Contributors": [
{
"RelAvatarLink": "",
"UserName": "",
"Email": "dhsig552@163.com",
"CommitCnt": 1598
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "luo.mai.cs@gmail.com",
"CommitCnt": 203
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "37874862+warshallrho@users.noreply.github.com",
"CommitCnt": 130
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "jingqing.zhang15@imperial.ac.uk",
"CommitCnt": 129
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "rundi_wu@pku.edu.cn",
"CommitCnt": 159
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "lg4869@outlook.com",
"CommitCnt": 67
}
],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 4780,
"OwnerID": 218,
"OwnerName": "PCL-Platform.Intelligence",
"LowerName": "pcl_pangu",
"Name": "pcl_pangu",
"Alias": "pcl_pangu",
"NumWatches": 1,
"NumStars": 0,
"NumForks": 0,
"Description": "鹏程·盘古SDK 上线!集成了鹏程·盘古alpha模型、增强版Evolution模型、多语言mPangu模型,欢迎测试和使用。希望鹏程·盘古模型的可持续学习与应用生态快速发展!",
"Topics": [
"大模型"
],
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1669691367,
"UpdatedUnix": 1670921009,
"PrimaryLanguage": null,
"RelAvatarLink": "/repo-avatars/4780-5b45386c19f3e34b4749e6dde7dc3181",
"Contributors": [
{
"RelAvatarLink": "/user/avatar/wjtest1207/-1?40",
"UserName": "wjtest1207",
"Email": "wjtest1207@163.com",
"CommitCnt": 1
}
],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 4405,
"OwnerID": 585,
"OwnerName": "arXiv_Computation_and_Language_2019",
"LowerName": "paddlenlp",
"Name": "PaddleNLP",
"Alias": "PaddleNLP",
"NumWatches": 1,
"NumStars": 0,
"NumForks": 0,
"Description": "",
"Topics": null,
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1667453897,
"UpdatedUnix": 1670256902,
"PrimaryLanguage": null,
"RelAvatarLink": "",
"Contributors": [],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 4127,
"OwnerID": 507,
"OwnerName": "international_conference_on_machine_learning",
"LowerName": "fairseq",
"Name": "fairseq",
"Alias": "fairseq",
"NumWatches": 1,
"NumStars": 0,
"NumForks": 0,
"Description": "",
"Topics": null,
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1667442805,
"UpdatedUnix": 1670256623,
"PrimaryLanguage": {
"ID": 6206,
"RepoID": 4127,
"CommitID": "b8ac3fa6cc95f9dc97085232d4faf125e5bcd2e7",
"IsPrimary": true,
"Language": "Python",
"Percentage": 97.8,
"Color": "#3572A5",
"CreatedUnix": 1667443078
},
"RelAvatarLink": "",
"Contributors": [],
"IsPrivate": false,
"IsFork": false,
"IsMirror": true,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 2176,
"OwnerID": 536,
"OwnerName": "openi_paper",
"LowerName": "paddledetection",
"Name": "PaddleDetection",
"Alias": "PaddleDetection",
"NumWatches": 1,
"NumStars": 0,
"NumForks": 0,
"Description": "",
"Topics": null,
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1666872337,
"UpdatedUnix": 1670257237,
"PrimaryLanguage": null,
"RelAvatarLink": "",
"Contributors": [],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 4619,
"OwnerID": 536,
"OwnerName": "openi_paper",
"LowerName": "fairseq",
"Name": "fairseq",
"Alias": "fairseq",
"NumWatches": 1,
"NumStars": 0,
"NumForks": 0,
"Description": "",
"Topics": null,
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1667461670,
"UpdatedUnix": 1670256376,
"PrimaryLanguage": null,
"RelAvatarLink": "",
"Contributors": [],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 598,
"OwnerID": 251,
"OwnerName": "PCL_AutoML",
"LowerName": "xbbo",
"Name": "XBBO",
"Alias": "XBBO",
"NumWatches": 1,
"NumStars": 0,
"NumForks": 0,
"Description": "超参搜索(黑盒优化)框架",
"Topics": [
"openi-paper",
"自动机器学习",
"优化",
"超参搜索"
],
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1645065667,
"UpdatedUnix": 1671012526,
"PrimaryLanguage": {
"ID": 842,
"RepoID": 598,
"CommitID": "bb089a69ce3541246a948c08bd37e31ab23e439c",
"IsPrimary": true,
"Language": "Python",
"Percentage": 98.7,
"Color": "#3572A5",
"CreatedUnix": 1645065672
},
"RelAvatarLink": "/repo-avatars/598-5c870fdbde9a0457989616263b77c63c",
"Contributors": [
{
"RelAvatarLink": "",
"UserName": "",
"Email": "isleizhang@outlook.com",
"CommitCnt": 103
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "mathcoder.zl@gmail.com",
"CommitCnt": 10
}
],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 999,
"OwnerID": 431,
"OwnerName": "GAMMALab",
"LowerName": "openhgnn",
"Name": "OpenHGNN",
"Alias": "OpenHGNN",
"NumWatches": 1,
"NumStars": 0,
"NumForks": 2,
"Description": "OpenHGNN是由北邮GAMMA Lab开发的基于PyTorch和DGL的开源异质图神经网络工具包。",
"Topics": [
"openi-paper",
"pytorch",
"dgl",
"heterogeneous",
"异质图",
"gnn",
"图神经网络"
],
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1659322878,
"UpdatedUnix": 1671012520,
"PrimaryLanguage": null,
"RelAvatarLink": "",
"Contributors": [
{
"RelAvatarLink": "/user/avatar/wjtest001/-1?56",
"UserName": "wjtest001",
"Email": "towangjing@yeah.net",
"CommitCnt": 1
}
],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 703,
"OwnerID": 679,
"OwnerName": "OpenI",
"LowerName": "apulis-ai-platform",
"Name": "Apulis-AI-Platform",
"Alias": "Apulis-AI-Platform",
"NumWatches": 3,
"NumStars": 2,
"NumForks": 0,
"Description": "依瞳人工智能平台旨在为不同行业的用户提供基于深度学习的端到端解决方案,使用户可以用最快的速度、最少的时间开始高性能的深度学习工作,从而大幅节省研究成本、提高研发效率,同时可为中小企业解决私有云难建成、成本高等问题。 平台融合了Tensorflow、PyTorch、MindSpore等开源深度学习框架,提供了模型训练、超参调优、集群状态监控等开发环境,方便AI开发者快速搭建人工智能开发环境,开展AI开发应用。在监控模块基础上搭建预警模块,自动将平台异常通知管理员,提升平台的预警效率及安全性能。",
"Topics": [
"ai开发工具",
"openi-paper"
],
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1647935724,
"UpdatedUnix": 1671012418,
"PrimaryLanguage": {
"ID": 1054,
"RepoID": 703,
"CommitID": "18a76ed026dfa5a1e71a74f3518e9ba6f830d77f",
"IsPrimary": true,
"Language": "JavaScript",
"Percentage": 57.4,
"Color": "#f1e05a",
"CreatedUnix": 1647935738
},
"RelAvatarLink": "",
"Contributors": [
{
"RelAvatarLink": "",
"UserName": "",
"Email": "869071540@qq.com",
"CommitCnt": 1103
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "jinlmsft@hotmail.com",
"CommitCnt": 745
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "hongzhi.li@microsoft.com",
"CommitCnt": 504
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "xjhan1995@gmail.com",
"CommitCnt": 399
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "hongzhili@users.noreply.github.com",
"CommitCnt": 377
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "xudifsd@gmail.com",
"CommitCnt": 251
}
],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 695,
"OwnerID": 679,
"OwnerName": "OpenI",
"LowerName": "cubeai",
"Name": "cubeai",
"Alias": "cubeai",
"NumWatches": 3,
"NumStars": 3,
"NumForks": 0,
"Description": "CubeAI智立方是中国联通研究院自主研发的集AI模型自动化服务封装、发布、共享、部署和能力开放等功能于一体的开源AI算能服务平台,其核心作用在于打通AI模型开发至实际生产应用之间的壁垒,加速AI创新和应用进程,促进AI应用从设计、开发直到部署、运营整个生命周期的自动化快速迭代和演进。",
"Topics": [
"ai开发工具",
"openi",
"ai模型服务化",
"ai模型共享",
"ai模型部署",
"ai能力开放"
],
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1647933184,
"UpdatedUnix": 1670838880,
"PrimaryLanguage": {
"ID": 1006,
"RepoID": 695,
"CommitID": "09e1a0146612cff32fb01881707c831414494599",
"IsPrimary": true,
"Language": "Shell",
"Percentage": 96.8,
"Color": "#89e051",
"CreatedUnix": 1647933187
},
"RelAvatarLink": "/repo-avatars/695-5d57aff010bceee7d1634ea64ca6a298",
"Contributors": [
{
"RelAvatarLink": "",
"UserName": "",
"Email": "huolongshe@126.com",
"CommitCnt": 15
}
],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
},
{
"ID": 595,
"OwnerID": 251,
"OwnerName": "PCL_AutoML",
"LowerName": "xnas",
"Name": "XNAS",
"Alias": "XNAS",
"NumWatches": 1,
"NumStars": 0,
"NumForks": 0,
"Description": "神经网络结构搜索框架",
"Topics": [
"openi-paper",
"自动机器学习",
"automl",
"神经网络结构搜索"
],
"AiTaskCnt": 0,
"ModelCnt": 0,
"DatasetCnt": 0,
"CreatedUnix": 1645065509,
"UpdatedUnix": 1671012496,
"PrimaryLanguage": {
"ID": 838,
"RepoID": 595,
"CommitID": "2c54ceb09b255cbcabd67f3c39fc777c4b2403f4",
"IsPrimary": true,
"Language": "Python",
"Percentage": 100,
"Color": "#3572A5",
"CreatedUnix": 1645065513
},
"RelAvatarLink": "/repo-avatars/595-4284a9fbc95ba42b7753910d8fcd1828",
"Contributors": [
{
"RelAvatarLink": "",
"UserName": "",
"Email": "zhengxiawu@126.com",
"CommitCnt": 262
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "sdut_snow@163.com",
"CommitCnt": 66
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "1004463561@qq.com",
"CommitCnt": 31
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "thrase@163.com",
"CommitCnt": 23
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "shaokunzhang529@gmail.com",
"CommitCnt": 24
},
{
"RelAvatarLink": "",
"UserName": "",
"Email": "51071696+WOODchen7@users.noreply.github.com",
"CommitCnt": 7
}
],
"IsPrivate": false,
"IsFork": false,
"IsMirror": false,
"IsOwnerPrivate": false,
"IsArchived": false
}
],
iPageSizes: [15, 30, 50],
iPageSize: 15,
iPage: 1,
total: 0,
};
},
methods: {
getListData() {
return;
this.loading = true;
getReposListData({
q: this.q || '',
topic: this.topic || '',
sort: this.sort || 'mostpopular',
pageSize: this.iPageSize || 15,
page: this.iPage || 1,
}).then(res => {
res = res.data;
this.loading = false;
if (res.Code == 0) {
const list = res.Data.Repos || [];
this.list = list.map((item) => {
item.Contributors = (item.Contributors || []).map((_item) => {
return {
..._item,
bgColor: this.randomColor(_item.Email[0].toLocaleUpperCase()),
}
});
const contributors = item.Contributors || [];
return {
...item,
NameShow: this.handlerSearchStr(item.Alias, this.q),
DescriptionShow: this.handlerSearchStr(item.Description, this.q),
TopicsShow: (item.Topics || []).map((_item) => {
return {
topic: _item,
topicShow: this.handlerSearchStr(_item, this.q)
}
}),
}
});
this.total = res.Data.Total;
this.iPage = this.iPage;
this.iPageSize = this.iPageSize;
this.$nextTick(() => {
LetterAvatar.transform();
});
} else {
this.list = [];
this.total = 0;
this.iPage = this.iPage;
this.iPageSize = this.iPageSize;
}
}).catch(err => {
console.log(err);
this.loading = false;
this.list = [];
this.total = 0;
this.iPage = this.iPage;
this.iPageSize = this.iPageSize;
});
},
search() {
this.getListData();
},
currentChange(page) {
this.iPage = page;
this.$emit('current-change', {
page: this.iPage,
pageSize: this.iPageSize,
});
},
sizeChange(pageSize) {
this.iPageSize = pageSize;
this.$emit('size-change', {
page: this.iPage,
pageSize: this.iPageSize,
});
},
},
mounted() { },
};
</script>

<style scoped lang="less">
.list-container {
.list-item-container {
.item-container {
width: 100%;
padding: 12px;
}
}
}

.center {
text-align: center;
}

.no-data {
height: 60px;
display: flex;
justify-content: center;
align-items: center;
}
</style>

+ 179
- 0
web_src/vuepages/pages/tech/components/SearchBar.vue View File

@@ -0,0 +1,179 @@
<template>
<div class="search-bar">
<div class="search-bar-l">
<div class="search-c">
<div class="search-input-c">
<input type="text" :placeholder="serchPlaceHolder" v-model="keyword" @keyup.enter.native="search">
</div>
<div class="search-btn" @click="search">搜索</div>
</div>
<el-button class="apply-btn" type="primary" icon="el-icon-plus" size="medium" @click="apply">申请展示项目</el-button>
<el-button class="apply-btn" type="primary" icon="el-icon-s-management" size="medium" v-if="isTechAdmin"
@click="manage">管理展示项目</el-button>
<div class="openi-link-c">
<a class="openi-link" href="">OpenI启智社区开源指南</a>
</div>
</div>
<div class="sort-c">
<el-select class="select" size="medium" v-model="sortType" @change="changeSort" placeholder="排序" clearable>
<el-option v-for="item in sortList" :key="item.k" :label="item.v" :value="item.k" />
</el-select>
</div>
</div>
</template>

<script>
import { getIsTechAdmin } from '~/apis/modules/tech';

export default {
name: "SearchBar",
props: {
condition: { type: Object, default: () => ({}) },
},
components: {},
data() {
return {
keyword: '',
serchPlaceHolder: '搜索项目名称/简介',
sortType: '',
sortList: [{
k: '1',
v: '最近更新',
}, {
k: '2',
v: '项目成果数',
}],
isTechAdmin: true,
};
},
methods: {
search() {
this.$emit('changeCondition', {
q: this.keyword.trim()
});
},
apply() {
window.location.href = '/tech/new';
},
manage() {
window.location.href = '/tech/admin_view';
},
changeSort() {
this.$emit('changeCondition', {
sort: this.sortType
});
}
},
watch: {
condition: {
handler(newVal) {
console.log('searchBar:watch:condition', newVal);
this.keyword = newVal.q;
this.sortType = newVal.sort;
},
immediate: true,
deep: true,
},
},
beforeMount() {
getIsTechAdmin().then(res => {
console.log(res);
}).catch(err => {
console.log(err);
});
},
mounted() { },
};
</script>

<style scoped lang="less">
.search-bar {
margin: 30px 0;
display: flex;
justify-content: space-between;

.search-bar-l {
display: flex;

.search-c {
display: flex;
align-items: center;
justify-content: center;
margin-right: 20px;

.search-input-c {
width: 268px;
height: 40px;
border-color: rgba(0, 61, 192, 0.73);
border-width: 2px;
border-style: solid;
font-size: 14px;
line-height: 20px;
padding: 8px;
display: flex;
color: rgb(136, 136, 136);
align-items: center;
background: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20version%3D%221.1%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%221%22%20x1%3D%220%22%20x2%3D%221%22%20y1%3D%220%22%20y2%3D%220%22%20gradientTransform%3D%22matrix(6.123233995736766e-17%2C%201%2C%20-0.014005111865831027%2C%206.123233995736766e-17%2C%200.5%2C%200)%22%3E%3Cstop%20stop-color%3D%22%23e2d1ea%22%20stop-opacity%3D%221%22%20offset%3D%220%22%3E%3C%2Fstop%3E%3Cstop%20stop-color%3D%22%23ffffff%22%20stop-opacity%3D%221%22%20offset%3D%220.3%22%3E%3C%2Fstop%3E%3C%2FlinearGradient%3E%3C%2Fdefs%3E%3Crect%20width%3D%22100%25%22%20height%3D%22100%25%22%20fill%3D%22url(%231)%22%3E%3C%2Frect%3E%3C%2Fsvg%3E");

input {
width: 100%;
border: none;
outline: none;
}
}

.search-btn {
height: 40px;
font-size: 14px;
line-height: 20px;
padding: 0px;
display: flex;
color: rgb(255, 255, 255);
align-items: center;
text-align: center;
justify-content: center;
padding: 0 20px;
cursor: pointer;
background: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20version%3D%221.1%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%221%22%20x1%3D%220%22%20x2%3D%221%22%20y1%3D%220%22%20y2%3D%220%22%20gradientTransform%3D%22matrix(-1.1800000000000002%2C%200.9499999999999998%2C%20-0.23749999999999996%2C%20-1.1800000000000002%2C%201.024%2C%200.047)%22%3E%3Cstop%20stop-color%3D%22%23bbd2f2%22%20stop-opacity%3D%221%22%20offset%3D%220.02%22%3E%3C%2Fstop%3E%3Cstop%20stop-color%3D%22%23003dc0%22%20stop-opacity%3D%220.73%22%20offset%3D%221%22%3E%3C%2Fstop%3E%3C%2FlinearGradient%3E%3C%2Fdefs%3E%3Crect%20width%3D%22100%25%22%20height%3D%22100%25%22%20fill%3D%22url(%231)%22%3E%3C%2Frect%3E%3C%2Fsvg%3E");
}
}

.apply-btn {
margin-left: 20px;
border-color: rgb(31, 1, 115);
border-width: 1px;
border-style: solid;
border-radius: 6px;
font-size: 14px;
background: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20version%3D%221.1%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%221%22%20x1%3D%220%22%20x2%3D%221%22%20y1%3D%220%22%20y2%3D%220%22%20gradientTransform%3D%22matrix(6.123233995736766e-17%2C%201%2C%20-0.08281144868278038%2C%206.123233995736766e-17%2C%200.5%2C%200)%22%3E%3Cstop%20stop-color%3D%22%233291f8%22%20stop-opacity%3D%221%22%20offset%3D%220%22%3E%3C%2Fstop%3E%3Cstop%20stop-color%3D%22%23060075%22%20stop-opacity%3D%220.73%22%20offset%3D%221%22%3E%3C%2Fstop%3E%3C%2FlinearGradient%3E%3C%2Fdefs%3E%3Crect%20width%3D%22100%25%22%20height%3D%22100%25%22%20fill%3D%22url(%231)%22%3E%3C%2Frect%3E%3C%2Fsvg%3E");

&:hover {
opacity: 0.9;
}

&:active {
opacity: 0.8;
}
}

.openi-link-c {
margin-left: 20px;
display: flex;
align-items: center;
justify-content: center;

.openi-link {
text-decoration: underline;
color: rgb(50, 145, 248);
}
}
}

.sort-c {
display: flex;
align-items: center;
justify-content: center;
justify-self: flex-end;
}
}
</style>

+ 141
- 0
web_src/vuepages/pages/tech/components/TopHeader.vue View File

@@ -0,0 +1,141 @@
<template>
<div>
<div class="bg-container">
<div class="bg">
<div class="bg-01"></div>
<div class="bg-02"></div>
<div class="bg-03"></div>
<div class="bg-04"></div>
</div>
<div class="title-c">
<div class="title-main">科技创新2030</div>
<div class="title-second">新一代人工智能重大项目成果展示</div>
</div>
<div class="menu">
<TopMenu :menu="menu"></TopMenu>
</div>
</div>
</div>
</template>

<script>
import TopMenu from './TopMenu.vue';

export default {
name: "TopHeader",
props: {
menu: { type: Number, default: -1 },
},
components: {
TopMenu
},
data() {
return {
list: [],
};
},
methods: {},
mounted() { },
};
</script>

<style scoped lang="less">
.bg-container {
height: 200px;
width: 100%;
background: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20version%3D%221.1%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%221%22%20x1%3D%220%22%20x2%3D%221%22%20y1%3D%220%22%20y2%3D%220%22%20gradientTransform%3D%22matrix(0.9059999999999998%2C%20-0.8390000000000001%2C%200.016184413580246918%2C%200.9059999999999998%2C%20-0.183%2C%200.683)%22%3E%3Cstop%20stop-color%3D%22%233bb6fe%22%20stop-opacity%3D%221%22%20offset%3D%220%22%3E%3C%2Fstop%3E%3Cstop%20stop-color%3D%22%232250cf%22%20stop-opacity%3D%221%22%20offset%3D%220.61%22%3E%3C%2Fstop%3E%3Cstop%20stop-color%3D%22%237c23b4%22%20stop-opacity%3D%221%22%20offset%3D%220.99%22%3E%3C%2Fstop%3E%3C%2FlinearGradient%3E%3C%2Fdefs%3E%3Crect%20width%3D%22100%25%22%20height%3D%22100%25%22%20fill%3D%22url(%231)%22%3E%3C%2Frect%3E%3C%2Fsvg%3E");
overflow: hidden;
position: relative;

.bg {
position: absolute;
width: 100%;
height: 100%;
left: 67%;
top: 23%;

.bg-01 {
position: absolute;
top: -296.85px;
left: -100.21px;
width: 11.52px;
height: 430.36px;
transform: rotate(46deg);
border-radius: 45px;
display: flex;
background: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20version%3D%221.1%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%221%22%20x1%3D%220%22%20x2%3D%221%22%20y1%3D%220%22%20y2%3D%220%22%20gradientTransform%3D%22matrix(2.6570000000000005%2C%20-1.366%2C%201906.3802884596842%2C%202.6570000000000005%2C%20-0.714%2C%201.313)%22%3E%3Cstop%20stop-color%3D%22%2315cf16%22%20stop-opacity%3D%221%22%20offset%3D%220%22%3E%3C%2Fstop%3E%3Cstop%20stop-color%3D%22%23ed6bc9%22%20stop-opacity%3D%220%22%20offset%3D%221%22%3E%3C%2Fstop%3E%3C%2FlinearGradient%3E%3C%2Fdefs%3E%3Crect%20width%3D%22100%25%22%20height%3D%22100%25%22%20fill%3D%22url(%231)%22%3E%3C%2Frect%3E%3C%2Fsvg%3E");
}

.bg-02 {
position: absolute;
top: -130.68px;
left: -213.01px;
width: 3.64px;
height: 430.36px;
transform: rotate(46deg);
border-radius: 45px;
background: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20version%3D%221.1%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%221%22%20x1%3D%220%22%20x2%3D%221%22%20y1%3D%220%22%20y2%3D%220%22%20gradientTransform%3D%22matrix(2.6570000000000005%2C%20-1.366%2C%2019094.65120710059%2C%202.6570000000000005%2C%20-0.714%2C%201.313)%22%3E%3Cstop%20stop-color%3D%22%23ffffff%22%20stop-opacity%3D%221%22%20offset%3D%220%22%3E%3C%2Fstop%3E%3Cstop%20stop-color%3D%22%23ed6bc9%22%20stop-opacity%3D%220%22%20offset%3D%221%22%3E%3C%2Fstop%3E%3C%2FlinearGradient%3E%3C%2Fdefs%3E%3Crect%20width%3D%22100%25%22%20height%3D%22100%25%22%20fill%3D%22url(%231)%22%3E%3C%2Frect%3E%3C%2Fsvg%3E");
}

.bg-03 {
position: absolute;
top: -178.07px;
left: -50.045px;
width: 111.15px;
height: 306.28px;
transform: rotate(46deg);
border-radius: 63px;
background: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20version%3D%221.1%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%221%22%20x1%3D%220%22%20x2%3D%221%22%20y1%3D%220%22%20y2%3D%220%22%20gradientTransform%3D%22matrix(2.6570000000000005%2C%20-1.366%2C%2010.372156049382713%2C%202.6570000000000005%2C%20-0.714%2C%201.313)%22%3E%3Cstop%20stop-color%3D%22%23f8da77%22%20stop-opacity%3D%221%22%20offset%3D%220%22%3E%3C%2Fstop%3E%3Cstop%20stop-color%3D%22%23ed6bc9%22%20stop-opacity%3D%220%22%20offset%3D%221%22%3E%3C%2Fstop%3E%3C%2FlinearGradient%3E%3C%2Fdefs%3E%3Crect%20width%3D%22100%25%22%20height%3D%22100%25%22%20fill%3D%22url(%231)%22%3E%3C%2Frect%3E%3C%2Fsvg%3E");
}

.bg-04 {
position: absolute;
top: -218.72px;
left: 239.81px;
width: 20.38px;
height: 306.28px;
transform: rotate(46deg);
border-radius: 45px;
background: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20version%3D%221.1%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%221%22%20x1%3D%220%22%20x2%3D%221%22%20y1%3D%220%22%20y2%3D%220%22%20gradientTransform%3D%22matrix(2.6570000000000005%2C%20-1.366%2C%20308.5173674049777%2C%202.6570000000000005%2C%20-0.714%2C%201.313)%22%3E%3Cstop%20stop-color%3D%22%2377f8f8%22%20stop-opacity%3D%220.6%22%20offset%3D%220%22%3E%3C%2Fstop%3E%3Cstop%20stop-color%3D%22%23ed6bc9%22%20stop-opacity%3D%220%22%20offset%3D%221%22%3E%3C%2Fstop%3E%3C%2FlinearGradient%3E%3C%2Fdefs%3E%3Crect%20width%3D%22100%25%22%20height%3D%22100%25%22%20fill%3D%22url(%231)%22%3E%3C%2Frect%3E%3C%2Fsvg%3E");
}
}

.title-c {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1;

.title-main {
text-align: center;
color: rgba(255, 230, 21, 1);
font-weight: 700;
text-shadow: rgb(34 7 94) 0px 2px 6px;
line-height: 39px;
font-size: 28px;
margin: 26px 0 4px;
}

.title-second {
text-align: center;
font-weight: 700;
text-shadow: rgb(34 7 94) 0px 2px 6px;
color: rgb(255, 255, 255);
font-size: 36px;
font-weight: 500;
line-height: 50px;
}
}

.menu {
position: absolute;
bottom: 0;
height: 40px;
width: 100%;
z-index: 2;
padding: 0 140px;
}
}
</style>

+ 99
- 0
web_src/vuepages/pages/tech/components/TopMenu.vue View File

@@ -0,0 +1,99 @@
<template>
<div class="container ui" style="padding:0 75px;">
<div class="menu">
<div class="menu-l">
<div class="menu-item" v-for="(item, index) in list" :key="index" :class="focusIndex == index ? 'focused' : ''"
@click="changeMenu(item, index)">
{{ item.title }}
</div>
</div>
<div class="menu-r"></div>
</div>
</div>
</template>

<script>
export default {
name: "TopMenu",
props: {
menu: { type: Number, default: -1 },
},
components: {},
data() {
return {
focusIndex: 0,
list: [{
key: 'tech_view',
title: '按科技项目查看',
url: '/tech/tech_view',
}, {
key: 'repo_view',
title: '按项目成果查看',
url: '/tech/repo_view',
},/* {
key: '',
title: '我申请的项目',
url: '',
}*/],
};
},
methods: {
changeMenu(item, index) {
if (this.focusIndex == index) return;
this.focusIndex = index;
window.location.href = item.url;
}
},
beforeMount() {
this.focusIndex = this.menu;
},
mounted() { },
};
</script>

<style scoped lang="less">
.menu {
display: flex;
align-items: center;
justify-content: space-between;

.menu-l {
display: flex;
align-items: center;
justify-content: flex-start;
}

.menu-r {
display: flex;
align-items: center;
justify-content: flex-end;
}

.menu-item {
display: flex;
border-color: rgb(187, 187, 187);
border-width: 1px 1px 0px 0px;
border-style: solid;
font-size: 14px;
line-height: 20px;
color: rgba(255, 255, 255, 0.7);
align-items: center;
text-align: center;
justify-content: center;
background: rgba(104, 50, 165, 0.2);
height: 40px;
width: 178px;
cursor: pointer;

&:first-child {
border-left-width: 1px;
}

&.focused {
cursor: default;
color: rgb(255, 255, 255);
background: rgba(249, 249, 249, 0.2);
}
}
}
</style>

+ 470
- 0
web_src/vuepages/pages/tech/create/index.vue View File

@@ -0,0 +1,470 @@
<template>
<div>
<TopHeader :menu="-1"></TopHeader>
<div class="ui container">
<div class="title">您申请的项目将在2030科技项目页面展示</div>
<div class="form-c" v-show="!selectTechPrj">
<div class="form-wrap">
<div class="form-header">申请展示项目</div>
<div class="form-content">
<div class="form-row">
<div class="row-label required">申请项目存放于</div>
<div class="row-content">
<el-radio v-model="form.type" label="openi" @input="changeType()">启智社区</el-radio>
<el-radio v-model="form.type" label="no-openi" @input="changeType()">非启智社区</el-radio>
</div>
</div>
<div class="form-row">
<div class="row-label required">现项目地址</div>
<div class="row-content">
<el-input size="medium" v-model="form.url" @input="changeUrl"
placeholder='请输入现有项目的 HTTP(s) 或 Git " clone" URL,如:https://openi.pcl.ac.cn/OpenI/aiforge'></el-input>
</div>
</div>
<div v-show="form.type == 'no-openi'">
<div class="form-row" :class="form.alias_err ? 'form-row-err' : ''">
<div class="row-label required baseline">启智项目名称</div>
<div class="row-content">
<div>
<el-input size="medium" v-model="form.repo_alias" @input="changeAlias"></el-input>
</div>
<div class="tips">
请输入中文、字母、数字和-_ .,最多100个字符。
</div>
</div>
</div>
<div class="form-row" :class="form.name_err ? 'form-row-err' : ''">
<div class="row-label required baseline">启智项目路径</div>
<div class="row-content">
<div class="reop-url-c">
<el-select size="medium" v-model="form.uid"></el-select>
<span style="margin: 0 8px;font-size:22px;"> / </span>
<el-input size="medium" v-model="form.repo_name" @input="changeRepoName"></el-input>
</div>
<div class="tips">
启智项目地址:<span class="openi-repo-url">{{ form.repo_url }}</span>
</div>
</div>
</div>
<div class="form-row">
<div class="row-label">关键词</div>
<div class="row-content">
<el-select style="width:100%" size="medium" v-model="form.topics" multiple filterable remote
allow-create default-first-option placeholder="请选择标签" :remote-method="searchTopics"
:loading="form.topicLoading">
<el-option v-for="item in topicsList" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</div>
</div>
<div class="form-row">
<div class="row-label baseline">项目简介</div>
<div class="row-content">
<el-input size="medium" type="textarea" :rows="3" placeholder="请输入项目简介(长度不超过255)" :maxLength="255"
v-model="form.description"></el-input>
</div>
</div>
</div>
<div class="form-row">
<div class="row-label required">科技项目</div>
<div class="row-content">
<el-input placeholder="请选择科技项目" size="medium" v-model="form.tech_show" :readonly="true">
<el-button size="medium" slot="append" @click="goSelectTechPrj">选择科技项目</el-button>
</el-input>
</div>
</div>
<div class="form-row">
<div class="row-label required">成果贡献单位</div>
<div class="row-content">
<el-select style="width:100%" size="medium" v-model="form.institution" multiple>
<el-option v-for="item in institutionList" :key="item.key" :label="item.value"
:value="item.value"></el-option>
</el-select>
</div>
</div>
<div class="form-btn-group">
<el-button size="medium" type="primary" class="btn confirm-btn" @click="submit">提交申请</el-button>
<el-button size="medium" class="btn" @click="cancel">{{ $t('cancel') }}</el-button>
</div>
</div>
</div>
</div>
<div class="form-select-tech-prj" v-show="selectTechPrj">
<div class="form-wrap">
<div class="form-header">选择科技项目</div>
<div class="form-content">
<div class="form-row">
<div class="row-label required">请输入科技项目</div>
<div class="row-content">
<el-input placeholder="请输入内容" size="medium" v-model="form.tech_search_keyword"
@keyup.enter.native="searchTechList" class="input-with-select">
<el-select v-model="form.tech_search_sel" style="width:142px" size="medium" slot="prepend"
placeholder="请选择">
<el-option label="项目立项编号" value="0"></el-option>
<el-option label="参与单位" value="1"></el-option>
<el-option label="项目名称" value="2"></el-option>
</el-select>
<el-button size="medium" slot="append" icon="el-icon-search" @click="searchTechList"></el-button>
</el-input>
</div>
</div>
<div class="form-table">
<div style="margin: 0 20px 30px 20px">
<el-table ref="tableRef" border :data="tableData" style="width:100%" v-loading="loading" stripe>
<el-table-column prop="no" label="项目立项编号" align="center" header-align="center"
width="120"></el-table-column>
<el-table-column prop="name" label="科技项目名称" align="center" header-align="center"
width="150"></el-table-column>
<el-table-column prop="unit" label="项目承担单位" align="center" header-align="center"
width="150"></el-table-column>
<el-table-column prop="allunit" label="所有参与单位" align="center" header-align="center"></el-table-column>
<el-table-column width="100" label="操作" align="center" header-align="center">
<template slot-scope="scope">
<el-button type="primary">选择</el-button>
</template>
</el-table-column>
</el-table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>

<script>
import TopHeader from '../components/TopHeader.vue';
import { getTechs, setOpenIApply, setNoOpenIApply, getCreateRepoUser, getCheckRepoName, getTopics } from '~/apis/modules/tech';

export default {
data() {
return {
form: {
type: 'openi',
url: '',
repo_alias: '',
alias_err: false,
uid: '',
repo_name: '',
name_err: false,
repo_url: '',
topics: [],
topicLoading: false,
description: '',

tech_search_sel: '0',
tech_search_keyword: '',
tech_show: '',

institution: [],
},
selectTechPrj: false,
loading: false,
tableData: [{
selected: '0',
no: 'xxxxxxxxxx1',
name: 'Name NameName',
unit: '项目承担单位项目承担单位1',
allunit: '所有参与单位1、所有参与单位、所有参与单位、所有参与单位、所有参与单位',
}, {
selected: '0',
no: 'xxxxxxxxxx2',
name: 'Name NameName2',
unit: '项目承担单位项目承担单位2',
allunit: '所有参与单位2、所有参与单位、所有参与单位',
}],
topicsList: [],
institutionList: [],
};
},
components: {
TopHeader,
},
methods: {
resetData() {
this.form.url = '';
this.form.repo_alias = '';
this.form.alias_err = false;
this.form.uid = '';
this.form.repo_name = '';
this.form.repo_url = '';
this.form.name_err = false;
this.form.topics = [];
this.form.topicLoading = false;
this.form.description = '';
this.form.tech_search_sel = '0';
this.form.tech_search_keyword = '';
this.form.tech_show = '';
this.form.institution = [];
this.tableData = [];
this.topicsList = [];
},
changeType() {
this.resetData();
},
checkRepoAlias() {
const reg = /^[\u4E00-\u9FA5A-Za-z0-9_.-]{1,100}$/;
const res = reg.test(this.form.repo_alias);
this.form.alias_err = !res;
return res;
},
checkRepoName() {
const reg = /^[A-Za-z0-9_.-]{1,100}$/;
const res = reg.test(this.form.repo_name);
this.form.name_err = !res;
return res;
},
changeUrl() {
if (this.form.type == 'openi') return;
const owner = 'Itx003';
const urlAdd = location.href.split("/")[0] + "//" + location.href.split("/")[2];
const repoValue = this.form.url.match(/^(.*\/)?((.+?)(\.git)?)$/)[3];
this.form.repo_alias = repoValue;
getCheckRepoName({ owner: 'Itx003', q: repoValue }).then(res => {
const repo_name = res.data.name;
this.form.repo_name = repo_name;
this.form.repo_url = `${urlAdd}/${owner}/${repo_name}.git`;
}).catch(err => {
console.log(err);
this.form.repo_name = '';
this.form.repo_url = '';
});
},
changeAlias() {
const owner = 'Itx003';
const aliasValue = this.form.repo_alias;
const urlAdd = location.href.split("/")[0] + "//" + location.href.split("/")[2];
if (aliasValue && this.checkRepoAlias()) {
getCheckRepoName({ owner: 'Itx003', q: aliasValue }).then(res => {
const repo_name = res.data.name;
this.form.repo_name = repo_name;
this.form.repo_url = `${urlAdd}/${owner}/${repo_name}.git`;
}).catch(err => {
console.log(err);
this.form.repo_name = '';
this.form.repo_url = '';
});
} else {
this.form.repo_name = '';
this.form.repo_url = '';
}
},
changeRepoName() {
const owner = 'Itx003';
const repo_name = this.form.repo_name;
const urlAdd = location.href.split("/")[0] + "//" + location.href.split("/")[2];
if (this.checkRepoName()) {
this.form.repo_url = `${urlAdd}/${owner}/${repo_name}.git`;
} else {
this.form.repo_url = '';
}
},
searchTopics(query) {
if (query !== '') {
this.form.topicLoading = true;
getTopics({ q: query }).then(res => {
this.form.topicLoading = false;
const topics = res.data.topics || [];
this.topicsList = topics.map(item => {
return {
value: item.topic_name,
label: item.topic_name,
}
});
}).catch(err => {
this.topicsList = [];
});
} else {
this.topicsList = [];
}
},
goSelectTechPrj() {
this.selectTechPrj = true;
},
searchTechList() {
getTechs({
no: this.form.tech_search_sel == '0' ? this.form.tech_search_keyword : '',
institution: this.form.tech_search_sel == '1' ? this.form.tech_search_keyword : '',
name: this.form.tech_search_sel == '2' ? this.form.tech_search_keyword : '',
}).then(res => {
console.log(res);
}).catch(err => {
console.log(err);
})
},
changeTableSelect(row) {
for (let i = 0, iLen = this.tableData.length; i < iLen; i++) {
this.tableData[i].selected = '0';
}
row.selected = '1';
this.$refs.tableRef.setCurrentRow(row);
},
submit() {
console.log(this.form);
},
cancel() {
window.history.back();
}
},
beforeMount() {
getCreateRepoUser().then(res => {
console.log(res);
}).catch(err => {
console.log(err);
});
},
mounted() {

},
beforeDestroy() { },
};
</script>

<style scoped lang="less">
.title {
text-align: center;
margin: 30px 0;
font-size: 14px;
color: rgb(16, 16, 16);
}

.form-c,
.form-select-tech-prj {
display: flex;
justify-content: center;

.form-wrap {
width: 1000px;
background: rgb(255, 255, 255);
border-color: rgb(212, 212, 213);
border-width: 1px;
border-style: solid;
border-radius: 5px;
box-sizing: border-box;

.form-header {
height: 45px;
background: rgb(240, 240, 240);
border-bottom: 1px solid rgb(212, 212, 213);
color: rgb(16, 16, 16);
padding-left: 16px;
font-size: 16px;
font-weight: 700;
display: flex;
align-items: center;
}

.form-content {
margin-top: 40px;

.form-row {
display: flex;
align-items: center;
width: 80%;
margin: 20px auto;
padding-right: 50px;

.row-label {
flex: 2;
text-align: right;
margin-right: 24px;
position: relative;

&.required {
&::after {
position: absolute;
top: -2px;
right: -10px;
content: '*';
color: #db2828;
}
}

&.baseline {
align-self: baseline;
margin-top: 11px;
}
}

.row-content {
flex: 9;

.tips {
margin-top: 4px;
font-size: 14px;
color: rgb(136, 136, 136);


}
}

.reop-url-c {
display: flex;
align-items: center;
}

.openi-repo-url {
color: rgba(16, 16, 16, 1);
}

&.form-row-err {
.row-label {
color: #9f3a38;
}

/deep/ .el-input__inner:not([readonly="readonly"]) {
color: #9f3a38;
background: #fff6f6;
border-color: #e0b4b4;
}
}
}

.form-table {
margin-top: 30px;
margin-bottom: 30px;

/deep/ .el-table__header {
th {
background: rgb(249, 249, 249);
font-size: 12px;
color: rgb(136, 136, 136);
font-weight: normal;
}
}

/deep/ .el-table__body {
td {
font-size: 12px;
}
}

/deep/ .el-radio__label {
display: none;
}
}

.form-btn-group {
display: flex;
justify-content: center;
align-items: center;
margin: 30px 0 40px;
}
}
}
}

.btn {
color: rgb(2, 0, 4);
background-color: rgb(194, 199, 204);
border-color: rgb(194, 199, 204);

&.confirm-btn {
color: #fff;
background-color: rgb(56, 158, 13);
border-color: rgb(56, 158, 13);
margin-right: 20px;
}
}
</style>

+ 17
- 0
web_src/vuepages/pages/tech/create/vp-tech-create.js View File

@@ -0,0 +1,17 @@
import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import localeEn from 'element-ui/lib/locale/lang/en';
import localeZh from 'element-ui/lib/locale/lang/zh-CN';
import { i18n, lang } from '~/langs';
import App from './index.vue';

Vue.use(ElementUI, {
locale: lang === 'zh-CN' ? localeZh : localeEn,
size: 'small',
});

new Vue({
i18n,
render: (h) => h(App),
}).$mount('#__vue-root');

+ 92
- 0
web_src/vuepages/pages/tech/repoview/index.vue View File

@@ -0,0 +1,92 @@
<template>
<div>
<TopHeader :menu="1"></TopHeader>
<div class="ui container">
<SearchBar :condition="condition" @changeCondition="changeCondition"></SearchBar>
<div class="conent-c">
<div class="filter-c">
<Filters :type="1" :condition="condition" @changeCondition="changeCondition"></Filters>
</div>
<div class="result-c">
<PrjResultsList ref="resultListRef" :condition="condition"></PrjResultsList>
</div>
</div>
</div>
</div>
</template>

<script>
import TopHeader from '../components/TopHeader.vue';
import SearchBar from '../components/SearchBar.vue';
import Filters from '../components/Filters.vue';
import PrjResultsList from '../components/PrjResultsList.vue';
import { getUrlSearchParams } from '~/utils';

export default {
data() {
return {
condition: {
q: '', // 搜索框
topic: '', // 关键词
project_name: '', // 项目类型
institution_name: '', // 成果贡献单位

page: '',
pageSize: '',
sort: '',
},
pageSizes: [15, 30, 50, 100],
};
},
components: {
TopHeader,
SearchBar,
Filters,
PrjResultsList
},
methods: {
changeCondition(params) {
this.condition = {
...this.condition,
...params,
};
window.location.href = `/tech/repo_view?` + `q=${encodeURIComponent(this.condition.q.trim())}` +
`&topic=${encodeURIComponent(this.condition.topic)}` +
`&project_name=${encodeURIComponent(this.condition.project_name)}` +
`&institution_name=${encodeURIComponent(this.condition.institution_name)}` +
`&page=${encodeURIComponent(this.condition.page)}` +
`&pageSize=${encodeURIComponent(this.condition.pageSize)}` +
`&sort=${encodeURIComponent(this.condition.sort)}`;
},
},
beforeMount() {
const urlParams = getUrlSearchParams();
this.condition.q = urlParams.q || '';
this.condition.topic = urlParams.topic || '';
this.condition.project_name = urlParams.project_name || '';
this.condition.institution_name = urlParams.institution_name || '';
this.condition.sort = urlParams.sort || '';
this.condition.page = Number(urlParams.page) || 1;
this.condition.pageSize = this.pageSizes.indexOf(Number(urlParams.pageSize)) >= 0 ? Number(urlParams.pageSize) : 15;
},
mounted() { },
beforeDestroy() { },
};
</script>

<style scoped lang="less">
.conent-c {
display: flex;
}

.filter-c {
flex: 1;
padding-left: 12px;
}

.result-c {
margin-left: 10px;
flex: 3;
}
</style>


+ 17
- 0
web_src/vuepages/pages/tech/repoview/vp-tech-repoview.js View File

@@ -0,0 +1,17 @@
import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import localeEn from 'element-ui/lib/locale/lang/en';
import localeZh from 'element-ui/lib/locale/lang/zh-CN';
import { i18n, lang } from '~/langs';
import App from './index.vue';

Vue.use(ElementUI, {
locale: lang === 'zh-CN' ? localeZh : localeEn,
size: 'small',
});

new Vue({
i18n,
render: (h) => h(App),
}).$mount('#__vue-root');

+ 93
- 0
web_src/vuepages/pages/tech/techview/index.vue View File

@@ -0,0 +1,93 @@
<template>
<div>
<TopHeader :menu="0"></TopHeader>
<div class="ui container">
<SearchBar :condition="condition" @changeCondition="changeCondition"></SearchBar>
<div class="conent-c">
<div class="filter-c">
<Filters :type="0" :condition="condition" @changeCondition="changeCondition"></Filters>
</div>
<div class="result-c">
<SciAndTechPrjList ref="resultListRef" :condition="condition"></SciAndTechPrjList>
</div>
</div>
</div>
</div>
</template>

<script>
import TopHeader from '../components/TopHeader.vue';
import SearchBar from '../components/SearchBar.vue';
import Filters from '../components/Filters.vue';
import SciAndTechPrjList from '../components/SciAndTechPrjList.vue';
import { getUrlSearchParams } from '~/utils';

export default {
data() {
return {
condition: {
q: '', // 搜索框
type_name: '', // 项目类型
institution_name: '', // 项目参与单位
execute_year: '', // 执行周期包含年份
apply_year: '',
page: '',
pageSize: '',
sort: '',
},
pageSizes: [15, 30, 50, 100],
};
},
components: {
TopHeader,
SearchBar,
Filters,
SciAndTechPrjList
},
methods: {
changeCondition(params) {
this.condition = {
...this.condition,
...params,
};
window.location.href = `/tech/tech_view?` + `q=${encodeURIComponent(this.condition.q.trim())}` +
`&type_name=${encodeURIComponent(this.condition.type_name)}` +
`&institution_name=${encodeURIComponent(this.condition.institution_name)}` +
`&execute_year=${encodeURIComponent(this.condition.execute_year)}` +
`&apply_year=${encodeURIComponent(this.condition.apply_year)}` +
`&page=${encodeURIComponent(this.condition.page)}` +
`&pageSize=${encodeURIComponent(this.condition.pageSize)}` +
`&sort=${encodeURIComponent(this.condition.sort)}`;
},
},
beforeMount() {
const urlParams = getUrlSearchParams();
this.condition.q = urlParams.q || '';
this.condition.type_name = urlParams.type_name || '';
this.condition.institution_name = urlParams.institution_name || '';
this.condition.execute_year = urlParams.execute_year || '';
this.condition.apply_year = urlParams.apply_year || '';
this.condition.sort = urlParams.sort || '';
this.condition.page = Number(urlParams.page) || 1;
this.condition.pageSize = this.pageSizes.indexOf(Number(urlParams.pageSize)) >= 0 ? Number(urlParams.pageSize) : 15;
},
mounted() { },
beforeDestroy() { },
};
</script>

<style scoped lang="less">
.conent-c {
display: flex;
}

.filter-c {
flex: 1;
padding-left: 12px;
}

.result-c {
margin-left: 10px;
flex: 3;
}
</style>

+ 17
- 0
web_src/vuepages/pages/tech/techview/vp-tech-techview.js View File

@@ -0,0 +1,17 @@
import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import localeEn from 'element-ui/lib/locale/lang/en';
import localeZh from 'element-ui/lib/locale/lang/zh-CN';
import { i18n, lang } from '~/langs';
import App from './index.vue';

Vue.use(ElementUI, {
locale: lang === 'zh-CN' ? localeZh : localeEn,
size: 'small',
});

new Vue({
i18n,
render: (h) => h(App),
}).$mount('#__vue-root');

Loading…
Cancel
Save