Commit 0a1a1472 authored by huangjs's avatar huangjs

init

parents
Pipeline #988 failed with stages
{
"env": {
"test": {
"presets": [
[
"@babel/preset-env",
{
"targets": {
"node": "current"
}
}
]
]
}
}
}
# editorconfig.org
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.md]
trim_trailing_whitespace = false
module.exports = {
root: true,
env: {
browser: true,
node: true
},
parserOptions: {
parser: 'babel-eslint'
},
extends: [
'@nuxtjs',
'prettier',
'prettier/vue',
// 'plugin:prettier/recommended',
'plugin:nuxt/recommended'
],
plugins: ['prettier'],
// add your custom rules here
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-alert': process.env.NODE_ENV === 'production' ? 'error' : 'off'
}
}
* text=auto eol=lf
\ No newline at end of file
# Created by .ignore support plugin (hsz.mobi)
### Node template
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# TypeScript v1 declaration files
typings/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
# parcel-bundler cache (https://parceljs.org/)
.cache
# next.js build output
.next
# nuxt.js build output
.nuxt
# Nuxt generate
dist
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless
# IDE / Editor
.idea
# Service worker
sw.*
# Mac OSX
.DS_Store
# Vim swap files
*.swp
dist/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
/test/unit/coverage/
/test/e2e/reports/
selenium-debug.log
# Editor directories and files
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
{
"printWidth": 120,
"tabWidth": 2,
"useTabs": false,
"eslintIntegration": true,
"semi": false,
"arrowParens": "always",
"singleQuote": true,
"quoteProps": "as-needed",
"jsxSingleQuote": true,
"trailingComma": "none",
"bracketSpacing": true,
"jsxBracketSameLine": true,
"endOfLine": "lf"
}
FROM docker.io/node
ENV TZ=Asia/Shanghai
ENV NODE_ENV=production
ENV HOST 0.0.0.0
RUN /bin/cp /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN mkdir -p /html
COPY . /html
WORKDIR /html
EXPOSE 8080
ENTRYPOINT ["npm", "start"]
空中课堂pc
<!-- 自定义模版 -->
<!DOCTYPE html>
<!--[if IE 9]><html lang="en-US" class="lt-ie9 ie9" {{ HTML_ATTRS }}><![endif]-->
<!--[if (gt IE 9)|!(IE)]><!--><html {{ HTML_ATTRS }}><!--<![endif]-->
<head {{ HEAD_ATTRS }}>
{{ HEAD }}
</head>
<body {{ BODY_ATTRS }}>
{{ APP }}
</body>
</html>
# ASSETS
**此目录不是必需的,如果不想使用,可以将其删除。**
此目录包含未编译的资源,如less、sass或javascript。
1. audio:音频
2. video:视频
3. img:图片
4. fonts:字体
5. 通用scss: 非 7 + 1 模式,主要是存放公共的scss
6. 第三方打包好的JS
7.
\ No newline at end of file
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
*{box-sizing:border-box}html,body,h1,h2,h3,h4,h5,h6,div,dl,dt,dd,ul,ol,li,p,blockquote,pre,hr,figure,table,caption,th,td,form,fieldset,legend,input,button,textarea,menu{font-family:'Microsoft YaHei';margin:0;padding:0}header,footer,section,article,aside,nav,hgroup,address,figure,figcaption,menu,details{display:block}table{border-collapse:collapse;border-spacing:0}caption,th{text-align:left;font-weight:normal}html,body,fieldset,img,iframe,abbr{border:0}i,cite,em,var,address,dfn{font-style:normal}[hidefocus],summary{outline:0}li{list-style:none}h1,h2,h3,h4,h5,h6,small{font-size:100%}sup,sub{font-size:83%}pre,code,kbd,samp{font-family:inherit}q:before,q:after{content:none}textarea{overflow:auto;resize:none}label,summary{cursor:default}a,button{cursor:pointer}h1,h2,h3,h4,h5,h6,em,strong,b{font-weight:bold}del,ins,u,s,a,a:hover{text-decoration:none}body,textarea,input,button,select,keygen,legend{font:12px/1.14 Microsoft YaHei, arial, \5b8b\4f53;color:#333;outline:0}body{background:#ffffff}a,a:hover{color:#333}.text-danger{color:#FF5E5E}.text-success{color:#82EF2C}
// js动态控制屏幕的基准值
;(function(win) {
var doc = win.document
var docEl = doc.documentElement
var tid
function refreshRem() {
var width = docEl.getBoundingClientRect().width
if (width < 1440) {
// 最大宽度
width = 1440
}
var rem = width / 10 // 将屏幕宽度分成10份, 1份为1rem
docEl.style.fontSize = rem + 'px'
}
win.addEventListener(
'resize',
function() {
clearTimeout(tid)
tid = setTimeout(refreshRem, 300)
win.location.reload()
},
false
)
win.addEventListener(
'pageshow',
function(e) {
if (e.persisted) {
clearTimeout(tid)
tid = setTimeout(refreshRem, 300)
}
},
false
)
refreshRem()
})(window)
$baseFontSize: 190;
@function px2rem($px){
@return $px /$baseFontSize * 1rem;
}
html {
font-size: 10vw;
}
$fontSize12:px2rem(12);
$fontSize14:px2rem(14);
$fontSize16:px2rem(16);
$fontSize18:px2rem(18);
$fontSize20:px2rem(20);
$fontSize24:px2rem(24);
$fontSize30:px2rem(30);
@media screen and (min-width: 1000px) {
html {
font-size: 120px;
}
}
@media screen and (min-width: 1200px) {
html {
font-size: 140px;
}
}
@media screen and (min-width: 1300px) {
html {
font-size: 140px;
}
}
@media screen and (min-width: 1400px) {
html {
font-size: 140px;
}
}
@media screen and (min-width: 1500px) {
html {
font-size: 140px;
}
}
@media screen and (min-width: 1900px) {
html {
font-size: 150px;
}
}
html{
height: 100%;
body{
height: 100%;
overflow: auto;
}
}
.page{
margin: auto;
padding-left: 40px;
padding-right: 50px;
}
.d-box{
width: 100%;
overflow: hidden;
margin-top: 10px;
.d-menu{
width: 145px;
float: left;
// height: 100%;
height: auto;
margin-top: -13px;
&.d-menu-fix{
position: fixed;
background: #ffffff;
margin-top: 0;
z-index: 99;
}
.el-menu{
border-radius: 10px;
&.el-button--primary.is-plain,
&.el-button--primary.is-plain.is-disabled,
&.el-button--primary.is-plain.is-disabled:active,
&.el-button--primary.is-plain.is-disabled:focus,
&.el-button--primary.is-plain.is-disabled:hover{
background: transparent !important;
border-color: transparent !important;
}
.el-menu-item{
padding: 0 10px;
padding-left: 10px !important;
height: 40px;
line-height: 40px;
text-align: left;
position: relative;
&.is-active::after{
content: '';
height: 30px;
width: 2px;
background: #013E93;
position: absolute;
right: 0;
top: 5px;
display: none;
}
&:focus, &:hover{
background: transparent !important;
}
}
}
}
.d-content{
padding-left: 20px;
overflow-x: hidden;
overflow-y: hidden;
&.d-content-fix{
width: calc( 100% - 165px );
float: right;
.el-collapse{
background: #ffffff;
border: none;
.el-collapse-item__header{
color: #013E93;
font-size: 14px;
border-bottom: 1px solid #EBEEF5;
}
.el-collapse-item__wrap{
border-bottom: none;
padding-top: 10px;
}
}
}
}
}
/* function */
.f-cb:after, .f-cbli li:after {
display: block;
clear: both;
visibility: hidden;
height: 0;
overflow: hidden;
content: ".";
}
.f-cb, .f-cbli li {
zoom: 1;
}
.f-ib {
display: inline-block;
*display: inline;
*zoom: 1;
}
.f-dn {
display: none;
}
.f-db {
display: block;
}
.f-fl {
float: left;
}
.f-fr {
float: right;
}
.f-pr {
position: relative;
}
.f-prz {
position: relative;
zoom: 1;
}
.f-oh {
overflow: hidden;
}
.f-ff0 {
font-family: arial, \5b8b\4f53;
}
.f-ff1 {
font-family: "Microsoft YaHei", \5fae\8f6f\96c5\9ed1, arial, \5b8b\4f53;
}
.f-fs1 {
font-size: 12px;
}
.f-fs2 {
font-size: 14px;
}
.f-fwn {
font-weight: normal;
}
.f-fwb {
font-weight: bold;
}
.f-tal {
text-align: left;
}
.f-tac {
text-align: center;
}
.f-tar {
text-align: right;
}
.f-taj {
text-align: justify;
text-justify: inter-ideograph;
}
.f-vam, .f-vama * {
vertical-align: middle;
}
.f-wsn {
word-wrap: normal;
white-space: nowrap;
}
.f-pre {
overflow: hidden;
text-align: left;
white-space: pre-wrap;
word-wrap: break-word;
word-break: break-all;
}
.f-wwb {
white-space: normal;
word-wrap: break-word;
word-break: break-all;
}
.f-ti {
overflow: hidden;
text-indent: -30000px;
}
.f-ti2 {
text-indent: 2em;
}
.f-lhn {
line-height: normal;
}
.f-tdu, .f-tdu:hover {
text-decoration: underline;
}
.f-tdn, .f-tdn:hover {
text-decoration: none;
}
.f-toe {
overflow: hidden;
word-wrap: normal;
white-space: nowrap;
text-overflow: ellipsis;
}
.f-csp {
cursor: pointer;
}
.f-csd {
cursor: default;
}
.f-csh {
cursor: help;
}
.f-csm {
cursor: move;
}
.f-usn {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
user-select: none;
}
\ No newline at end of file
@charset "utf-8";
/* CSS Document */
body,ol,ul,h1,h2,h3,h4,h5,h6,p,th,td,dl,dd,form,fieldset,legend,input,textarea,select,td{margin:0;padding:0;}
a,u,s,del{color:#000;text-decoration:none}
fieldset ,a img,.bor0{border:0;}
i,em,b{font-style:normal;font-weight:100;}
li{list-style:none;}
img{vertical-align:middle;}
table{border-collapse:collapse;}/*合并边框*/
textarea{resize:none;/*禁止拖动*/}
.ind2{text-indent:2em;}
/*溢出隐藏*/
.over{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
/*图片垂直对齐*/
.valign{text-align:center;}
.valign img{vertical-align:middle;}
.valign:after{content:"";display:inline-block;vertical-align:middle;height:100%;}
/*万能清除法*/
.clear:before{content:"" ;display:table;}/*阻止margin-top向上传递*/
.clear:after{content:"";display:block;clear:both;}/*清除浮动*/
/*弹性盒水平垂直居中*/
.flexc{display:flex;justify-content:center;align-items:center;}
.margin{width: px2rem(1652);margin:auto}
.header{
}
.cur{
cursor: pointer;
}
.mainDetail{
img{
max-width:100% !important;
height: auto!important;
}
}
.over{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.over2{
overflow:hidden;
text-overflow:ellipsis;
display:-webkit-box;
-webkit-box-orient:vertical;
-webkit-line-clamp:2;
}
.over3{
overflow:hidden;
text-overflow:ellipsis;
display:-webkit-box;
-webkit-box-orient:vertical;
-webkit-line-clamp:3;
}
.over4{
overflow:hidden;
text-overflow:ellipsis;
display:-webkit-box;
-webkit-box-orient:vertical;
-webkit-line-clamp:4;
}
.over5{
overflow:hidden;
text-overflow:ellipsis;
display:-webkit-box;
-webkit-box-orient:vertical;
-webkit-line-clamp:5;
}
.over6{
overflow:hidden;
text-overflow:ellipsis;
display:-webkit-box;
-webkit-box-orient:vertical;
-webkit-line-clamp:6;
}
.over7{
overflow:hidden;
text-overflow:ellipsis;
display:-webkit-box;
-webkit-box-orient:vertical;
-webkit-line-clamp:7;
}
.over8{
overflow:hidden;
text-overflow:ellipsis;
display:-webkit-box;
-webkit-box-orient:vertical;
-webkit-line-clamp:8;
}
.flex{display: flex;}
/* reset */
* {
box-sizing: border-box
}
html, body, h1, h2, h3, h4, h5, h6, div, dl, dt, dd, ul, ol, li, p, blockquote, pre, hr, figure, table, caption, th, td, form, fieldset, legend, input, button, textarea, menu {
font-family: 'Microsoft YaHei';
margin: 0;
padding: 0;
}
header, footer, section, article, aside, nav, hgroup, address, figure, figcaption, menu, details {
display: block;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
caption, th {
text-align: left;
font-weight: normal;
}
html, body, fieldset, img, iframe, abbr {
border: 0;
}
i, cite, em, var, address, dfn {
font-style: normal;
}
[hidefocus], summary {
outline: 0;
}
li {
list-style: none;
}
h1, h2, h3, h4, h5, h6, small {
font-size: 100%;
}
sup, sub {
font-size: 83%;
}
pre, code, kbd, samp {
font-family: inherit;
}
q:before, q:after {
content: none;
}
textarea {
overflow: auto;
resize: none;
}
label, summary {
cursor: default;
}
a, button {
cursor: pointer;
}
h1, h2, h3, h4, h5, h6, em, strong, b {
font-weight: bold;
}
del, ins, u, s, a, a:hover {
text-decoration: none;
}
body, textarea, input, button, select, keygen, legend {
font: 12px/1.14 Microsoft YaHei, arial, \5b8b\4f53;
color: #333;
outline: 0;
}
body {
background: #ffffff;
}
a, a:hover {
color: #333;
}
.text-danger{
color: #FF5E5E;
}
.text-success{
color: #82EF2C;
}
@media screen and (min-width: 800px){
.text12 {
font-size: px2rem(12);
}
.text14 {
font-size: px2rem(14);
}
.text16 {
font-size: px2rem(16);
}
.text18 {
font-size: px2rem(18);
}
.text20 {
font-size: px2rem(20);
}
.text22 {
font-size: px2rem(22);
}
.text24 {
font-size: px2rem(24);
}
.text26 {
font-size: px2rem(26);
}
.text28 {
font-size: px2rem(28);
}
.text30 {
font-size: px2rem(30);
}
.text32 {
font-size: px2rem(32);
}
/* ==================
color
==================== */
.text-black,
.line-black,
.lines-black {
color: #333333;
}
.text-white,
.line-white,
.lines-white {
color: #ffffff;
}
/* -- flex -- */
.flex {
display: flex;
}
.basis20 {
flex-basis: 20%;
}
.basis40 {
flex-basis: 40%;
}
.basis50 {
flex-basis: 50%;
}
.basis60 {
flex-basis: 60%;
}
.basis80 {
flex-basis: 80%;
}
/* -- margin -- */
.margin-0 {
margin: 0;
}
.margin10 {
margin: px2rem(10);
}
.margin20 {
margin: px2rem(20);
}
.margin30 {
margin: px2rem(30);
}
.margin40 {
margin: px2rem(40);
}
.margin50 {
margin: px2rem(50);
}
.margin-top10 {
margin-top: px2rem(10);
}
.margin-top20 {
margin-top: px2rem(20);
}
.margin-top30 {
margin-top: px2rem(30);
}
.margin-top40 {
margin-top: px2rem(40);
}
.margin-top50 {
margin-top: px2rem(50);
}
.margin-right10 {
margin-right: px2rem(10);
}
.margin-right20 {
margin-right: px2rem(20);
}
.margin-right30 {
margin-right: px2rem(30);
}
.margin-right40 {
margin-right: px2rem(40);
}
.margin-right50 {
margin-right: px2rem(50);
}
.margin-bottom10 {
margin-bottom: px2rem(10);
}
.margin-bottom20 {
margin-bottom: px2rem(20);
}
.margin-bottom30 {
margin-bottom: px2rem(30);
}
.margin-bottom40 {
margin-bottom: px2rem(40);
}
.margin-bottom50 {
margin-bottom: px2rem(50);
}
.margin-left10 {
margin-left: px2rem(10);
}
.margin-left20 {
margin-left: px2rem(20);
}
.margin-left30 {
margin-left: px2rem(30);
}
.margin-left40 {
margin-left: px2rem(40);
}
.margin-left50 {
margin-left: px2rem(50);
}
.margin-lr10 {
margin-left: px2rem(10);
margin-right: px2rem(10);
}
.margin-lr20 {
margin-left: px2rem(20);
margin-right: px2rem(20);
}
.margin-lr30 {
margin-left: px2rem(30);
margin-right: px2rem(30);
}
.margin-lr40 {
margin-left: px2rem(40);
margin-right: px2rem(40);
}
.margin-lr50 {
margin-left: px2rem(50);
margin-right: px2rem(50);
}
.margin-tb10 {
margin-top: px2rem(10);
margin-bottom: px2rem(10);
}
.margin-tb20 {
margin-top: px2rem(20);
margin-bottom: px2rem(20);
}
.margin-tb30 {
margin-top: px2rem(30);
margin-bottom: px2rem(30);
}
.margin-tb40 {
margin-top: px2rem(40);
margin-bottom: px2rem(40);
}
.margin-tb50 {
margin-top: px2rem(50);
margin-bottom: px2rem(50);
}
.padding-0 {
padding: 0;
}
.padding10 {
padding: px2rem(10);
}
.padding20 {
padding: px2rem(20);
}
.padding30 {
padding: px2rem(30);
}
.padding40 {
padding: px2rem(40);
}
.padding50 {
padding: px2rem(50);
}
.padding-top10 {
padding-top: px2rem(10);
}
.padding-top20 {
padding-top: px2rem(20);
}
.padding-top30 {
padding-top: px2rem(30);
}
.padding-top40 {
padding-top: px2rem(40);
}
.padding-top50 {
padding-top: px2rem(50);
}
.padding-right10 {
padding-right: px2rem(10);
}
.padding-right20 {
padding-right: px2rem(20);
}
.padding-right30 {
padding-right: px2rem(30);
}
.padding-right40 {
padding-right: px2rem(40);
}
.padding-right50 {
padding-right: px2rem(50);
}
.padding-bottom10 {
padding-bottom: px2rem(10);
}
.padding-bottom20 {
padding-bottom: px2rem(20);
}
.padding-bottom30 {
padding-bottom: px2rem(30);
}
.padding-bottom40 {
padding-bottom: px2rem(40);
}
.padding-bottom50 {
padding-bottom: px2rem(50);
}
.padding-left10 {
padding-left: px2rem(10);
}
.padding-left20 {
padding-left: px2rem(20);
}
.padding-left30 {
padding-left: px2rem(30);
}
.padding-left40 {
padding-left: px2rem(40);
}
.padding-left50 {
padding-left: px2rem(50);
}
.padding-lr10 {
padding-left: px2rem(10);
padding-right: px2rem(10);
}
.padding-lr20 {
padding-left: px2rem(20);
padding-right: px2rem(20);
}
.padding-lr30 {
padding-left: px2rem(30);
padding-right: px2rem(30);
}
.padding-lr40 {
padding-left: px2rem(40);
padding-right: px2rem(40);
}
.padding-lr50 {
padding-left: px2rem(50);
padding-right: px2rem(50);
}
.padding-tb10 {
padding-top: px2rem(10);
padding-bottom: px2rem(10);
}
.padding-tb20 {
padding-top: px2rem(20);
padding-bottom: px2rem(20);
}
.padding-tb30 {
padding-top: px2rem(30);
padding-bottom: px2rem(30);
}
.padding-tb40 {
padding-top: px2rem(40);
padding-bottom: px2rem(40);
}
.padding-tb50 {
padding-top: px2rem(50);
padding-bottom: px2rem(50);
}
.justify-between{
justify-content: space-between;
}
.justify-center{
justify-content: center;
}
.justify-end{
justify-content: flex-end;
}
.justify-start{
justify-content: flex-start;
}
.justify-around{
justify-content: space-around;
}
.flex-wrap{
flex-wrap: wrap;
}
.align-center{
align-items: center;
}
}
.detailHtml{
max-width: 100% !important;
img,table{
max-width: 100% !important;
margin:auto;
height:auto !important;
}
a,span{
word-break:break-all !important
}
}
$--color-primary:#013E93;
$--color-success:#00A77E;
$--color-warning:#FF9421;
$--color-danger:#D84040;
$--color-info:#006AD6;
$--color-text-primary:#333333;
$--color-text-regular:#666666;
$--color-text-secondary:#999999;
$--color-text-placeholder:#DDDDDD;
$--color-disable: #678bbe;
html,body,#app{
width: 100%;
height: 100%;
}
.el-form--inline .el-form-item__label{
}
.el-button--primary{
}
.el-input__inner, .el-textarea__inner{
background-color: inherit;
border-color: #2E5481 !important;
}
/* table */
.table-container{
//background: url(~@/assets/img/bg_table_outer.png) no-repeat;
//background-size: 100% auto;
//background-color: rgba(15,66,105,0.6);
background: linear-gradient(to bottom, rgba(15,66,105,0.6), rgba(4,13,26,1));
.table-box{
padding: 20px;
.table-bar{
text-align: right;
}
}
}
.el-table, .el-table__expanded-cell{
background-color: transparent;
}
.el-table{
thead{
background: url(~@/assets/img/bg_table_thead.png) no-repeat;
background-size: 100% 100%;
}
tr, th{
background-color: transparent;
}
th.is-leaf{
border: none;
color: #2ADCF1;
}
td{
border-color: #091A2E;
// color: #247FBF;
color: #D5DAE1;
}
.el-checkbox__inner{
background-color: inherit;
border-color: #30557F;
margin-right: 5px;
}
}
.el-textarea__inner{
color: #D5DAE1;
}
.el-table__body-wrapper{
background: url(~@/assets/img/bg_table_tbody.png) no-repeat top;
background-size: 100% auto;
}
.el-table--border, .el-table--group{
border: none;
}
.hover-row td{
background-color: #155C94 !important;
}
.el-table__row:hover {
td{
background-color: #155C94 !important;
}
}
.el-table--border::after, .el-table--group::after, .el-table::before{
background-color: inherit;
}
/* page */
.el-pagination{
text-align: center;
}
.el-pagination.is-background .btn-next, .el-pagination.is-background .btn-prev, .el-pagination.is-background .el-pager li{
background-color: inherit;
border: 1px solid #5685BE;
border-radius: 2px;
color: #4279BC;
}
/* dialog */
.el-dialog{
margin-top: 0 !important;
width: 500px;
float: right;
margin: 0;
min-height: 100%;
/*height: 100%;*/
background-color: rgba(1,4,8,0.8);
.el-dialog__title{
color: #fff;
}
.el-form-item__label{
width: 100px !important;
color: #24A5FF;
}
.el-form-item__content{
margin-left: 100px !important;
}
.el-dialog__footer{
text-align: center;
}
.avatar-uploader .el-upload {
border: 1px dashed #2E5481;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.cate-file .el-upload {
width: 100%;
height: 40px;
}
.avatar-uploader .el-upload:hover {
border-color: #409EFF;
}
.avatar-uploader-icon {
font-size: 28px;
color: #2E5481;
width: 100px;
height: 100px;
line-height: 100px;
text-align: center;
}
.avatar {
width: 100px;
height: 100px;
display: block;
}
}
.el-select{
width: 100%;
}
.big-sub-title{
color: #2DEBFF;
font-size: 18px;
font-weight: 600;
text-align: center;
line-height: 60px;
}
.el-tree {
//color: #2073a7;
color: #409EDD;
background: transparent;
}
.el-tree-node__content:hover {
background-color: #003c60;
}
.el-tree-node:focus>.el-tree-node__content {
background-color: #003c60;
}
.checkbox-option {
display: block;
margin: 0 0 15px 0;
//color: #2073a7;
color: #409EDD;
}
.el-loading-mask{
background-color: rgba(16,54,87, .9)
}
::-webkit-scrollbar {width:8px;height:8px;}
::-webkit-scrollbar-thumb {border-radius:10px;background:#dadfe6;}
::-webkit-scrollbar-track {background-color:rgba(218,223,230,.3);border-radius:10px;}
.el-input.is-disabled .el-input__inner{
background-color: #02070E;
}
.el-input__inner{
color: #C0C4CC;
}
.el-input--suffix .el-input__inner{
padding-right: 20px;
}
.site-content {
padding: 0 30px;
.site-content-wrapper{
/*background: url(~@/assets/img/content_bg.png) center no-repeat;*/
/*background-size: 100% 100%;*/
background: rgba(22,58,85,0.2);
background-image: url(~@/assets/img/content_bg-top.png),url(~@/assets/img/content_bg-bottom.png);
background-repeat: no-repeat, no-repeat;
background-position: center top, center bottom;
background-size: 100% auto, 100% auto;
padding: 30px 60px;
}
}
.el-dialog__body{
color: #D5DAE1;
}
.el-range-editor .el-range-input{
background-color: transparent;
color: #D5DAE1;
}
.el-dialog__headerbtn .el-dialog__close{
color: #fff!important;
}
.el-upload-list__item, .el-upload-list--picture-card .el-upload-list__item-actions{
transition-duration: 0s !important;
}
@media screen and (max-height: 770px) {
.site-wrapper.site-page--login .site-content__wrapper{
top: 200px !important;
}
}
@import 'base/base';
@import 'base/reset';
@import 'base/function';
@import 'base/public';
@import 'pages/index';
@import 'base/variables';
@import 'base/variables';
.top{
background: #fff;
height: 120px;
color: #286ab6;
.top-l{
.logo{
img{
width: 80px;
}
}
.text{
margin-left: 16px;
font-size: 18px;
font-weight: bold;
}
}
.top-r{
text-align: center;
.top-r-t{
img{
cursor: pointer;
width: 40px;
}
}
.text{
cursor: pointer;
font-size: 16px;
font-weight: bold;
margin-top: 16px;
}
}
}
.topTwo{
background: #174092;
height: 120px;
.top-l{
.logo{
img{
width: 80px;
}
}
.text{
margin-left: 16px;
font-size: 18px;
color: #fff;
font-weight: bold;
}
}
.top-r{
text-align: center;
.top-r-t{
img{
cursor: pointer;
width: 40px;
}
}
.text{
cursor: pointer;
font-size: 16px;
color: #fff;
font-weight: bold;
margin-top: 16px;
}
}
}
#header{
background: #3e80d6;
line-height: 50px;
color: #fff;
font-size: 18px;
text-align: center;
.header-list{
.item{
width: 180px;
cursor: pointer;
}
.te{
background: #286ab6;
}
}
}
.banner{
img{
width: 100%;
}
}
.index{
background: #f8f8f8;
padding-bottom: 70px;
}
.index-main{
background: #fff;
padding: 0 16px;
margin-top: 30px;
.index-t{
background: #fff;
margin-top: 30px;
padding-bottom: 40px;
text-align: center;
.index-t-list{
padding-left: 40px;
padding-right: 66px;
margin-top: 30px;
.index-t-list-title{
margin-bottom: 42px;
color: #000;
font-size: 16px;
font-weight: bold;
:nth-child(1){
width: 120px;
}
:nth-child(2){
width: 120px;
}
:nth-child(3){
width: 200px;
}
:nth-child(4){
width: 90px;
}
:nth-child(5){
width: 90px;
}
:nth-child(6){
width:130px;
}
:nth-child(7){
width:40px;
:nth-child(1){
width: 40px;
}
}
}
.list-item{
margin-bottom: 20px;
line-height: 24px;
font-size: 16px;
color: #606060;
:nth-child(1){
width: 120px;
}
:nth-child(2){
width: 120px;
}
:nth-child(3){
width: 200px;
}
:nth-child(4){
width: 90px;
}
:nth-child(5){
width: 90px;
}
:nth-child(6){
width:130px;
}
:nth-child(7){
width:40px;
:nth-child(1){
width: 40px;
}
}
}
}
}
}
.index-main-2{
background: #fff;
padding: 0 16px;
margin-top: 30px;
.index-t{
background: #fff;
margin-top: 30px;
padding-bottom: 40px;
text-align: center;
.index-t-list{
padding-left: 40px;
padding-right: 66px;
margin-top: 30px;
.index-t-list-title{
margin-bottom: 42px;
color: #000;
font-size: 16px;
font-weight: bold;
:nth-child(1){
width: 144px;
}
:nth-child(2){
width: 80px;
}
:nth-child(3){
width: 96px;
}
:nth-child(4){
width: 200px;
}
:nth-child(5){
width: 104px;
}
:nth-child(6){
width: 256px;
}
}
.list-item{
margin-bottom: 20px;
line-height: 24px;
font-size: 16px;
color: #606060;
:nth-child(1){
width: 144px;
}
:nth-child(2){
width: 80px;
}
:nth-child(3){
width: 96px;
}
:nth-child(4){
width: 200px;
}
:nth-child(5){
width: 80px;
}
:nth-child(6){
width: 280px;
}
}
}
}
}
.titleBox{
height: 70px;
position: relative;
margin-bottom: 30px;
.title{
font-size: 18px;
font-weight: bold;
color: #116ac8;
line-height: 50px;
.name{
padding-right: 40px;
border-bottom: 4px solid #116ac8;
font-size: 18px;
left: 0;
bottom: -4px
}
.more{
right: 0;
bottom:0
}
span{
position: absolute;
font-size: 16px;
z-index: 4;
}
}
.line{
height: 4px;
background: #f8f8f8;
position: absolute;
width: 100%;
bottom: -4px;
z-index: 3;
}
}
.mainPage{
width: 1200px;
margin: auto;
}
.pointer{
cursor: pointer;
}
<template>
<div id="footer">
</div>
</template>
<script>
export default {
data(){
return {
name: 'Footer',
init:[]
}
},
mounted() {
},
methods: {
}
}
</script>
<style lang="scss" scoped>
</style>
<template>
<div id='header'>
<div class='mainPage header-list flex'>
<div :class="index===0?'te':''" @click='jump(0)' class='item'> 首页</div>
<div :class="index===1?'te':''" @click='jump(1)' class='item'> 在线直播</div>
<div :class="index===2?'te':''" @click='jump(2)' class='item'> 课程资源</div>
<div @click='jump(3)' class='item'> 专题培训</div>
<div class='item'> 学习擂台</div>
<div class='item'> 积分商城</div>
<div class='item'> 学习资源</div>
</div>
</div>
</template>
<script>
export default {
components: {},
data() {
return {
index: 0
}
},
computed: {},
// fetch() {}, // 与 asyncData 方法类似,用于在渲染页面之前获取数据填充应用的状态树(store)。不同的是 fetch 方法不会设置组件的数据。详情请参考 关于fetch方法的文档。
// head() {}, // 配置当前页面的 Meta 标签, 详情参考 页面头部配置API。
// layout: '', // 指定当前页面使用的布局(layouts 根目录下的布局文件)。详情请参考 关于 布局 的文档。
// loading: true, // 如果设置为false,则阻止页面自动调用this.$nuxt.$loading.finish()和this.$nuxt.$loading.start(),您可以手动控制它,请看例子,仅适用于在nuxt.config.js中设置loading的情况下。请参考API配置 loading 文档。
// transition: '', // 指定页面切换的过渡动效, 详情请参考 页面过渡动效。
// scrollToTop: '', // 布尔值,默认: false。 用于判定渲染页面前是否需要将当前页面滚动至顶部。这个配置用于 嵌套路由的应用场景。
// validate: '', // 校验方法用于校验 动态路由的参数。
// middleware: '' // 指定页面的中间件,中间件会在页面渲染之前被调用, 请参考 路由中间件。
created() {
},
mounted() {
},
methods: {
jump(val) {
this.index = val
if (val === 0) {
this.$router.push('/')
}
}
}
}
</script>
<style lang='scss' scoped>
</style>
<template>
<div class="gallery">
</div>
</template>
<script>
import Swiper from 'swiper'
export default {
name: 'HeaderIndex',
data() {
return {
}
},
components: {
},
created() {
},
mounted() {
},
methods: {
}
}
</script>
<style lang="scss" scoped>
</style>
# COMPONENTS
**此目录不是必需的,如果不想使用,可以将其删除。**
组件目录 components 用于组织应用的 Vue.js 组件。Nuxt.js 不会扩展增强该目录下 Vue.js 组件,即这些组件不会像页面组件那样有 asyncData 方法的特性。
<template>
<div id="banner" class="banner">
<img src="~@/assets/img/index-1.jpg"/>
</div>
</template>
<script>
export default {
components: {
},
data() {
return {
index: 0
}
},
computed: {
},
// fetch() {}, // 与 asyncData 方法类似,用于在渲染页面之前获取数据填充应用的状态树(store)。不同的是 fetch 方法不会设置组件的数据。详情请参考 关于fetch方法的文档。
// head() {}, // 配置当前页面的 Meta 标签, 详情参考 页面头部配置API。
// layout: '', // 指定当前页面使用的布局(layouts 根目录下的布局文件)。详情请参考 关于 布局 的文档。
// loading: true, // 如果设置为false,则阻止页面自动调用this.$nuxt.$loading.finish()和this.$nuxt.$loading.start(),您可以手动控制它,请看例子,仅适用于在nuxt.config.js中设置loading的情况下。请参考API配置 loading 文档。
// transition: '', // 指定页面切换的过渡动效, 详情请参考 页面过渡动效。
// scrollToTop: '', // 布尔值,默认: false。 用于判定渲染页面前是否需要将当前页面滚动至顶部。这个配置用于 嵌套路由的应用场景。
// validate: '', // 校验方法用于校验 动态路由的参数。
// middleware: '' // 指定页面的中间件,中间件会在页面渲染之前被调用, 请参考 路由中间件。
created() {
},
mounted() {
},
methods: {
jump (val) {
this.index = val
if (val === 0) {
this.$router.push('/')
}
}
}
}
</script>
<style lang="scss" scoped>
</style>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<template>
<div>
<div style="display: flex;margin-bottom: 16px;justify-content: space-between;align-items: center">
<div v-if ='summary.numberOfParticipantSum'>参加人数共{{summary.numberOfParticipantSum}}人,活动预算共{{summary.activityBudgetSum}}元,实际费用共{{summary.actualCostSum}}</div>
<div></div>
<el-button type="primary" v-if="!isEdit" :disabled="isEdit" @click="addOrUpdateHandle()" >新增</el-button>
</div>
<el-table
:data="dataList"
border
v-loading="dataListLoading"
style="width: 100%;">
<el-table-column
type="index"
header-align="center"
align="center"
label="序号"
width="50">
</el-table-column>
<el-table-column
prop="activityName"
header-align="center"
align="center"
label="子项目(活动)名称">
</el-table-column>
<el-table-column
prop="activityDate"
header-align="center"
align="center"
label="活动时间"
width="100">
</el-table-column>
<el-table-column
width="100px"
prop="numberOfParticipant"
header-align="center"
align="center"
label="参加人数">
</el-table-column>
<el-table-column
width="100px"
prop="activityBudget"
header-align="center"
align="center"
label="活动预算(元)">
</el-table-column>
<el-table-column
width="100px"
prop="actualCost"
header-align="center"
align="center"
label="实际费用(元)">
</el-table-column>
<el-table-column
prop="activityAddress"
header-align="center"
align="center"
label="活动地点">
</el-table-column>
<el-table-column
width="200px"
header-align="center"
align="center"
label="操作">
<template slot-scope="scope">
<el-button type="text" size="small" title="查看"
@click="addOrUpdateHandle(scope.row.id, 'read')"><span
class="iconfont icon-chakan"></span></el-button>
<el-button :disabled="isEdit" type="text" size="small" title="修改"
v-if = '!isEdit'
@click="addOrUpdateHandle(scope.row.id)"><span
class="iconfont icon-bianji"></span></el-button>
<el-button :disabled="isEdit" type="text" size="small" title="删除"
v-if = '!isEdit'
@click="deleteHandle(scope.row.id)"><span class="iconfont icon-shanchu"></span>
</el-button>
</template>
</el-table-column>
</el-table>
<pActivityListChild @getTableList = 'getDataList' ref="pActivityListChild" :id="id"></pActivityListChild>
</div>
</template>
<script>
// 必填 - 项目活动列表
import pActivityListChild from '~/components/project/p-activity-list-child.vue'
export default {
name: 'p-active-list',
props: {
isEdit:{
type: Boolean,
default: true
}
},
components: {
pActivityListChild
},
data () {
return {
id: '',
dataListLoading: false,
dataList: [],
summary: {
activityBudgetSum: null,
actualCostSum: null,
numberOfParticipantSum: null
}
}
},
// 接收上级组件参数
// inject: ['loadCommunityOfCurrentCommittee', 'getProvinceList', 'parentInit', 'setGetSocialWorkerCertification'],
created () {
},
mounted () {
},
computed: {
},
methods: {
init (id) {
this.id = id
this.getDataList()
this.getSummary()
},
async getDataList () {
const data = await this.$axios.$get('/api/projectInfo/findActivityList?projectId=' + this.id)
this.dataList = data.obj || []
},
async getSummary () {
const data = await this.$axios.$get('/api/projectInfo/activitySummary?projectId=' + this.id)
this.summary = data.obj || {}
},
addOrUpdateHandle (id, type) {
this.$refs.pActivityListChild.init(id, this.id, type)
},
deleteHandle (id) {
this.$confirm(`确定进行${id ? '删除' : '批量删除'}操作?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const data = await this.$axios.$get('/api/projectInfo/deleteActivity?id=' + id)
if (data && data.code === 0) {
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => {
this.getDataList()
}
})
} else {
this.$message.error(data.msg)
}
}).catch(() => {
})
}
}
}
</script>
<style lang="scss" scoped>
</style>
<template>
<div>
<div v-if = !this.people style="color: red;margin-bottom: 30px;margin-left: 70px">如需报名参加投标,请电联项目联系人{{dataForm.linkMan}},投标联系电话:{{dataForm.linkManPhone}}</div>
<el-form :rules="dataRule" :model="dataForm" class="mod_sw_basic_info" ref="baseInfo" label-width="140px">
<el-row >
<el-col :span="12">
<el-form-item label="项目名称" prop="name">
<div style="display: flex">
<el-tooltip :content="dataForm.name" placement="top">
<el-input placeholder="请输入" v-model="dataForm.name" size="mini" :disabled="disabled"/>
</el-tooltip>
<!-- <div style="width: 60px;text-align: center;color: red">-->
<!-- {{projectStatusName}}-->
<!-- </div>-->
</div>
</el-form-item>
</el-col>
<el-col :span="12" style="display: flex">
<el-form-item label="所属区域" prop="" >
<el-select filterable v-model="dataForm.streetId" placeholder="街道/社工委" size="mini" :disabled="true">
<el-option :disabled="true" v-for="item in streetList" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label-width="0" prop="" style="margin-left: 16px">
<el-select filterable v-model="dataForm.communityId" :disabled="true" placeholder="社区" size="mini" >
<el-option :disabled="true" v-for="item in communityList" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row >
<el-col>
<el-form-item label="项目需求" prop="requirement">
<el-input type="textarea" placeholder="请输入" v-model="dataForm.requirement" size="mini" :disabled="disabled"/>
</el-form-item>
</el-col>
</el-row>
<el-row >
<el-col :span="8">
<el-form-item label="项目类型" prop="type">
<el-select v-model="dataForm.type" placeholder="请选择" size="mini" :disabled="disabled">
<el-option :disabled="true" v-for="item in typeList" :key="item.id" :label="item.name" :value="item.code"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="所需经费(元)" prop="funds">
<el-input placeholder="请输入" v-model="dataForm.funds" size="mini" clearable
:disabled="disabled"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="16" >
<el-form-item label="活动频次" prop="activityTimes">
<el-input placeholder="请输入" v-model="dataForm.activityTimes" size="mini" maxlength="16" clearable
:disabled="disabled"/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="服务对象" prop="serviceObject">
<el-input placeholder="请输入" v-model="dataForm.serviceObject" size="mini" clearable
:disabled="disabled"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col style="">
<el-form-item label="活动形式" prop="activityForm">
<el-input type="textarea" placeholder="请输入" v-model="dataForm.activityForm" size="mini" :disabled="disabled"/>
</el-form-item>
</el-col>
</el-row>
<el-row >
<el-col style="">
<el-form-item label="活动目标" prop="activityTarget">
<el-input type="textarea" placeholder="请输入" v-model="dataForm.activityTarget" size="mini" :disabled="disabled"/>
</el-form-item>
</el-col>
</el-row>
<el-row style="" v-if = this.people>
<el-col :span="12">
<el-form-item label="项目联系人" prop="linkMan">
<el-input placeholder="请输入" v-model="dataForm.linkMan" size="mini" :disabled="disabled"/>
</el-form-item>
</el-col>
<el-col :span="12" >
<el-form-item label="项目联系电话" prop="linkManPhone">
<el-input placeholder="请输入" v-model="dataForm.linkManPhone" size="mini" :disabled="disabled"/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script>
// 必填 - 基本信息
// import _ from 'lodash'
export default {
name: 'r-base-info',
props: {
people: {
type: Boolean,
default: false
},
detail: {
type: Object,
default: () => {
return {}
}
},
projectStatusName: {
type: String,
default: ''
}
},
data () {
return {
disabled: true,
communityList: [],
dialogVisible: false,
// editable: '',
dialogType: '',
// myHeaders: {Authorization: this.$cookie.get('Authorization')},
serverCode: 'LocalServer',
streetList: [],
fileList: [],
dataForm: {
name: null, // 项目名称
streetId: null, // 街道
communityId: null, // 社区
requirement: null, // 项目需求
type: null, // 项目类型
funds: null, // 所需经费
serviceObject: null, // 服务对象
activityTimes: null, // 活动频次
openPublic: null, // 是否对外发布
activityForm: null, // 活动形式
activityTarget: null, // 活动目标
linkMan: null, // 项目联系人
linkManPhone: null, // 项目联系人电话,
line: null, // 所属线条
capitalSource: null // 资金来源
},
typeList: [],
statusList: [],
propertiesRights: [],
defaultText: '无',
dataRule: {
// name: [
// {required: true, message: '项目名称', trigger: 'change'}
// ],
// streetId: [
// {required: true, message: '街道', trigger: 'change'}
// ],
// communityId: [
// {required: true, message: '社区', trigger: 'change'}
// ],
// requirement: [
// {required: true, message: '项目需求', trigger: 'change'}
// ],
// type: [
// {required: true, message: '项目类型', trigger: 'change'}
// ],
// funds: [
// {required: true, message: '所需经费', trigger: 'change'},
// ],
// serviceObject: [
// {required: true, message: '服务对象', trigger: 'change'}
// ],
// activityTimes: [
// {required: true, message: '活动频次', trigger: 'change'}
// ],
// openPublic: [
// {required: true, message: '是否对外发布', trigger: 'change'}
// ],
// activityForm: [
// {required: true, message: '活动形式', trigger: 'change'}
// ],
// activityTarget: [
// {required: true, message: '活动目标', trigger: 'change'}
// ],
// linkMan: [
// {required: true, message: '项目联系人', trigger: 'change'}
// ],
// linkManPhone: [
// {required: true, message: '项目联系人电话', trigger: 'change'}
// ],
// line: [
// {required: true, message: '资金来源', trigger: 'change'}
// ],
// capitalSource: [
// {required: true, message: '所属条线', trigger: 'change'}
// ]
}
}
},
beforeCreate () {
},
mounted () {
this.getStreetList()
this.getCommunityList()
this.getTypeList()
},
methods: {
async init (id) {
const data = await this.$axios.$get('/api/projectInfo/findProjectInfo?id=' + id)
this.dataForm = data.obj || {}
},
// 获取街道
async getStreetList () {
const data = await this.$axios.$get('/api/projectInfo/findStreetList')
this.streetList = data.obj || []
},
// 街道获取社区
async getCommunityList () {
const data = await this.$axios.$get('/api/projectInfo/findCommunityIdList')
this.communityList = data.obj || []
console.log(data.obj)
},
// 项目类型
async getTypeList () {
const data = await this.$axios.$get('/api/dict/parent?code=projectType')
this.typeList = data.obj || []
}
}
}
</script>
<style lang="scss" scoped>
</style>
This diff is collapsed.
<template>
<div>
<div style="display: flex;margin-bottom: 16px;justify-content: flex-end;align-items: center">
<el-button type="primary" v-if="!isEdit" @click="addOrUpdateHandle()" :disabled="isEdit">保存</el-button>
</div>
<el-form :rules="dataRule" :model="dataForm" class="mod_sw_basic_info" ref="dataForm" label-width="210px">
<el-row style="height: 45px">
<el-col >
<el-form-item label="项目目标" prop="projectTarget">
<el-input :disabled="isEdit" type="textarea" placeholder="请输入" v-model="dataForm.projectTarget" size="mini"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col>
<el-form-item label="项目合同" prop="contractList">
<el-upload
:disabled="isEdit"
class="uploadNone"
size="mini"
ref="contractUpload"
name="file"
:action="$config.httpBaseUrl+'/api/oss/upload'"
:data="{serverCode: this.serverCode,media:false}"
:on-success="function (res,file){return contractSuccessHandle(res,file)}"
:on-remove="function (res,file){return contractRemoveHandle(file)}"
:on-change="changHandle"
:on-preview="scanExcel"
:before-upload="beforeUpload"
:file-list="dataForm.contractList">
<el-button size="mini" type="primary" :disabled="isEdit">
<span class="iconfont icon-shangchuan"
style="font-size: 14px;vertical-align: middle"></span>上传附件
</el-button>
<div slot="tip" class="el-upload__tip">只支持上传doc、docx、pdf、xlsx、xls文件,大小10M以内</div>
</el-upload>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col>
<el-form-item label="项目方案" prop="programmeList">
<el-upload
:disabled="isEdit"
class="uploadNone"
size="mini"
ref="programmeUpload"
name="file"
:action="$config.httpBaseUrl+'/api/oss/upload'"
:data="{serverCode: this.serverCode,media:false}"
:on-success="function (res,file){return programmeSuccessHandle(res,file)}"
:on-remove="function (res,file){return programmeRemoveHandle(file)}"
:on-change="changHandle"
:on-preview="scanExcel"
:before-upload="beforeUpload"
:file-list="dataForm.programmeList">
<el-button size="mini" type="primary" :disabled="isEdit">
<span class="iconfont icon-shangchuan"
style="font-size: 14px;vertical-align: middle"></span>上传附件
</el-button>
<div slot="tip" class="el-upload__tip">只支持上传doc、docx、pdf、xlsx、xls文件,大小10M以内</div>
</el-upload>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script>
// 必填 - 中标社会组织信息
// import _ from 'lodash'
import Vue from 'vue'
export default {
name: 'p-undertaking-info',
props: {
detail: {
type: Object,
default() {
return {}
}
},
isEdit:{
type: Boolean,
default: true
}
},
data () {
return {
id: '',
serverCode: 'LocalServer',
dialogType: '',
dataForm: {
id: null,
projectId: null,
projectTarget: '',
contractList: [],
programmeList: []
},
dataRule: {
projectTarget: [
{required: true, message: '项目目标', trigger: 'change'}
],
contractList: [
{required: true, message: '项目合同', trigger: 'change'}
],
programmeList: [
{required: true, message: '项目方案', trigger: 'change'}
]
},
fileList: []
}
},
// 接收上级组件参数
// inject: ['loadCommunityOfCurrentCommittee', 'getProvinceList', 'parentInit', 'setGetSocialWorkerCertification'],
created () {
},
mounted () {
console.log(this)
},
computed: {
},
methods: {
init (id) {
this.$nextTick(() => {
this.id = id
if (this.detail.projectTaker) {
this.dataForm = this.detail.projectTaker
}
this.dataForm.projectId = id ? id : null
})
},
async addOrUpdateHandle () {
this.$refs['dataForm'].validate(async (valid) => {
if (valid) {
this.dataForm.contractList = this.dataForm.contractList.map((item, index) => {
if (item.response) {
item.url = item.response.obj.path
}
return item
})
this.dataForm.programmeList = this.dataForm.programmeList.map((item, index) => {
if (item.response) {
item.url = item.response.obj.path
}
return item
})
let data = await this.$axios.$post('/api/projectInfo/saveTaker', {
...this.dataForm
})
if (data && data.code === 0) {
this.dataForm.id = data.obj
this.$message({
message: '保存成功',
type: 'success',
duration: 1500,
onClose: () => {
this.$emit('getTableList')
}
})
} else {
this.dialogFormVisible = false
this.saveInfo = false
this.$message({
message: '保存失败',
type: 'waring',
duration: 1500
})
}
} else {
this.$message.error('验证不通过,请检查所填信息是否正确!')
}
})
},
beforeUpload (file) {
let FileExt = file.name.replace(/.+\./, '')
if (['doc', 'docx', 'pdf', 'xlsx' ,'xls'].indexOf(FileExt.toLowerCase()) === -1) {
this.$message.error('请上传后缀名为doc或docx或pdf或xlsx或xls的文件!!')
return false
}
const isLt10M = file.size / 1024 / 1024 < 10
if (['doc', 'docx', 'pdf', 'xlsx' ,'xls'].indexOf(FileExt.toLowerCase()) !== -1 && !isLt10M) {
this.$message.error('附件大小不能超过 10M!')
return false
}
},
// 上传成功
contractSuccessHandle (res, file) {
if (res.success) {
this.$message({
message: '操作成功',
type: 'success',
duration: 1500
})
file.url=file.response.obj.path
this.dataForm['contractList'].push(file)
this.$refs.dataForm.clearValidate('contractList')
} else {
this.$message.error('上传失败')
}
},
// 上传成功
programmeSuccessHandle (res, file) {
if (res.success) {
this.$message({
message: '操作成功',
type: 'success',
duration: 1500
})
file.url=file.response.obj.path
this.dataForm['programmeList'].push(file)
this.$refs.dataForm.clearValidate('programmeList')
} else {
this.$message.error('上传失败')
}
},
contractRemoveHandle (file) {
this.dataForm['contractList'] = file
},
programmeRemoveHandle (file) {
this.dataForm['programmeList'] = file
},
changHandle (file, fileList) {
},
scanExcel (file) {
console.log(file)
let a = document.createElement('a')
a.href = this.$config.httpBaseUrl+file.url
a.download = file.name
a.click()
this.$message({
type: 'success',
message: '下载附件成功'
})
}
}
}
</script>
<style lang="scss" scoped>
</style>
<template>
<el-dialog
class="maintain-dialog"
width="900px"
v-loading="dataListLoading"
:visible.sync="visible"
@close="visible = false">
<div class="text-r" slot="title">
<div class="flex justify-between align-center">
<div class="title">项目详情</div>
<!-- <div>-->
<!-- <el-button type="primary" @click="submitCloseDialog">返回</el-button>-->
<!-- </div>-->
</div>
</div>
<div class="d-box proDetail">
<template>
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="项目基本信息" name="first">
<div><BaseInfo :projectStatusName="projectStatusName" :detail="detail" :people="true" ref="baseInfo"/></div>
</el-tab-pane>
<el-tab-pane label="项目承接信息" name="second">
<PUndertakingInfo :isEdit="isEdit" :detail="detail" ref="PUndertakingInfo"></PUndertakingInfo>
</el-tab-pane>
<el-tab-pane label="项目活动列表" name="third">
<PActiveList :isEdit="isEdit" :detail="detail" ref="PActiveList"></PActiveList>
</el-tab-pane>
<el-tab-pane label="项目评价信息" name="Fourth">
<pEvaluationInfo :isEdit="isEdit" :detail="detail" ref="pEvaluationInfo"></pEvaluationInfo>
</el-tab-pane>
</el-tabs>
</template>
</div>
</el-dialog>
</template>
<script>
import BaseInfo from '~/components/project/p-base-info.vue'
import PUndertakingInfo from '~/components/project/p-undertakingInfo.vue'
import PActiveList from '~/components/project/p-activity-list.vue'
import pEvaluationInfo from '~/components/project/p-evaluationInfo.vue'
export default {
props: {
editType: {
type: String,
default: ''
},
role: {
type: String,
default: ''
}
},
data () {
return {
isDisabled: true,
id: '',
dataListLoading: false,
type: null,
tab1ActiveNames: ['1', '2', '3', '4'],
visible: false,
detail: {},
projectStatusName: '',
isEdit: null,
activeName: 'first'
}
},
components: {
BaseInfo,
PUndertakingInfo,
PActiveList,
pEvaluationInfo
},
beforeCreate () {
},
beforeDestroy () {
this.visible = false
},
computed:{
contentHeight () {
return this.$store.state.common.documentClientHeight
}
},
methods: {
handleClick (tab, event) {
},
async init (id) {
this.visible = true
this.id = id
const data = await this.$axios.$get('/api/projectInfo/findProjectInfo?id=' + this.id)
this.detail = data.obj || {}
console.log(this.detail)
if ( this.detail.projectStatus === 'have_in_hand') {
this.isEdit = false
console.log(this.isEdit)
this.projectStatusName = '实施中'
} else if (this.detail.projectStatus === 'open_items_audit') {
this.projectStatusName = '待结项确认审核'
this.isEdit = true
} else if (this.detail.projectStatus === 'conclusion_audit_failed') {
this.projectStatusName = '结项确认审核不通过'
this.isEdit = false
} else if (this.detail.projectStatus === 'conclusion_approved') {
this.projectStatusName = '已结项'
this.isEdit = true
}
this.$nextTick(() => {
// this.$refs.baseInfo.$refs.baseInfo.resetFields()
// this.$refs.pEvaluationInfo.dataForm.agencyName = null
// this.$refs.PUndertakingInfo.$refs.dataForm.resetFields()
// this.$refs.pEvaluationInfo.$refs.dataForm.resetFields()
console.log(id)
this.$refs.baseInfo.init(id)
this.$refs.PUndertakingInfo.init(id)
this.$refs.PActiveList.init(id)
this.$refs.pEvaluationInfo.init(id)
})
},
// 内容菜单-点击事件
handleChange (e) {
},
submitCloseDialog () {
this.visible = false
}
}
}
</script>
<style lang="scss" scoped>
.title{
font-size: 16px;
color: #666;
font-weight: bold;
}
/deep/ .proDetail{
.el-tabs__item{
font-size: 16px !important;
}
}
</style>
<template>
<div class="top">
<div id="top" class="top mainPage flex justify-between align-center">
<div class="top-l margin-left20 flex align-center">
<div class="logo">
<img :src="require('~/assets/img/top-1.jpg')" >
<!-- <img src="~@/assets/img/top-1-1.png"/>-->
</div>
<div class="text">知社区空中课堂</div>
</div>
<div class="top-r margin-right20 ">
<div class="top-r-t">
<img @click="jump" :src="require('~/assets/img/top-2.jpg')" >
</div>
<div v-if="!name">
<div class="text" @click="jumpOut()">登录</div>
</div>
<div class="text" v-else>
<span @click="jump" class="name ">{{name}}</span> | <span style="color: #999" @click="logOut()">退出</span>
</div>
</div>
</div>
</div>
</template>
<script>
import moment from 'moment'
import Swiper from 'swiper'
export default {
// layout: 'list',
data() {
return{
organizationInfo:{},
code: this.$cookies.get('code'),
name: this.$cookies.get('name'),
id: this.$cookies.get('id'),
org: this.$cookies.get('org'),
ticket: this.$route.query.ticket
}
},
head() {
return {
title: this.title,
meta: [{ hid: 'description', name: 'description', content: this.description }]
}
},
async asyncData({ $axios, params }) {},
mounted() {
this.init()
},
props: {
},
methods: {
async init () {
// const data = await this.$axios.$get('/api/projectInfo/findIdByCode?code=' + '53320591509798609H')
// this.organizationInfo = data.obj && data.obj.organizationInfo ? data.obj.organizationInfo : {}
// if (this.code) {
// const data = await this.$axios.$get('/api/projectInfo/findIdByCode?code=' + this.code)
// this.organizationInfo = data.obj && data.obj.organizationInfo ? data.obj.organizationInfo : {}
// } else if (this.ticket) {
// const data = await this.$axios.$get('/api/projectInfo/findIdByTicket?ticket=' + this.ticket)
// this.organizationInfo = data.obj ? data.obj : {}
//
// }
// 判断路由有没有ticket 有就和本地判断 没有就不做操作
if (this.ticket) {
// 判断本地有没有ticket 如果路由和本地相等 不做操作 如果不等重新通过票据获取值
if (this.$cookies.get('ticket')) {
if (this.ticket !== this.$cookies.get('ticket')){
this.$cookies.set('ticket', this.ticket, {
path: '/',
maxAge: 60 * 60 * 2
})
this.getData()
}
} else {
this.$cookies.set('ticket', this.ticket, {
path: '/',
maxAge: 60 * 60 * 2
})
this.getData()
}
}
},
async getData () {
const data = await this.$axios.$get('/api/projectInfo/findOrgByTicket?ticket=' + this.ticket)
// 票据过期 定时两小时 缓存cookie的数据会清空的
console.log(data)
if (data.code === 10) {
this.$router.push('/')
} else {
this.$cookies.set('code', data.obj.code, {
path: '/',
maxAge: 60 * 60 * 2
})
this.$cookies.set('id', 'a' + data.obj.id, {
path: '/',
maxAge: 60 * 60 * 2
})
this.$cookies.set('name', data.obj.name, {
path: '/',
maxAge: 60 * 60 * 2
})
this.$cookies.set('org', data.obj.org, {
path: '/',
maxAge: 60 * 60 * 2
})
}
this.$router.go(0)
},
logOut () {
this.$confirm(`确定进行退出操作?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.$cookies.removeAll()
this.$router.go(0)
}).catch(() => {
})
},
swiper(){
// this.$nextTick(()=>{
// new Swiper('.swiper-container', {
// slidesPerView : 5,
// })
// })
},
jump(){
if (this.$cookies.get('name')) {
this.$router.push('user')
} else {
console.log('登录')
}
},
jumpOut(){
console.log('登录')
}
}
}
</script>
<style lang="scss" scoped>
</style>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
export const config = {
httpBaseUrl: 'http://demo45.fyxmt.com',
// httpBaseUrl: 'http://172.16.103.34:8181',
// httpBaseUrl: 'http://demo22.fyxmt.com',
backUrl:"http://demo48.fyxmt.com"
}
export const config = {
httpBaseUrl: 'http://172.32.10.250:80/interface'
// backUrl:"http://demo48.fyxmt.com"
}
export const config = {
httpBaseUri: 'http://172.32.10.250:80/interface'
}
const { config } = require(`./config.${process.env.NODE_ENV}`)
export default config
module.exports = {
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/$1',
'^~/(.*)$': '<rootDir>/$1',
'^vue$': 'vue/dist/vue.common.js'
},
moduleFileExtensions: ['js', 'vue', 'json'],
transform: {
'^.+\\.js$': 'babel-jest',
'.*\\.(vue)$': 'vue-jest'
},
collectCoverage: true,
collectCoverageFrom: [
'<rootDir>/components/**/*.vue',
'<rootDir>/pages/**/*.vue'
]
}
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"~/*": ["./*"],
"@/*": ["./*"],
"~~/*": ["./*"],
"@@/*": ["./*"]
}
},
"exclude": ["node_modules", ".nuxt", "dist"]
}
# LAYOUTS
**此目录不是必需的,如果不想使用,可以将其删除。**
Nuxt.js 允许你扩展默认的布局,或在 layout 目录下创建自定义的布局。
0. default: 默认布局
1. 自定义布局:list,detail,single,...
1. 主题功能
This diff is collapsed.
<template>
<div class="container">
<!-- <h1 v-if="error.statusCode === 404">页面不存在</h1>
<h1 v-else>应用发生错误异常</h1>
<nuxt-link to="/">首 页</nuxt-link> -->
<div class="mc" style="margin-bottom: 100px"></div>
<div class="mc" style="margin-bottom: 40px; text-align: center;">
<img src="~/assets/img/error.png" alt="">
</div>
<div class="mc" style="text-align: center;color: #de3d35; font-size: 28px;letter-spacing: 7px;">
{{error.statusCode === 404 ? '404页面不存在' : '应用发生错误异常,请稍后再试'}}</div>
</div>
</template>
<script>
export default {
props: {
error: {
type: Object,
default() {
return {}
}
}
},
layout: 'default' // 你可以为错误页面指定自定义的布局
}
</script>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
import Vue from 'vue'
import config from '~/config'
Vue.prototype.$config = config
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment