This commit is contained in:
2023-11-29 16:38:19 +08:00
parent 882419768f
commit e7196c4cdc
79 changed files with 7436 additions and 6564 deletions
+2
View File
@@ -18,6 +18,8 @@ $--color-primary: #A92924;
/* 改变 icon 字体路径变量,必需 */ /* 改变 icon 字体路径变量,必需 */
$--font-path: '~element-ui/lib/theme-chalk/fonts'; $--font-path: '~element-ui/lib/theme-chalk/fonts';
$--button-border-radius: 12px;
@import "~element-ui/packages/theme-chalk/src/index"; @import "~element-ui/packages/theme-chalk/src/index";
.el-input.is-disabled .el-input__inner { .el-input.is-disabled .el-input__inner {
+693 -56
View File
@@ -4,6 +4,7 @@
.text-center { .text-center {
text-align: center; text-align: center;
} }
* { * {
box-sizing: border-box; box-sizing: border-box;
border: 0; border: 0;
@@ -23,8 +24,8 @@
} }
* { * {
margin: 0px; margin: 0;
padding: 0px; padding: 0;
border: none; border: none;
outline: none; outline: none;
} }
@@ -51,6 +52,7 @@ input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button { input::-webkit-inner-spin-button {
-webkit-appearance: none !important; -webkit-appearance: none !important;
} }
input[type="number"] { input[type="number"] {
-moz-appearance: textfield; -moz-appearance: textfield;
} }
@@ -59,12 +61,14 @@ img {
border: 0 none; border: 0 none;
vertical-align: top; vertical-align: top;
} }
.button { .button {
cursor: pointer; cursor: pointer;
text-align: center; text-align: center;
vertical-align: middle; vertical-align: middle;
display: table-cell; display: table-cell;
} }
body, input, select, .button, textarea { body, input, select, .button, textarea {
font-size: 13px; font-size: 13px;
} }
@@ -330,7 +334,7 @@ ol, ul {
height: 32px; height: 32px;
line-height: 32px; line-height: 32px;
color: #959595; color: #959595;
padding: 0px 10px; padding: 0 10px;
position: relative; position: relative;
} }
@@ -557,7 +561,7 @@ h1, h2, h3, h4, h5 {
.group-head:not(.fixed):not(.top) .mod-download-icon { .group-head:not(.fixed):not(.top) .mod-download-icon {
float: right; float: right;
margin: 15px 0px 0 0; margin: 15px 0 0 0;
} }
.group-head .mod-download-icon .download { .group-head .mod-download-icon .download {
@@ -565,7 +569,7 @@ h1, h2, h3, h4, h5 {
} }
.group-head:not(.fixed):not(.top) .mod-download-icon .download { .group-head:not(.fixed):not(.top) .mod-download-icon .download {
padding-top: 0px; padding-top: 0;
margin: 0 auto; margin: 0 auto;
} }
@@ -579,13 +583,13 @@ h1, h2, h3, h4, h5 {
.group-nav .mod-nav .first-level-nav ul { .group-nav .mod-nav .first-level-nav ul {
margin: 0 auto; margin: 0 auto;
padding-left: 0px; padding-left: 0;
} }
.group-nav .mod-nav .navigation-bottom { .group-nav .mod-nav .navigation-bottom {
width: 1200px; width: 1200px;
height: 40px; height: 40px;
margin: 0px auto; margin: 0 auto;
} }
.group-nav .mod-nav ul li { .group-nav .mod-nav ul li {
@@ -594,12 +598,17 @@ h1, h2, h3, h4, h5 {
.group-nav .linkNav ul li .nav, .group-nav .linkNav ul li a { .group-nav .linkNav ul li .nav, .group-nav .linkNav ul li a {
display: block; display: block;
font-size: 15px; font-size: 14px;
line-height: 40px; line-height: 40px;
color: #353535; color: #353535;
font-weight: 400; font-weight: 400;
} }
.group-nav .linkNav ul .active a {
color: #a92924 !important;
background: #fdf1f1
}
.group-nav .mod-nav .first-level-nav ul li.nav.act a, .second-level-nav .sub-nav-wraper .sub-nav a:hover, .second-level-nav .sub-nav-wraper .sub-nav.act a { .group-nav .mod-nav .first-level-nav ul li.nav.act a, .second-level-nav .sub-nav-wraper .sub-nav a:hover, .second-level-nav .sub-nav-wraper .sub-nav.act a {
color: #a92924; color: #a92924;
} }
@@ -652,6 +661,7 @@ h1, h2, h3, h4, h5 {
color: #a92924; color: #a92924;
text-decoration: none text-decoration: none
} }
.navigation-wrap * { .navigation-wrap * {
box-sizing: border-box; box-sizing: border-box;
} }
@@ -687,7 +697,6 @@ h1, h2, h3, h4, h5 {
} }
.navigation-top .searchBar .searchBar-input .searchBar-input-list { .navigation-top .searchBar .searchBar-input .searchBar-input-list {
position: absolute; position: absolute;
width: 100%; width: 100%;
@@ -766,7 +775,7 @@ button, input, select, textarea {
.icon-nav { .icon-nav {
display: inline-block; display: inline-block;
background: url(/static/images/icon2.png) no-repeat center center; /*background: url(/static/images/icon2.png) no-repeat center center;*/
} }
.navigation-bottom .linkNav ul li { .navigation-bottom .linkNav ul li {
@@ -809,7 +818,7 @@ button, input, select, textarea {
position: absolute; position: absolute;
left: 0; left: 0;
text-align: center; text-align: center;
bottom: 0px; bottom: 0;
width: 100%; width: 100%;
z-index: 999; z-index: 999;
} }
@@ -838,11 +847,11 @@ button, input, select, textarea {
} }
#slide .pagination { #slide .pagination {
margin: 10px 0px; margin: 10px 0;
} }
#slide .arrow-left { #slide .arrow-left {
background: url(/static/images/banner_arrow.png) no-repeat left top; /*background: url(/static/images/banner_arrow.png) no-repeat left top;*/
position: absolute; position: absolute;
left: 20px; left: 20px;
top: 50%; top: 50%;
@@ -854,7 +863,7 @@ button, input, select, textarea {
} }
#slide .arrow-right { #slide .arrow-right {
background: url(/static/images/banner_arrow.png) no-repeat left bottom; /*background: url(/static/images/banner_arrow.png) no-repeat left bottom;*/
position: absolute; position: absolute;
right: 20px; right: 20px;
top: 50%; top: 50%;
@@ -908,7 +917,7 @@ button, input, select, textarea {
.rslides li a { .rslides li a {
text-align: center; text-align: center;
margin: 0px auto; margin: 0 auto;
height: 365px; height: 365px;
width: 760px; width: 760px;
position: relative; position: relative;
@@ -926,12 +935,12 @@ button, input, select, textarea {
.callbacks_tabs.callbacks1_tabs { .callbacks_tabs.callbacks1_tabs {
position: absolute; position: absolute;
z-index: 100; z-index: 100;
margin-bottom: 0px; margin-bottom: 0;
bottom: 10px; bottom: 10px;
left: 0px; left: 0;
right: 0px; right: 0;
text-align: center; text-align: center;
margin: 0px auto; margin: 0 auto;
} }
.callbacks_tabs.callbacks1_tabs li { .callbacks_tabs.callbacks1_tabs li {
@@ -1016,7 +1025,7 @@ button, input, select, textarea {
text-decoration: none; text-decoration: none;
height: 61px; height: 61px;
width: 38px; width: 38px;
background: transparent url("/static/images/themes.gif") no-repeat left top; /*background: transparent url("/static/images/themes.gif") no-repeat left top;*/
margin-top: -30px; margin-top: -30px;
display: none; display: none;
} }
@@ -1069,24 +1078,28 @@ button, input, select, textarea {
} }
.cate-icon-1 { .cate-icon-1 {
background: url(/static/images/icon6.png) no-repeat center center; /*background: url(/static/images/icon6.png) no-repeat center center;*/
}
.cate-icon-2 {
background: url(/static/images/icon3.png) no-repeat center center;
}
.cate-icon-3 {
background: url(/static/images/icon4.png) no-repeat center center;
}
.cate-icon-4 {
background: url(/static/images/icon5.png) no-repeat center center;
}
.cate-icon-5 {
background: url(/static/images/icon7.png) no-repeat center center;
}
.cate-icon-6 {
background: url(/static/images/icon19.png) no-repeat center center;
} }
.cate-icon-2 {
/*background: url(/static/images/icon3.png) no-repeat center center;*/
}
.cate-icon-3 {
/*background: url(/static/images/icon4.png) no-repeat center center;*/
}
.cate-icon-4 {
/*background: url(/static/images/icon5.png) no-repeat center center;*/
}
.cate-icon-5 {
/*background: url(/static/images/icon7.png) no-repeat center center;*/
}
.cate-icon-6 {
/*background: url(/static/images/icon19.png) no-repeat center center;*/
}
.part-category .cate-menu ul li h2 { .part-category .cate-menu ul li h2 {
@@ -1235,7 +1248,7 @@ a:hover {
.part-category .cate-cont .item-main .part-logo-cont a { .part-category .cate-cont .item-main .part-logo-cont a {
display: block; display: block;
height: 240px; height: 240px;
padding: 0px 15px 0px 20px; padding: 0 15px 0 20px;
overflow: hidden; overflow: hidden;
position: relative position: relative
} }
@@ -1264,6 +1277,7 @@ a:hover {
.part-category .cate-cont::-webkit-scrollbar { .part-category .cate-cont::-webkit-scrollbar {
display: none; display: none;
} }
.part-category .cate-cont { .part-category .cate-cont {
overflow-y: scroll; overflow-y: scroll;
background: #fff; background: #fff;
@@ -1280,8 +1294,8 @@ a:hover {
.part-category .cate-cont .item-main { .part-category .cate-cont .item-main {
position: absolute; position: absolute;
left: 0px; left: 0;
top: 0px; top: 0;
opacity: 0.9; opacity: 0.9;
-moz-opacity: 0.9; -moz-opacity: 0.9;
filter: alpha(opacity=90); filter: alpha(opacity=90);
@@ -1296,7 +1310,7 @@ a:hover {
float: right; float: right;
width: 250px; width: 250px;
height: 430px; height: 430px;
margin-top: 0px; margin-top: 0;
background: #fff; background: #fff;
z-index: 2; z-index: 2;
position: relative; position: relative;
@@ -1326,8 +1340,8 @@ a:hover {
.login-head { .login-head {
width: 100%; width: 100%;
text-align: center; text-align: center;
margin: 0px auto; margin: 0 auto;
margin: 0px 0px 10px; margin: 0 0 10px;
} }
.login-head img { .login-head img {
@@ -1336,7 +1350,7 @@ a:hover {
} }
#banner_right_login { #banner_right_login {
background: url(/static/images/icon8.png) no-repeat 57px center; /*background: url(/static/images/icon8.png) no-repeat 57px center;*/
display: block; display: block;
color: #a92924; color: #a92924;
padding-left: 30px; padding-left: 30px;
@@ -1434,7 +1448,7 @@ a:hover {
} }
.me-tab-text { .me-tab-text {
padding: 0px 13px; padding: 0 13px;
} }
.me-tab .me-step dl.dowslf3 { .me-tab .me-step dl.dowslf3 {
@@ -1466,7 +1480,7 @@ a:hover {
.wartchar { .wartchar {
display: block; display: block;
padding: 0px 10px 14px; padding: 0 10px 14px;
} }
.wartcharlist { .wartcharlist {
@@ -1495,7 +1509,7 @@ a:hover {
} }
.group-inner3-list a { .group-inner3-list a {
margin: 0px 4px; margin: 0 4px;
background: #d8edff; background: #d8edff;
display: -webkit-box; display: -webkit-box;
display: -webkit-flex; display: -webkit-flex;
@@ -1562,7 +1576,7 @@ a:hover {
line-height: 90px; line-height: 90px;
text-align: center; text-align: center;
vertical-align: middle; vertical-align: middle;
overflow: hide; overflow: hidden;
} }
.group-inner3-listright img { .group-inner3-listright img {
@@ -1612,7 +1626,7 @@ a:hover {
} }
.login-ingon { .login-ingon {
background: url(/static/images/icon8.png) left center no-repeat; /*background: url(/static/images/icon8.png) left center no-repeat;*/
padding-left: 24px; padding-left: 24px;
padding-right: 8px; padding-right: 8px;
font-size: 12px; font-size: 12px;
@@ -1791,7 +1805,7 @@ div.mod-modal {
.component-dialog .icon { .component-dialog .icon {
display: inline-block; display: inline-block;
background: url(/static/images/new2x.png) center center no-repeat; /*background: url(/static/images/new2x.png) center center no-repeat;*/
background-size: 222px 72px; background-size: 222px 72px;
background-position: -84px; background-position: -84px;
} }
@@ -1836,7 +1850,7 @@ div.mod-modal {
width: 64px !important; width: 64px !important;
height: 64px !important; height: 64px !important;
text-align: center; text-align: center;
margin: 0px auto; margin: 0 auto;
display: block; display: block;
} }
@@ -1879,7 +1893,7 @@ div.mod-modal {
height: 100%; height: 100%;
overflow: hidden; overflow: hidden;
text-align: center; text-align: center;
top: 0px; top: 0;
left: 0; left: 0;
display: none; display: none;
z-index: 11111; z-index: 11111;
@@ -1974,10 +1988,10 @@ input:disabled {
.agreement_dialogs { .agreement_dialogs {
position: fixed; position: fixed;
top: 0px; top: 0;
left: 0px; left: 0;
right: 0px; right: 0;
bottom: 0px; bottom: 0;
width: 100%; width: 100%;
height: 100%; height: 100%;
z-index: 19891017; z-index: 19891017;
@@ -2074,6 +2088,629 @@ input:disabled {
.page-nav { .page-nav {
width: 1200px; width: 1200px;
margin: 0px auto; margin: 0 auto;
padding: 20px 0; padding: 20px 0;
} }
.p-20 {
padding: 20px;
}
.ml-10 {
margin-left: 10px;
}
.w-full {
width: 100%;
}
.empty-bg-plain-btn {
background: none !important;
}
.empty-bg-plain-btn:hover {
background: #f6eae9 !important;
color: #A92924 !important;
}
.pos-r {
position: relative;
}
.pos-a {
position: absolute;
}
.bg-white {
background-color: white;
}
.bg-fff0 {
background-color: #F0F0F0FF;
}
.shadow {
box-shadow: 1px 1px 10px #ccc;
}
.shadow-top {
box-shadow: 0 -2px 10px #ccc;
}
.shadow-light {
box-shadow: 0 4px 12px 0 rgba(206, 206, 206, 80);
}
.shadow-50 {
box-shadow: -2px 4px 14px 4px rgba(206, 206, 206, 50);
}
.font-bold {
font-weight: bold;
}
.text-center {
text-align: center;
}
.text-left {
text-align: left;
}
.text-right {
text-align: right;
}
.text-black {
color: #333;
}
.color-6C {
color: #6C6C6C;
}
.text-white {
color: white;
}
.text-line-through {
text-decoration: line-through;
}
.color-9A {
color: #9A9A9A;
}
.color-333 {
color: #333333;
}
.flex {
display: flex;
}
.flex-wrap {
flex-wrap: wrap;
}
.justify-center {
justify-content: center;
}
.justify-start {
justify-content: flex-start;
}
.justify-end {
justify-content: flex-end;
}
.justify-between {
justify-content: space-between;
}
.justify-around {
justify-content: space-around;
}
.items-center {
align-items: center;
}
.items-start {
align-items: flex-start;
}
.items-end {
align-items: flex-end;
}
.item-self {
align-self: flex-end;
}
.flex-col {
flex-direction: column;
}
.flex-rev {
flex-direction: row-reverse;
}
.flex-1 {
flex: 1;
}
.flex-2 {
flex: 2;
}
.flex-shrink {
flex-shrink: 0;
}
.flex-none {
flex: none;
}
.flex-grow {
flex-grow: 1
}
.flex-grow-0 {
flex-grow: 0
}
.h-100 {
height: 100vh;
}
.h-100p {
height: 100%;
}
.h-90p {
height: 90%;
}
.h-50p {
height: 50%;
}
.h-10p {
height: 10%;
}
.w-100 {
width: 100vw;
}
.w-100p {
width: 100%;
}
.w-5p {
width: 5%;
}
.w-10p {
width: 10%;
}
.w-15p {
width: 15%;
}
.w-20p {
width: 20%;
}
.w-25p {
width: 25%;
}
.w-30p {
width: 30%;
}
.w-33p {
width: 33%;
}
.w-40p {
width: 40%;
}
.w-45p {
width: 45%;
}
.w-50p {
width: 50%;
}
.w-60p {
width: 60%;
}
.w-67p {
width: 67%;
}
.w-75p {
width: 75%;
}
.w-80p {
width: 80%;
}
.w-85p {
width: 85%;
}
.w-90p {
width: 90%;
}
.p-10 {
padding: 10rpx;
}
.p-15 {
padding: 15rpx;
}
.pb-15 {
padding-bottom: 15rpx;
}
.pb-20 {
padding-bottom: 20rpx;
}
.pb-30 {
padding-bottom: 30rpx;
}
.p-20 {
padding: 20rpx;
}
.p-25 {
padding: 25rpx;
}
.p-30 {
padding: 30rpx;
}
.px-20 {
padding: 0 20rpx;
}
.px-40 {
padding: 0 40rpx;
}
.p-50 {
padding: 50rpx;
}
.py-10 {
padding: 10rpx 0;
}
.py-15 {
padding: 15rpx 0;
}
.py-20 {
padding: 20rpx 0;
}
.py-25 {
padding: 25rpx 0;
}
.py-30 {
padding: 30rpx 0;
}
.px-15 {
padding: 0 15rpx;
}
.px-20 {
padding: 0 15rpx;
}
.px-30 {
padding: 0 30rpx;
}
.pl-15 {
padding-left: 15rpx;
}
.pl-20 {
padding-left: 20rpx;
}
.pr-15 {
padding-right: 15rpx;
}
.pr-20 {
padding-right: 20rpx;
}
.pt-10 {
padding-top: 10rpx;
}
.pt-20 {
padding-top: 20rpx;
}
.pr-25 {
padding-right: 25rpx;
}
.m-a {
margin: auto;
}
.m-10 {
margin: 10rpx;
}
.m-15 {
margin: 15rpx;
}
.m-20 {
margin: 20rpx;
}
.m-25 {
margin: 25rpx;
}
.m-30 {
margin: 30rpx;
}
.m-35 {
margin: 35rpx;
}
.ml-10 {
margin-left: 10rpx;
}
.ml-15 {
margin-left: 15rpx;
}
.ml-25 {
margin-left: 25rpx;
}
.ml-35 {
margin-left: 35rpx;
}
.mt-10 {
margin-top: 10rpx;
}
.mt-15 {
margin-top: 15rpx;
}
.mt-20 {
margin-top: 20rpx;
}
.mt-25 {
margin-top: 25rpx;
}
.mt-30 {
margin-top: 30rpx;
}
.mt-40 {
margin-top: 40rpx;
}
.mt-50 {
margin-top: 50rpx;
}
.mb-25 {
margin-bottom: 25rpx;
}
.mb-40 {
margin-bottom: 40rpx;
}
.my-10 {
margin-top: 10rpx;
margin-bottom: 10rpx;
}
.my-15 {
margin-top: 15rpx;
margin-bottom: 15rpx;
}
.my-20 {
margin-top: 20rpx;
margin-bottom: 20rpx;
}
.my-25 {
margin-top: 25rpx;
margin-bottom: 25rpx;
}
.mx-15 {
margin-left: 15rpx;
margin-right: 15rpx;
}
.mx-20 {
margin-left: 20rpx;
margin-right: 20rpx;
}
.mx-25 {
margin-left: 25rpx;
margin-right: 25rpx;
}
.mb-10 {
margin-bottom: 10rpx;
}
.mb-15 {
margin-bottom: 15rpx;
}
.mb-20 {
margin-bottom: 20rpx;
}
.mr-10 {
margin-right: 10rpx;
}
.mr-15 {
margin-right: 15rpx;
}
.ml-20 {
margin-left: 20rpx;
}
.mr-25 {
margin-right: 25rpx;
}
.mr-35 {
margin-right: 35rpx;
}
.text-15 {
font-size: 15rpx;
}
.text-20 {
font-size: 20rpx;
line-height: 20rpx;
}
.text-24 {
font-size: 24rpx;
}
.text-25 {
font-size: 25rpx;
line-height: 25rpx;
}
.text-26 {
font-size: 26rpx;
}
.text-28 {
font-size: 28rpx;
line-height: 28rpx;
}
.text-30 {
font-size: 30rpx;
line-height: 30rpx;
}
.text-35 {
font-size: 35rpx;
line-height: 35rpx;
}
.text-40 {
font-size: 40rpx;
line-height: 40rpx;
}
.rounded {
border-radius: 10rpx;
}
.rounded-16 {
border-radius: 16rpx;
}
.rounded-bottom {
border-radius: 0 0 10rpx 10rpx;
}
.rounded-top {
border-radius: 10rpx 10rpx 0 0;
}
.border {
border: 1rpx solid #bbb;
}
.border-top {
border-top: 1rpx solid #bbb;
}
.border-bottom {
border-bottom: 1rpx solid #bbb;
}
.border-left {
border-left: 1rpx solid #bbb;
}
.border-right {
border-right: 1rpx solid #bbb;
}
.footer {
position: fixed;
left: 0;
bottom: 0;
@extend .w-100p;
z-index: 10;
}
.b-20 {
bottom: 20rpx;
}
.overflow-y {
overflow-y: auto;
}
.text-gray {
color: #bbb;
}
.pointer {
cursor: pointer;
}
.text-main {
color: #a92924;
}
.border-main {
border: 1px solid #a92924;
}
+42 -42
View File
@@ -804,36 +804,36 @@ letter-spacing: 3px;
margin: 0px auto; margin: 0px auto;
} }
.sixgoods-list:nth-child(1) h2 span{ .sixgoods-list:nth-child(1) h2 span{
background: url(/static/images/icon14.png)no-repeat center center; /*background: url(/static/images/icon14.png)no-repeat center center;*/
background-size: 19px; background-size: 19px;
} }
.sixgoods-list:nth-child(2) h2 span{ .sixgoods-list:nth-child(2) h2 span{
background: url(/static/images/icon15.png)no-repeat center center; /*background: url(/static/images/icon15.png)no-repeat center center;*/
background-size: 19px; background-size: 19px;
} }
.sixgoods-list:nth-child(3) h2 span{ .sixgoods-list:nth-child(3) h2 span{
background: url(/static/images/icon16.png)no-repeat center center; /*background: url(/static/images/icon16.png)no-repeat center center;*/
background-size: 19px; background-size: 19px;
} }
.sixgoods-list:nth-child(4) h2 span{ .sixgoods-list:nth-child(4) h2 span{
background: url(/static/images/icon17.png)no-repeat center center; /*background: url(/static/images/icon17.png)no-repeat center center;*/
background-size: 19px; background-size: 19px;
} }
.sixgoods-list:hover:nth-child(1) h2 span{ .sixgoods-list:hover:nth-child(1) h2 span{
background: url(/static/images/icon14hover.png)no-repeat center center; /*background: url(/static/images/icon14hover.png)no-repeat center center;*/
background-size: 19px; background-size: 19px;
} }
.sixgoods-list:hover:nth-child(2) h2 span{ .sixgoods-list:hover:nth-child(2) h2 span{
background: url(/static/images/icon15hover.png)no-repeat center center; /*background: url(/static/images/icon15hover.png)no-repeat center center;*/
background-size: 19px; background-size: 19px;
} }
.sixgoods-list:hover:nth-child(3) h2 span{ .sixgoods-list:hover:nth-child(3) h2 span{
background: url(/static/images/icon16hover.png)no-repeat center center; /*background: url(/static/images/icon16hover.png)no-repeat center center;*/
background-size: 19px; background-size: 19px;
} }
.sixgoods-list:hover:nth-child(4) h2 span{ .sixgoods-list:hover:nth-child(4) h2 span{
background: url(/static/images/icon17hover.png)no-repeat center center; /*background: url(/static/images/icon17hover.png)no-repeat center center;*/
background-size: 19px; background-size: 19px;
} }
.section-product .product-description { .section-product .product-description {
@@ -850,19 +850,19 @@ letter-spacing: 3px;
position: relative; position: relative;
} }
.section-product .product-description li.des1 { .section-product .product-description li.des1 {
background: url(/static/images/god1hover.jpg) no-repeat center; /*background: url(/static/images/god1hover.jpg) no-repeat center;*/
} }
.section-product .product-description li.des2 { .section-product .product-description li.des2 {
background: url(/static/images/god2hover.jpg) no-repeat center; /*background: url(/static/images/god2hover.jpg) no-repeat center;*/
} }
.section-product .product-description li.des3 { .section-product .product-description li.des3 {
background: url(/static/images/god3hover.jpg) no-repeat center; /*background: url(/static/images/god3hover.jpg) no-repeat center;*/
} }
.section-product .product-description li.des4 { .section-product .product-description li.des4 {
background: url(/static/images/god4hover.jpg) no-repeat center; /*background: url(/static/images/god4hover.jpg) no-repeat center;*/
} }
.section-product .product-description li.des5 { .section-product .product-description li.des5 {
background: url(/static/images/god5hover.jpg) no-repeat center; /*background: url(/static/images/god5hover.jpg) no-repeat center;*/
} }
.section-product .product-description li .des-inner { .section-product .product-description li .des-inner {
width: 100%; width: 100%;
@@ -914,19 +914,19 @@ letter-spacing: 3px;
} }
.section-product .product-description li.des1 .des-mask { .section-product .product-description li.des1 .des-mask {
background: url(/static/images/god1hover.jpg) no-repeat center; /*background: url(/static/images/god1hover.jpg) no-repeat center;*/
} }
.section-product .product-description li.des2 .des-mask { .section-product .product-description li.des2 .des-mask {
background: url(/static/images/god2hover.jpg) no-repeat center; /*background: url(/static/images/god2hover.jpg) no-repeat center;*/
} }
.section-product .product-description li.des3 .des-mask { .section-product .product-description li.des3 .des-mask {
background: url(/static/images/god3hover.jpg) no-repeat center; /*background: url(/static/images/god3hover.jpg) no-repeat center;*/
} }
.section-product .product-description li.des4 .des-mask { .section-product .product-description li.des4 .des-mask {
background: url(/static/images/god4hover.jpg) no-repeat center; /*background: url(/static/images/god4hover.jpg) no-repeat center;*/
} }
.section-product .product-description li.des5 .des-mask { .section-product .product-description li.des5 .des-mask {
background: url(/static/images/god5hover.jpg) no-repeat center; /*background: url(/static/images/god5hover.jpg) no-repeat center;*/
} }
.section-product .product-description li .des-inner .des-mask .view-detail-wrap { .section-product .product-description li .des-inner .des-mask .view-detail-wrap {
@@ -942,49 +942,49 @@ letter-spacing: 3px;
margin-top: 90px; margin-top: 90px;
} }
.section-product .product-description li.des1 .des-inner .des-text h5{ .section-product .product-description li.des1 .des-inner .des-text h5{
background:url(/static/images/icon9.png)top center no-repeat; /*background:url(/static/images/icon9.png)top center no-repeat;*/
padding-top: 60px; padding-top: 60px;
background-size: 40px; background-size: 40px;
} }
.section-product .product-description li.des2 .des-inner .des-text h5{ .section-product .product-description li.des2 .des-inner .des-text h5{
background:url(/static/images/icon10.png)top center no-repeat; /*background:url(/static/images/icon10.png)top center no-repeat;*/
padding-top: 60px; padding-top: 60px;
background-size: 40px; background-size: 40px;
} }
.section-product .product-description li.des3 .des-inner .des-text h5{ .section-product .product-description li.des3 .des-inner .des-text h5{
background:url(/static/images/icon11.png)top center no-repeat; /*background:url(/static/images/icon11.png)top center no-repeat;*/
padding-top: 60px; padding-top: 60px;
background-size: 40px; background-size: 40px;
} }
.section-product .product-description li.des4 .des-inner .des-text h5{ .section-product .product-description li.des4 .des-inner .des-text h5{
background:url(/static/images/icon12.png)top center no-repeat; /*background:url(/static/images/icon12.png)top center no-repeat;*/
padding-top: 60px; padding-top: 60px;
background-size: 40px; background-size: 40px;
} }
.section-product .product-description li.des5 .des-inner .des-text h5{ .section-product .product-description li.des5 .des-inner .des-text h5{
background:url(/static/images/icon13.png)top center no-repeat; /*background:url(/static/images/icon13.png)top center no-repeat;*/
padding-top: 60px; padding-top: 60px;
background-size: 40px; background-size: 40px;
} }
.section-product .product-description li.des1 .des-inner .title-text{ .section-product .product-description li.des1 .des-inner .title-text{
background:url(/static/images/icon9.png)92px center no-repeat; /*background:url(/static/images/icon9.png)92px center no-repeat;*/
background-size: 30px; background-size: 30px;
} }
.section-product .product-description li.des2 .des-inner .title-text{ .section-product .product-description li.des2 .des-inner .title-text{
background:url(/static/images/icon10.png)92px center no-repeat; /*background:url(/static/images/icon10.png)92px center no-repeat;*/
background-size: 30px; background-size: 30px;
} }
.section-product .product-description li.des3 .des-inner .title-text{ .section-product .product-description li.des3 .des-inner .title-text{
background:url(/static/images/icon11.png)79px center no-repeat; /*background:url(/static/images/icon11.png)79px center no-repeat; */
background-size: 30px; background-size: 30px;
} }
.section-product .product-description li.des4 .des-inner .title-text{ .section-product .product-description li.des4 .des-inner .title-text{
background:url(/static/images/icon12.png)65px center no-repeat; /*background:url(/static/images/icon12.png)65px center no-repeat;*/
background-size: 30px; background-size: 30px;
} }
.section-product .product-description li.des5 .des-inner .title-text{ .section-product .product-description li.des5 .des-inner .title-text{
background:url(/static/images/icon13.png)92px center no-repeat; /*background:url(/static/images/icon13.png)92px center no-repeat; */
background-size: 30px; background-size: 30px;
} }
.title-des{ .title-des{
@@ -1220,39 +1220,39 @@ letter-spacing: 3px;
margin-right: 13px; margin-right: 13px;
} }
.rank-detail li:nth-child(1) .rank-degree{ .rank-detail li:nth-child(1) .rank-degree{
background:url(/static/images/ry1.png)center center no-repeat; /*background:url(/static/images/ry1.png)center center no-repeat;*/
background-size: cover; background-size: cover;
} }
.rank-detail li:nth-child(2) .rank-degree{ .rank-detail li:nth-child(2) .rank-degree{
background:url(/static/images/ry1.png)center center no-repeat; /*background:url(/static/images/ry1.png)center center no-repeat;*/
background-size: cover; background-size: cover;
} }
.rank-detail li:nth-child(3) .rank-degree{ .rank-detail li:nth-child(3) .rank-degree{
background:url(/static/images/ry1.png)center center no-repeat; /*background:url(/static/images/ry1.png)center center no-repeat;*/
background-size: cover; background-size: cover;
} }
.rank-detail li:nth-child(4) .rank-degree{ .rank-detail li:nth-child(4) .rank-degree{
background:url(/static/images/ry2.png)center center no-repeat; /*background:url(/static/images/ry2.png)center center no-repeat;*/
background-size: cover; background-size: cover;
} }
.rank-detail li:nth-child(5) .rank-degree{ .rank-detail li:nth-child(5) .rank-degree{
background:url(/static/images/ry2.png)center center no-repeat; /*background:url(/static/images/ry2.png)center center no-repeat;*/
background-size: cover; background-size: cover;
} }
.rank-detail li:nth-child(6) .rank-degree{ .rank-detail li:nth-child(6) .rank-degree{
background:url(/static/images/ry2.png)center center no-repeat; /*background:url(/static/images/ry2.png)center center no-repeat;*/
background-size: cover; background-size: cover;
} }
.rank-detail li:nth-child(7) .rank-degree{ .rank-detail li:nth-child(7) .rank-degree{
background:url(/static/images/ry2.png)center center no-repeat; /*background:url(/static/images/ry2.png)center center no-repeat;*/
background-size: cover; background-size: cover;
} }
.rank-detail li:nth-child(8) .rank-degree{ .rank-detail li:nth-child(8) .rank-degree{
background:url(/static/images/ry2.png)center center no-repeat; /*background:url(/static/images/ry2.png)center center no-repeat;*/
background-size: cover; background-size: cover;
} }
.rank-detail li:nth-child(9) .rank-degree{ .rank-detail li:nth-child(9) .rank-degree{
background:url(/static/images/ry2.png)center center no-repeat; /*background:url(/static/images/ry2.png)center center no-repeat;*/
background-size: cover; background-size: cover;
} }
@@ -1305,7 +1305,7 @@ letter-spacing: 3px;
overflow: hidden; overflow: hidden;
margin:4px 5px 0px; margin:4px 5px 0px;
line-height: 34px; line-height: 34px;
background-image: url(/static/images/jiantou.png); /*background-image: url(/static/images/jiantou.png);*/
-webkit-background-size: 409px 70px; -webkit-background-size: 409px 70px;
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: -204px 8px; background-position: -204px 8px;
@@ -1638,7 +1638,7 @@ letter-spacing: 3px;
width: 8px; width: 8px;
height: 8px; height: 8px;
vertical-align: top; vertical-align: top;
background: url(/static/images/xiala.png); /*background: url(/static/images/xiala.png);*/
background-size: 27px 16px; background-size: 27px 16px;
} }
.part-filter button:hover { .part-filter button:hover {
@@ -1675,7 +1675,7 @@ letter-spacing: 3px;
margin-right: 3px; margin-right: 3px;
} }
.part-filter input:checked+.checkBox { .part-filter input:checked+.checkBox {
background: url(/static/images/xiala.png)-9px -1px no-repeat; /*background: url(/static/images/xiala.png)-9px -1px no-repeat;*/
background-size: 27px 16px; background-size: 27px 16px;
border-color: #a92924; border-color: #a92924;
} }
@@ -1686,7 +1686,7 @@ letter-spacing: 3px;
display: block; display: block;
width: 8px; width: 8px;
height: 8px; height: 8px;
background: url(/static/images/xiala.png) -19px 0 no-repeat; /*background: url(/static/images/xiala.png) -19px 0 no-repeat;*/
background-size: 27px 16px; background-size: 27px 16px;
} }
.part-filter .item-tag { .part-filter .item-tag {
@@ -1868,7 +1868,7 @@ letter-spacing: 3px;
background: #a92924; background: #a92924;
} }
.mod-tools .tool-item:hover .login-ingon { .mod-tools .tool-item:hover .login-ingon {
background: #fff url(/static/images/icon8.png)left center no-repeat; /*background: #fff url(/static/images/icon8.png)left center no-repeat;*/
padding-left: 24px; padding-left: 24px;
padding-right: 8px; padding-right: 8px;
font-size: 12px; font-size: 12px;
+58 -24
View File
@@ -14,13 +14,15 @@
<div class="part-category"> <div class="part-category">
<div class="cate-menu" psa="a156"> <div class="cate-menu" psa="a156">
<ul id="nav-sub" class=""> <ul id="nav-sub" class="">
<li v-for="(item,index) in vk.getVuex('$app.siteData.categoryData')" class="clearfix menuliselected" :key="index"> <li v-for="(item,index) in vk.getVuex('$app.siteData.categoryData')"
class="clearfix menuliselected" :key="index">
<i class="cate-menu-icon cate-icon-1"></i> <i class="cate-menu-icon cate-icon-1"></i>
<h2> <h2>
<a href="">{{ item.name }}</a> <a href="">{{ item.name }}</a>
</h2> </h2>
<div class="cate-item clearfix"> <div class="cate-item clearfix">
<a v-for="(citem,cindex) in item.children" href="" :key="cindex">{{citem.name}}</a> <a v-for="(citem,cindex) in item.children" href=""
:key="cindex">{{ citem.name }}</a>
</div> </div>
</li> </li>
@@ -42,18 +44,11 @@
</div> </div>
</div> </div>
</div> </div>
<div class="part-logo-cont"> <div class="part-logo-cont">
</div> </div>
</div>
</div> </div>
</div> </div>
</div>
</div> </div>
</div> </div>
@@ -67,17 +62,20 @@
<li class="nav "> <li class="nav ">
<a href="javascript:;">金久信自营</a> <a href="javascript:;">金久信自营</a>
</li> </li>
<li @click="navTo('/pages/spot/goods/goods')" class="nav "> <li @click="navTo('/pages/spot/goods/goods')" class="nav"
:class="[currentPage === 'pages/spot/goods/goods' ? 'active' : '']">
<a href="javascript:;" class="navigator"> <a href="javascript:;" class="navigator">
现货市场 现货市场
</a> </a>
</li> </li>
<li @click="navTo('/pages/enquiry/list')" class="nav "> <li @click="navTo('/pages/enquiry/list')" class="nav "
:class="[currentPage === 'pages/enquiry/list' ? 'active' : '']">
<a href="javascript:;" class="navigator"> <a href="javascript:;" class="navigator">
下询价单 下询价单
</a> </a>
</li> </li>
<li @click="navTo('/pages/process/list')" class="nav "> <li @click="navTo('/pages/process/list')" class="nav "
:class="[currentPage === 'pages/process/list' ? 'active' : '']">
<a href="javascript:;">找加工</a> <a href="javascript:;">找加工</a>
</li> </li>
<li class="nav "> <li class="nav ">
@@ -114,23 +112,33 @@
<img src="/static/images/logo-small.png" alt=""> <img src="/static/images/logo-small.png" alt="">
</div> </div>
<div class="login-action"> <div class="login-action">
<a href="/user/login.html" class="login" <el-button v-if="!vk.getVuex('$user.userInfo.nickname')" type="primary"
id="banner_right_login">会员登录</a> class="empty-bg-plain-btn w-full" plain icon="el-icon-user"
@click.native="navTo('/pages/auth/login/login')">登录
</el-button>
<el-button v-else type="primary"
class="empty-bg-plain-btn w-full" plain icon="el-icon-user"
@click.native="navTo('/pages/user/user')">个人中心
</el-button>
</div> </div>
<div class="runlings"><span <div class="login-action">
style="display: inline-block;color: #a92924">免费</span>入驻通道 <el-button type="primary" class="auth-btn">
<img src="@/static/images/id-card.png">
<text>实名认证</text>
</el-button>
</div> </div>
</div> </div>
</div> </div>
<div class="me-tab"> <div class="me-tab">
<div class="me-tab-text"> <div class="me-tab-text">
<ul> <ul>
<li class="tab-left active"> <li @click="canShareType = 0" class="tab-left"
<a href="/buyer/index.html">买家入口 </a> :class="[canShareType === 0 ? 'active' : '']">
<a href="javascript:void(0)">买家可享</a>
</li> </li>
<li class=""> <li @click="canShareType = 1" class=""
<a href="/seller/index.html">卖家入口</a> :class="[canShareType === 1 ? 'active' : '']">
<a href="javascript:void(0)">卖家可享</a>
</li> </li>
</ul> </ul>
</div> </div>
@@ -285,7 +293,6 @@
</div> </div>
</div> </div>
</div> </div>
<!----> <!---->
@@ -309,10 +316,11 @@
data() { data() {
return { return {
showCategory: false, showCategory: false,
canShareType: 0,
currentPage: ''
}; };
}, },
mounted() { mounted() {
console.log("mount");
let that = this let that = this
const bannerAllPro = document.getElementById("bannerAllPro") const bannerAllPro = document.getElementById("bannerAllPro")
bannerAllPro.addEventListener("mouseover", () => { bannerAllPro.addEventListener("mouseover", () => {
@@ -321,11 +329,18 @@
bannerAllPro.addEventListener("mouseleave", () => { bannerAllPro.addEventListener("mouseleave", () => {
that.showCategory = false that.showCategory = false
}) })
const routes = getCurrentPages()
this.currentPage = getCurrentPages()[routes.length - 1].route
}, },
methods: { methods: {
navTo(url) { navTo(url) {
vk.navigateTo(url); vk.navigateTo(url);
} }
},
watch:{
$route({meta: {pagePath}}){
this.currentPage = pagePath
}
} }
} }
</script> </script>
@@ -334,4 +349,23 @@
.navigator { .navigator {
cursor: pointer; cursor: pointer;
} }
.login-action {
display: flex;
align-items: center;
justify-content: center;
.auth-btn {
margin-top: .5rem;
display: flex;
align-items: center;
justify-content: center;
width: 100%;
img {
width: 14px;
margin-right: 5px;
}
}
}
</style> </style>
+1 -1
View File
@@ -465,7 +465,7 @@
line-height: 0; line-height: 0;
right: 0px; right: 0px;
bottom: 0px; bottom: 0px;
background: url(/static/images/sys_item_selected.png) no-repeat right bottom; //background: url(/static/images/sys_item_selected.png) no-repeat right bottom;
z-index: 99; z-index: 99;
display: none; display: none;
} }
+19
View File
@@ -0,0 +1,19 @@
<template>
<view :style="{height: `${height}px`, width: '100%'}"></view>
</template>
<script>
export default {
name: "Gap",
props: {
height: {
default: 80,
type: Number | String
}
},
data() {
return {}
},
methods: {}
}
</script>
-475
View File
@@ -1,475 +0,0 @@
{
"name": "vk-unicloud-router",
"version": "2.15.3",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "vk-unicloud-router",
"version": "2.15.3",
"license": "MIT",
"dependencies": {
"element-ui": "2.15.13",
"lodash": "^4.17.21",
"umy-ui": "1.1.6",
"vk-unicloud-admin-ui": "^1.17.45",
"vue-cropper": "^0.6.4"
},
"engines": {
"HBuilderX": "^3.1.2"
}
},
"node_modules/@babel/parser": {
"version": "7.23.0",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz",
"integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==",
"peer": true,
"bin": {
"parser": "bin/babel-parser.js"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@vue/compiler-sfc": {
"version": "2.7.15",
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.15.tgz",
"integrity": "sha512-FCvIEevPmgCgqFBH7wD+3B97y7u7oj/Wr69zADBf403Tui377bThTjBvekaZvlRr4IwUAu3M6hYZeULZFJbdYg==",
"peer": true,
"dependencies": {
"@babel/parser": "^7.18.4",
"postcss": "^8.4.14",
"source-map": "^0.6.1"
}
},
"node_modules/async-validator": {
"version": "1.8.5",
"resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz",
"integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==",
"dependencies": {
"babel-runtime": "6.x"
}
},
"node_modules/babel-helper-vue-jsx-merge-props": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
"integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg=="
},
"node_modules/babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
"dependencies": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"node_modules/core-js": {
"version": "2.6.12",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
"integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
"deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
"hasInstallScript": true
},
"node_modules/csstype": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
"integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==",
"peer": true
},
"node_modules/deepmerge": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz",
"integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/element-ui": {
"version": "2.15.13",
"resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.15.13.tgz",
"integrity": "sha512-LJoatEYX6WV74FqXBss8Xfho9fh9rjDSzrDrTyREdGb1h1R3uRvmLh5jqp2JU137aj4/BgqA3K06RQpQBX33Bg==",
"dependencies": {
"async-validator": "~1.8.1",
"babel-helper-vue-jsx-merge-props": "^2.0.0",
"deepmerge": "^1.2.0",
"normalize-wheel": "^1.0.1",
"resize-observer-polyfill": "^1.5.0",
"throttle-debounce": "^1.0.1"
},
"peerDependencies": {
"vue": "^2.5.17"
}
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"node_modules/nanoid": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
"integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"peer": true,
"bin": {
"nanoid": "bin/nanoid.cjs"
},
"engines": {
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/normalize-wheel": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
"integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA=="
},
"node_modules/picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
"peer": true
},
"node_modules/postcss": {
"version": "8.4.31",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
"integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/postcss"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"peer": true,
"dependencies": {
"nanoid": "^3.3.6",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
},
"engines": {
"node": "^10 || ^12 || >=14"
}
},
"node_modules/regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
},
"node_modules/resize-observer-polyfill": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
"integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
},
"node_modules/sortablejs": {
"version": "1.10.2",
"resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.2.tgz",
"integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A=="
},
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/source-map-js": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
"peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/throttle-debounce": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz",
"integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg==",
"engines": {
"node": ">=4"
}
},
"node_modules/umy-table": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/umy-table/-/umy-table-1.1.8.tgz",
"integrity": "sha512-yqPMFwZ6MUNqI73KamsNKBTbHRA7VuVZDEWobaySghtf4n/s7INuTNQoADB/ROVK57WOXr99Xpnol0aMqGlASA==",
"dependencies": {
"async-validator": "~1.8.1",
"deepmerge": "^1.2.0",
"normalize-wheel": "^1.0.1",
"resize-observer-polyfill": "^1.5.0",
"throttle-debounce": "^1.0.1",
"vuedraggable": "^2.23.2",
"xe-utils": "^3.0.0-beta.12"
},
"peerDependencies": {
"vue": ">= 2.6.0 < 3",
"xe-utils": ">= 3"
}
},
"node_modules/umy-ui": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/umy-ui/-/umy-ui-1.1.6.tgz",
"integrity": "sha512-wX0S29B5sFn8q0MvU9PEl8DGZeQmZXOJlLrwaCJ2UHiIQZCANWgXMBjjQgpaequ1gRZ8BekEu7Sn7hJccm9YMQ==",
"dependencies": {
"async-validator": "~1.8.1",
"deepmerge": "^1.2.0",
"normalize-wheel": "^1.0.1",
"resize-observer-polyfill": "^1.5.0",
"throttle-debounce": "^1.0.1",
"umy-table": "1.1.8",
"vuedraggable": "^2.23.2",
"xe-utils": "^3.0.0-beta.12"
},
"peerDependencies": {
"vue": ">= 2.6.0 < 3",
"xe-utils": ">= 3"
}
},
"node_modules/vk-unicloud-admin-ui": {
"version": "1.17.46",
"resolved": "https://registry.npmjs.org/vk-unicloud-admin-ui/-/vk-unicloud-admin-ui-1.17.46.tgz",
"integrity": "sha512-VJvi8Gm3mfZOFEilIrZ1bSoi192ov9hPzSFzkR6l62pqJ3UEwgjTr5L2gQqxw4twb+y5qDmWZPS4dQMwya+iiQ=="
},
"node_modules/vue": {
"version": "2.7.15",
"resolved": "https://registry.npmjs.org/vue/-/vue-2.7.15.tgz",
"integrity": "sha512-a29fsXd2G0KMRqIFTpRgpSbWaNBK3lpCTOLuGLEDnlHWdjB8fwl6zyYZ8xCrqkJdatwZb4mGHiEfJjnw0Q6AwQ==",
"peer": true,
"dependencies": {
"@vue/compiler-sfc": "2.7.15",
"csstype": "^3.1.0"
}
},
"node_modules/vue-cropper": {
"version": "0.6.4",
"resolved": "https://registry.npmjs.org/vue-cropper/-/vue-cropper-0.6.4.tgz",
"integrity": "sha512-U3bm17Li/Xwfw2t3pr8/hFE/tYhvwIWqepHK9IFC1TnX1KFd64VyfCD9nMBhPY91RyvMC6jSQgT/DyDNKuTpIQ=="
},
"node_modules/vuedraggable": {
"version": "2.24.3",
"resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.24.3.tgz",
"integrity": "sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==",
"dependencies": {
"sortablejs": "1.10.2"
}
},
"node_modules/xe-utils": {
"version": "3.5.13",
"resolved": "https://registry.npmjs.org/xe-utils/-/xe-utils-3.5.13.tgz",
"integrity": "sha512-ORT6ghCRk0mUVavMBxetcPzUPskS6NGfntzpWazJ86e+XU0uK4HwHfDhN/jKATiyInrOH5RwQo9SO/+DB8XeBw=="
}
},
"dependencies": {
"@babel/parser": {
"version": "7.23.0",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz",
"integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==",
"peer": true
},
"@vue/compiler-sfc": {
"version": "2.7.15",
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.15.tgz",
"integrity": "sha512-FCvIEevPmgCgqFBH7wD+3B97y7u7oj/Wr69zADBf403Tui377bThTjBvekaZvlRr4IwUAu3M6hYZeULZFJbdYg==",
"peer": true,
"requires": {
"@babel/parser": "^7.18.4",
"postcss": "^8.4.14",
"source-map": "^0.6.1"
}
},
"async-validator": {
"version": "1.8.5",
"resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz",
"integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==",
"requires": {
"babel-runtime": "6.x"
}
},
"babel-helper-vue-jsx-merge-props": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
"integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg=="
},
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"core-js": {
"version": "2.6.12",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
"integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
},
"csstype": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
"integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==",
"peer": true
},
"deepmerge": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz",
"integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ=="
},
"element-ui": {
"version": "2.15.13",
"resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.15.13.tgz",
"integrity": "sha512-LJoatEYX6WV74FqXBss8Xfho9fh9rjDSzrDrTyREdGb1h1R3uRvmLh5jqp2JU137aj4/BgqA3K06RQpQBX33Bg==",
"requires": {
"async-validator": "~1.8.1",
"babel-helper-vue-jsx-merge-props": "^2.0.0",
"deepmerge": "^1.2.0",
"normalize-wheel": "^1.0.1",
"resize-observer-polyfill": "^1.5.0",
"throttle-debounce": "^1.0.1"
}
},
"lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"nanoid": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
"integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
"peer": true
},
"normalize-wheel": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
"integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA=="
},
"picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
"peer": true
},
"postcss": {
"version": "8.4.31",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
"integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
"peer": true,
"requires": {
"nanoid": "^3.3.6",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
}
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
},
"resize-observer-polyfill": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
"integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
},
"sortablejs": {
"version": "1.10.2",
"resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.2.tgz",
"integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A=="
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"peer": true
},
"source-map-js": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
"peer": true
},
"throttle-debounce": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz",
"integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg=="
},
"umy-table": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/umy-table/-/umy-table-1.1.8.tgz",
"integrity": "sha512-yqPMFwZ6MUNqI73KamsNKBTbHRA7VuVZDEWobaySghtf4n/s7INuTNQoADB/ROVK57WOXr99Xpnol0aMqGlASA==",
"requires": {
"async-validator": "~1.8.1",
"deepmerge": "^1.2.0",
"normalize-wheel": "^1.0.1",
"resize-observer-polyfill": "^1.5.0",
"throttle-debounce": "^1.0.1",
"vuedraggable": "^2.23.2",
"xe-utils": "^3.0.0-beta.12"
}
},
"umy-ui": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/umy-ui/-/umy-ui-1.1.6.tgz",
"integrity": "sha512-wX0S29B5sFn8q0MvU9PEl8DGZeQmZXOJlLrwaCJ2UHiIQZCANWgXMBjjQgpaequ1gRZ8BekEu7Sn7hJccm9YMQ==",
"requires": {
"async-validator": "~1.8.1",
"deepmerge": "^1.2.0",
"normalize-wheel": "^1.0.1",
"resize-observer-polyfill": "^1.5.0",
"throttle-debounce": "^1.0.1",
"umy-table": "1.1.8",
"vuedraggable": "^2.23.2",
"xe-utils": "^3.0.0-beta.12"
}
},
"vk-unicloud-admin-ui": {
"version": "1.17.46",
"resolved": "https://registry.npmjs.org/vk-unicloud-admin-ui/-/vk-unicloud-admin-ui-1.17.46.tgz",
"integrity": "sha512-VJvi8Gm3mfZOFEilIrZ1bSoi192ov9hPzSFzkR6l62pqJ3UEwgjTr5L2gQqxw4twb+y5qDmWZPS4dQMwya+iiQ=="
},
"vue": {
"version": "2.7.15",
"resolved": "https://registry.npmjs.org/vue/-/vue-2.7.15.tgz",
"integrity": "sha512-a29fsXd2G0KMRqIFTpRgpSbWaNBK3lpCTOLuGLEDnlHWdjB8fwl6zyYZ8xCrqkJdatwZb4mGHiEfJjnw0Q6AwQ==",
"peer": true,
"requires": {
"@vue/compiler-sfc": "2.7.15",
"csstype": "^3.1.0"
}
},
"vue-cropper": {
"version": "0.6.4",
"resolved": "https://registry.npmjs.org/vue-cropper/-/vue-cropper-0.6.4.tgz",
"integrity": "sha512-U3bm17Li/Xwfw2t3pr8/hFE/tYhvwIWqepHK9IFC1TnX1KFd64VyfCD9nMBhPY91RyvMC6jSQgT/DyDNKuTpIQ=="
},
"vuedraggable": {
"version": "2.24.3",
"resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.24.3.tgz",
"integrity": "sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==",
"requires": {
"sortablejs": "1.10.2"
}
},
"xe-utils": {
"version": "3.5.13",
"resolved": "https://registry.npmjs.org/xe-utils/-/xe-utils-3.5.13.tgz",
"integrity": "sha512-ORT6ghCRk0mUVavMBxetcPzUPskS6NGfntzpWazJ86e+XU0uK4HwHfDhN/jKATiyInrOH5RwQo9SO/+DB8XeBw=="
}
}
}
+15 -2
View File
@@ -19,11 +19,24 @@
"repository": "https://gitee.com/vk-uni/vk-uni-cloud-router", "repository": "https://gitee.com/vk-uni/vk-uni-cloud-router",
"name": "vk-unicloud-router", "name": "vk-unicloud-router",
"dependencies": { "dependencies": {
"@icon-park/vue": "^1.4.2",
"@vant/area-data": "^1.5.1",
"async-validator": "^4.2.5",
"babel-helper-vue-jsx-merge-props": "^2.0.3",
"dayjs": "^1.11.10",
"element-ui": "2.15.13", "element-ui": "2.15.13",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"normalize-wheel": "^1.0.1",
"resize-observer-polyfill": "^1.5.1",
"sortablejs": "^1.15.0",
"throttle-debounce": "^1.1.0",
"umy-table": "^1.1.8",
"umy-ui": "1.1.6", "umy-ui": "1.1.6",
"vk-unicloud-admin-ui": "^1.17.45", "vk-unicloud-admin-ui": "^1.17.53",
"vue-cropper": "^0.6.4" "vue": "^2.7.15",
"vue-cropper": "^0.6.4",
"vuedraggable": "^2.24.3",
"xe-utils": "^3.5.14"
}, },
"engines": { "engines": {
"HBuilderX": "^3.1.2" "HBuilderX": "^3.1.2"
+8
View File
@@ -152,6 +152,14 @@
"navigationBarTitleText" : "加工单详情", "navigationBarTitleText" : "加工单详情",
"enablePullDownRefresh" : false "enablePullDownRefresh" : false
} }
},
{
"path" : "pages/process/my",
"style" :
{
"navigationBarTitleText" : "我的加工单",
"enablePullDownRefresh" : false
}
} }
], ],
"globalStyle": { "globalStyle": {
+5 -5
View File
@@ -13,12 +13,12 @@
<h2 style="margin-bottom: 15px;">会员登录</h2> <h2 style="margin-bottom: 15px;">会员登录</h2>
<div id="from" action=""> <div id="from" action="">
<div class="input-grouptabs clear"> <div class="input-grouptabs clear">
<span @click="memberType = 'personal'"
:class="{'tab-active': memberType == 'personal'}" class="normal" data-id="0"
id="normal"><i></i>个人用户</span>
<span @click="memberType = 'business'" <span @click="memberType = 'business'"
:class="{'tab-active': memberType == 'business'}" class="nopassword" data-id="1" :class="{'tab-active': memberType === 'business'}" class="nopassword" data-id="1"
id="nopw"><i></i>企业用户</span> id="nopw"><i></i>企业用户</span>
<span @click="memberType = 'personal'"
:class="{'tab-active': memberType === 'personal'}" class="normal" data-id="0"
id="normal"><i></i>个人用户</span>
</div> </div>
<!-- 账号密码登录 --> <!-- 账号密码登录 -->
<view class="login-method"> <view class="login-method">
@@ -101,7 +101,7 @@
export default { export default {
data() { data() {
return { return {
memberType: 'personal', // business 企业 、、personal个人 memberType: 'business', // business 企业 、、personal个人
loginMethod: 'username', // username 用户名 + 密码 、、mobile 手机号 + 验证码 loginMethod: 'username', // username 用户名 + 密码 、、mobile 手机号 + 验证码
smsTips: '获取验证码', smsTips: '获取验证码',
form1: { form1: {
+5 -5
View File
@@ -11,12 +11,12 @@
<h2 style="margin-bottom: 15px;">免费注册会员</h2> <h2 style="margin-bottom: 15px;">免费注册会员</h2>
<view id="from" action=""> <view id="from" action="">
<div class="input-grouptabs clear"> <div class="input-grouptabs clear">
<span @click="form1.accountType = 1"
:class="{'tab-active': form1.accountType == 1}" class="normal" data-id="0"
id="normal"><i></i>个人用户</span>
<span @click="form1.accountType = 2" <span @click="form1.accountType = 2"
:class="{'tab-active': form1.accountType == 2}" class="nopassword" data-id="1" :class="{'tab-active': form1.accountType === 2}" class="nopassword" data-id="1"
id="nopw"><i></i>企业用户</span> id="nopw"><i></i>企业用户</span>
<span @click="form1.accountType = 1"
:class="{'tab-active': form1.accountType === 1}" class="normal" data-id="0"
id="normal"><i></i>个人用户</span>
</div> </div>
<div class="tabContent"> <div class="tabContent">
<div class="login-con active" id="rc"> <div class="login-con active" id="rc">
@@ -110,7 +110,7 @@
smsTips: '点击获取', smsTips: '点击获取',
form1: { form1: {
accountType: 1, // business 企业 、、personal个人 accountType: 2, // business 企业 、、personal个人
mobile: '', mobile: '',
smsCode: '', smsCode: '',
password: '', password: '',
+40 -17
View File
@@ -28,15 +28,21 @@
<view class="contract-list"> <view class="contract-list">
<view class="trade-method"> <view class="trade-method">
<view @click="formData.tradeMethod = 1" class="trade-method-item" <view @click="formData.tradeMethod = 1" class="trade-method-item"
:class="{active: formData.tradeMethod == 1}">自主交易</view> :class="{active: formData.tradeMethod == 1}">自主交易
</view>
<view @click="formData.tradeMethod = 0" class="trade-method-item" <view @click="formData.tradeMethod = 0" class="trade-method-item"
:class="{active: formData.tradeMethod == 0}">金久信公正</view> :class="{active: formData.tradeMethod == 0}">金久信公正
</view>
</view> </view>
<view v-for="(item,index) in tableData.rows" class="contract-box" :key="index"> <view v-for="(item,index) in tableData.rows" class="contract-box" :key="index">
<view class="contract-left"> <view class="contract-left">
<view class="contract-left-top"> <view class="contract-left-top">
<el-tag size="mini" v-if="item.contract.type == 'enquiry'" type="danger" <el-tag size="mini" v-if="item.contract.type === 'enquiry'" type="danger"
effect="plain">询价单</el-tag> effect="plain">询价单
</el-tag>
<el-tag size="mini" v-else-if="item.contract.type === 'process'" type="warning"
effect="plain">加工单
</el-tag>
<view class="contract-product"> <view class="contract-product">
{{ item.contract.productTitle }} {{ item.contract.productTitle }}
</view> </view>
@@ -46,28 +52,38 @@
<view class="contract-status-tag" <view class="contract-status-tag"
v-for="(party, pIndex) in item.contract.partyList" :key="pIndex"> v-for="(party, pIndex) in item.contract.partyList" :key="pIndex">
<el-tag size="mini" <el-tag size="mini"
v-if="party.userId != vk.getVuex('$user.userInfo._id') && !party.sign" v-if="party.userId !== vk.getVuex('$user.userInfo._id') && !party.sign"
type="warning" effect="plain">待交易方签署</el-tag> type="warning" effect="plain">待交易方签署
</el-tag>
<el-tag size="mini" <el-tag size="mini"
v-if="party.userId == vk.getVuex('$user.userInfo._id') && !party.sign" v-if="party.userId === vk.getVuex('$user.userInfo._id') && !party.sign"
type="warning" effect="plain">待我签署</el-tag> type="warning" effect="plain">待我签署
</el-tag>
</view> </view>
</template> </template>
<text v-if="item.contract.status == -1">已作废</text> <text v-if="item.contract.status == -1">已作废</text>
</view> </view>
</view> </view>
<view class="contract-left-center"> <view class="contract-left-center">
交易编码:{{item.contract.transactionId}} 创建时间:{{item.contract._add_time_str}} <view>
交易编码:{{ item.contract.transactionId }}
</view>
<view>
创建时间:{{ item.contract._add_time_str }}
</view>
</view> </view>
<view class="contract-left-bottom"> <view class="contract-left-bottom">
<el-button size="mini" type="text">查看交易方</el-button> <el-button size="mini" type="text">查看交易方</el-button>
<el-button <el-button
v-if="item.contract.status == 0 && item.contract.userId == vk.getVuex('$user.userInfo._id')" v-if="item.contract.status === 0 && item.contract.userId === vk.getVuex('$user.userInfo._id')"
@click="createContract(item.contract)" size="mini" type="text">创建合同</el-button> @click="createContract(item.contract)" size="mini" type="text">创建合同
</el-button>
<el-button v-if="item.contract.status == 1" @click="extSign(item.contract)" <el-button v-if="item.contract.status == 1" @click="extSign(item.contract)"
size="mini" type="text">签署合同</el-button> size="mini" type="text">签署合同
</el-button>
<el-button v-if="item.contract.status == 2" @click="viewContract(item.contract)" <el-button v-if="item.contract.status == 2" @click="viewContract(item.contract)"
size="mini" type="text">查看合同</el-button> size="mini" type="text">查看合同
</el-button>
</view> </view>
</view> </view>
<view class="contract-right"> <view class="contract-right">
@@ -77,7 +93,8 @@
<view class=""> <view class="">
<el-button <el-button
v-if="item.contract.status == 1 && item.contract.userId == vk.getVuex('$user.userInfo._id')" v-if="item.contract.status == 1 && item.contract.userId == vk.getVuex('$user.userInfo._id')"
size="mini" type="primary">修改合同内容</el-button> size="mini" type="primary">修改合同内容
</el-button>
</view> </view>
</view> </view>
</view> </view>
@@ -98,7 +115,8 @@
<el-dialog :visible.sync="form1.props.show"> <el-dialog :visible.sync="form1.props.show">
<vk-data-form ref="form1" v-model="form1.data" :action="form1.props.action" :columns="form1.props.columns" <vk-data-form ref="form1" v-model="form1.data" :action="form1.props.action" :columns="form1.props.columns"
:rules="form1.props.rules" :form-type="form1.props.formType" :loading.sync="form1.props.loading" :rules="form1.props.rules" :form-type="form1.props.formType"
:loading.sync="form1.props.loading"
:auto-close="true" label-width="140px" @success="onFormSuccess"></vk-data-form> :auto-close="true" label-width="140px" @success="onFormSuccess"></vk-data-form>
</el-dialog> </el-dialog>
@@ -303,9 +321,11 @@
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
border-bottom: solid 1px #e8e8e8; border-bottom: solid 1px #e8e8e8;
padding: 10rpx 0;
} }
.contract-left {} .contract-left {
}
.contract-right { .contract-right {
text-align: right; text-align: right;
@@ -344,9 +364,12 @@
.contract-left-center { .contract-left-center {
height: 40px; height: 40px;
display: flex; display: flex;
align-items: center; justify-content: flex-start;
align-items: flex-start;
color: #999999; color: #999999;
font-size: 12px; font-size: 12px;
flex-direction: column;
margin-top: 5px;
} }
.contract-left-bottom { .contract-left-bottom {
+238 -18
View File
@@ -1,16 +1,196 @@
<template> <template>
<view> <view class="border-bottom pt-20">
<!-- <view class="product-title">{{title}}</view> --> <el-form ref="form" :model="form1" label-width="80px" :rules="form1.props.rules">
<vk-data-form v-if="attributesLoaded" ref="form1" v-model="form1.data" :action="form1.props.action" :columns="form1.props.columns" <el-row :gutter="10">
:rules="form1.props.rules" :form-type="form1.props.formType" :loading.sync="form1.props.loading" <el-col :span="6">
:before-action="form1.props.beforeAction" :auto-close="true" label-width="140px" :footer-show="false" <el-form-item label="商品名称">
@success="onFormSuccess"> <el-select v-model="form1.data.goodsId" placeholder="请选择商品" @change="selectGoods">
</vk-data-form> <el-option
v-for="(item, index) in goodsList"
:key="index"
:label="item.name"
:value="item._id">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="规格型号">
<el-select v-model="form1.data.model" placeholder="请选择">
<template v-if=" attributes.find(attr => attr.label === '规格型号')">
<el-option
v-for="(item, index) in attributes.find(attr => attr.label === '规格型号').options"
:key="index"
:label="item.label"
:value="item.value">
</el-option>
</template>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="其他数据">
<el-select v-model="form1.data.otherData" placeholder="请选择">
<template v-if=" attributes.find(attr => attr.label === '其他数据')">
<el-option
v-for="(item, index) in attributes.find(attr => attr.label === '其他数据').options"
:key="index"
:label="item.label"
:value="item.value">
</el-option>
</template>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="执行标准">
<el-select v-model="form1.data.standard" placeholder="请选择">
<template v-if="form1.data.goodsId">
<el-option
v-for="(item, index) in goodsList.find(goods => goods._id === form1.data.goodsId).attributes.filter(attr => attr.label === '执行标准')[0].values"
:key="index"
:label="item"
:value="item">
</el-option>
</template>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="10">
<el-form-item label="单件长度">
<el-input placeholder="请输入内容" v-model="form1.data.singleLength" class="input-with-select">
<el-select v-model="form1.data.singleLengthUnit" slot="append" placeholder="请选择">
<template v-if=" attributes.find(attr => attr.label === '单件长度')">
<el-option
v-for="(item, index) in attributes.find(attr => attr.label === '单件长度').options"
:key="index"
:label="item.label"
:value="item.value">
</el-option>
</template>
</el-select>
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="材质">
<el-select v-model="form1.data.materialQuality" placeholder="请选择">
<template v-if=" attributes.find(attr => attr.label === '材质')">
<el-option
v-for="(item, index) in attributes.find(attr => attr.label === '材质').options"
:key="index"
:label="item.label"
:value="item.value">
</el-option>
</template>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="交货服务">
<el-select v-model="form1.data.deliverService" placeholder="请选择">
<template v-if=" attributes.find(attr => attr.label === '交货服务')">
<el-option
v-for="(item, index) in attributes.find(attr => attr.label === '交货服务').options"
:key="index"
:label="item.label"
:value="item.value">
</el-option>
</template>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="12">
<el-form-item label="采购数量">
<el-input v-model="form1.data.procureNumber">
<el-select v-model="form1.data.procureUnit" slot="append" placeholder="请选择">
<template v-if=" attributes.find(attr => attr.label === '单位')">
<el-option
v-for="(item, index) in attributes.find(attr => attr.label === '单位').options"
:key="index"
:label="item.label"
:value="item.value">
</el-option>
</template>
</el-select>
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="计价形式">
<el-select v-model="form1.data.pricingForm" placeholder="请选择">
<template v-if="attributes.find(attr => attr.label === '计价形式')">
<el-option
v-for="(item, index) in attributes.find(attr => attr.label === '计价形式').options"
:key="index"
:label="item.label"
:value="item.value">
</el-option>
</template>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="6">
<el-form-item label="交货时限">
<el-date-picker
v-model="form1.data.deliveryTime"
type="date"
placeholder="选择日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="18">
<el-form-item label="交货地点" class="ml-10">
<el-row :gutter="10">
<el-col :span="5">
<el-select v-model="provinceIndex" placeholder="省" @change="selectProvince">
<el-option v-for="(item, index) in provinceData" :key="index" :value="index"
:label="item.name"/>
<!-- <span slot="prefix">省</span>-->
</el-select>
</el-col>
<el-col :span="5">
<el-select v-model="cityIndex" placeholder="市">
<template v-if="provinceIndex !== null">
<el-option v-for="(item, index) in cityData[provinceIndex]" :key="index"
:value="index"
:label="item.name"/>
</template>
<!-- <span slot="prefix">市</span>-->
</el-select>
</el-col>
<el-col :span="5">
<el-select v-model="areaIndex" placeholder="区/县">
<template v-if="provinceIndex !== null && cityIndex !== null">
<el-option v-for="(item, index) in areaData[provinceIndex][cityIndex]" :key="index" :value="index"
:label="item.name"/>
</template>
<!-- <span slot="prefix">区/县</span>-->
</el-select>
</el-col>
<el-col :span="8">
<el-input v-model="form1.data.addressRegion"
placeholder="详细地址或几公里范围内"></el-input>
</el-col>
</el-row>
</el-form-item>
</el-col>
</el-row>
</el-form>
</view> </view>
</template> </template>
<script> <script>
import Vue from 'vue' import provinces from "@/uni_modules/vk-uview-ui/libs/address/provinces.json";
import citys from "@/uni_modules/vk-uview-ui/libs/address/citys.json";
import areas from "@/uni_modules/vk-uview-ui/libs/address/areas.json";
export default { export default {
props: { props: {
value: { value: {
@@ -32,13 +212,34 @@
}, },
data() { data() {
return { return {
provinceData: provinces,
cityData: citys,
areaData: areas,
provinceIndex: null,
cityIndex: null,
areaIndex: null,
title: '商品', title: '商品',
attributesLoaded: false, attributesLoaded: false,
goodsList: [],
attributes: [], attributes: [],
form: {
addressDetail: ''
},
// 表单相关开始----------------------------------------------------------- // 表单相关开始-----------------------------------------------------------
form1: { form1: {
// 表单请求数据,此处可以设置默认值 // 表单请求数据,此处可以设置默认值
data: { data: {
goodsId: null,
model: null,
otherData: null,
materialQuality: null,
singleLength: null,
singleLengthUnit: null,
deliverService: null,
standard: null,
pricingForm: null,
deliveryTime: null,
len: null,
extraAttributes: {}, extraAttributes: {},
attributes: {}, attributes: {},
addressRegion: undefined addressRegion: undefined
@@ -112,9 +313,7 @@
type: "object", type: "object",
justify: "start", justify: "start",
showLabel: false, showLabel: false,
columns: [ columns: [],
],
}, },
{ {
key: "", key: "",
@@ -252,7 +451,6 @@
}, },
{ {
key: "", title: "", type: 'group', showLabel: false, justify: "start", columns: key: "", title: "", type: 'group', showLabel: false, justify: "start", columns:
[ [
@@ -280,7 +478,7 @@
], ],
// 表单验证规则 // 表单验证规则
rules: { rules: {
name:[ goodsId: [
{required: true, message: '商品不能为空', trigger: ["change", "blur"]} {required: true, message: '商品不能为空', trigger: ["change", "blur"]}
], ],
addressRegion: [ addressRegion: [
@@ -312,21 +510,36 @@
}, },
created() { created() {
this.form1.props.columns[0].title = '商品' + (this.productIndex + 1) this.form1.props.columns[0].title = '商品' + (this.productIndex + 1)
vk.callFunction({ vk.callFunction({
url: 'client/enquiry/attributes/pub/getList', url: 'client/enquiry/attributes/pub/getList',
title: '请求中...', title: '请求中...',
data: { data: {},
},
success: (data) => { success: (data) => {
this.attributes = data.rows this.attributes = data.rows
this.attributesLoaded = true this.attributesLoaded = true
} }
}); });
this.getGoodsList()
}, },
methods: { methods: {
getGoodsList() {
vk.callFunction({
url: 'client/enquiry/template/pub/getList',
title: '请求中',
success: ({rows}) => {
this.goodsList = rows
}
})
},
selectGoods(val) {
this.goodsList.forEach(({_id, name}) => {
if (_id === val) this.form1.data.goodsName = name
})
},
selectProvince(index){
console.log(index, this.provinceIndex)
console.log(this.cityData, this.cityData[index])
}
}, },
watch: { watch: {
"form1.data"(val) { "form1.data"(val) {
@@ -349,3 +562,10 @@
font-size: 14px; font-size: 14px;
} }
</style> </style>
<style>
.input-with-select .el-input-group__append {
background-color: #fff !important;
width: 130px !important;
}
</style>
+247 -118
View File
@@ -14,139 +14,208 @@
</el-breadcrumb> </el-breadcrumb>
</view> </view>
<view class="page-main"> <view class="page-main" v-if="sheet">
<el-descriptions class="description" title="采购商信息" :column="3" size="medium" direction="vertical" border> <view class="flex justify-between items-center">
<template slot="title"> <text class="text-gray">加工询价单编号:{{ sheet.orderNo }}</text>
采购商信息 (已有{{sheet.answerCount || 0}}家报价) <text class="text-gray">发布时间:{{ sheet._add_time_str }}</text>
</template> </view>
<template slot="extra"> <view class="my-25 flex justify-between items-center">
<span style="padding-right: 20px;">距离报价结束还剩<span <view class="flex justify-start items-center">
style="color: red;">{{vk.pubfn.dateDiff2(sheet.answerTime)}}</span></span> <text class="text-40 font-bold">{{ sheet.title }}</text>
<el-button type="primary" size="small" @click="toQuote">我要报价</el-button> <view class="ml-20 flex justify-start items-center">
</template> <building-one theme="outline" size="24" fill="#a92924" strokeLinecap="square"/>
<el-descriptions-item label="采购商"> <view class="text-main ">
<template v-if="sheet.user.accountType == 1">{{sheet.user.person.personName}}</template> <text class="mx-20">{{ sheet.quoteList.length > 0 ? sheet.quoteList.rows.length : 0 }}
<template v-if="sheet.user.accountType == 2">{{sheet.user.company.companyName}}</template> </text>
</el-descriptions-item> <text>家已报价</text>
<el-descriptions-item label="联系方式"> </view>
<template v-if="sheet.user.accountType == 1">{{sheet.user.person.mobile}}</template> </view>
<template v-if="sheet.user.accountType == 2">{{sheet.user.company.companyName}}</template> </view>
</el-descriptions-item> <view class="flex justify-end items-end"
<el-descriptions-item label="发布时间"> v-if="sheet.answerEndTime && dayjs().diff(dayjs(sheet.answerEndTime), 'second') > 0">
{{sheet._add_time_str}} <text>距离报价结束还有:</text>
</el-descriptions-item> <view class="border-main countdown text-main">{{
</el-descriptions> dayjs().diff(dayjs(sheet.answerEndTime), 'day')
}}
</view>
<text>天</text>
<view class="border-main countdown text-main">
{{ (dayjs().diff(dayjs(sheet.answerEndTime), 'hour')) % 24 }}
</view>
<text>时</text>
</view>
</view>
<view class="my-25 flex justify-between items-center pb-20 border-bottom">
<view class="flex justify-start items-center">
<id-card theme="outline" size="24" fill="#a92924" strokeLinecap="square"/>
<text class="ml-15 text-gray">
{{
sheet.user.accountType === 1 ? sheet.user.person.personName : sheet.user.company.companyName
}}
</text>
</view>
<el-button type="primary" @click.native="toQuote"
v-if="vk.getVuex('$user.userInfo._id') !== sheet.userId">我要申请加工
</el-button>
<el-button type="primary" @click.native="showDialog = true"
v-else>查看收到的申请加工
</el-button>
</view>
<view class="item-wrap">
<view class="form-title-wrap">
<view class="goods-sheet-title">
<view class="form-title">
上传的附件
</view>
</view>
</view>
<view class="mt-15 mr-15" v-for="(item, index) in sheet.files" :key="index">
<el-image :src="item" style="width: 100px; height: 100px" fit="cover"
:preview-src-list="sheet.files"/>
</view>
</view>
<!-- 产品列表 --> <view class="item-wrap">
<el-descriptions v-for="(item,index) in productList" class="description" :title="'采购商品' + (index + 1)" <view class="form-title-wrap">
:column="3" size="medium" border :key="index"> <view class="goods-sheet-title">
<el-descriptions-item label="商品"> <view class="form-title">
{{item.name}} 采购商其他要求
</el-descriptions-item> </view>
<el-descriptions-item v-for="(attr, aindex) in item.extraAttributes" :label="attr.keyName" </view>
:key="aindex"> </view>
{{attr.keyValue}} <view class="mt-15">{{ sheet.remark }}</view>
</el-descriptions-item> </view>
<el-descriptions-item label="品牌厂家">
{{item.brand}}
</el-descriptions-item>
<el-descriptions-item label="材质"> <view class="item-wrap">
{{item.materialQuality}} <view class="form-title-wrap">
</el-descriptions-item> <view class="goods-sheet-title">
<el-descriptions-item label="单件长度"> <view class="form-title">
{{item.singleLength}} 纳税和税票
</el-descriptions-item> </view>
<el-descriptions-item label="产品标准"> </view>
{{item.productStandard}} </view>
</el-descriptions-item> <view class="mt-15">是否含税:{{ sheet.invoice ? '含税' : '不含税' }}</view>
<el-descriptions-item label="计价形式"> <view class="mt-15">开票时间:{{ WRITE_INVOICE_TIME[sheet.writeInvoiceTime] }}</view>
{{item.pricingForm}} <view class="mt-15">发票种类:{{ INVOICE_TYPE[sheet.invoiceType] }}</view>
</el-descriptions-item> <view class="mt-15">其他要求:{{ sheet.invoiceOther }}</view>
<el-descriptions-item label="加工标准"> </view>
{{item.processStandard}}
</el-descriptions-item>
<el-descriptions-item label="交货服务">
{{item.deliveryService}}
</el-descriptions-item>
<el-descriptions-item label="交货时限">
{{item.deliveryTime}}
</el-descriptions-item>
<el-descriptions-item label="采购数量">
{{item.procureNumber}}{{item.procureUnit}}
</el-descriptions-item>
<el-descriptions-item label="交货地点">
<template
v-if="item.address && item.address.region">{{item.address.region.province.name + "-" + item.address.region.city.name + "-" + item.address.region.area.name}}</template>
</el-descriptions-item>
</el-descriptions>
<el-descriptions class="description" title="采购商其他要求" :column="3" size="medium" direction="vertical" border> <view class="item-wrap">
<el-descriptions-item label="其他要求"> <view class="form-title-wrap">
{{sheet.remark || '无'}} <view class="goods-sheet-title">
</el-descriptions-item> <view class="form-title">
</el-descriptions> 运输要求
</view>
</view>
</view>
<view class="mt-15">随货资料:{{ sheet.transportDocuments.join() }}</view>
<view class="mt-15">其他要求:{{ sheet.otherTransportDocuments }}</view>
<view class="mt-15">运输限制要求:{{ sheet.transportLimit ? '有' : '无' }}</view>
</view>
<el-descriptions class="description" title="发票要求" :column="3" size="medium" border direction="vertical"> <view class="item-wrap">
<el-descriptions-item label="是否含税"> <view class="form-title-wrap">
{{sheet.invoice? '含税': '不含税'}} <view class="goods-sheet-title">
</el-descriptions-item> <view class="form-title">
<el-descriptions-item v-if="sheet.invoice" label="发票种类"> 交易说明
{{sheet.nvoiceType}} </view>
</el-descriptions-item> </view>
<el-descriptions-item v-if="sheet.invoice" label="开票时间"> </view>
{{sheet.writeInvoiceTime}} <view class="mt-15">付款方式:{{ PROCESS_PAY_METHOD[sheet.payMethod] }}</view>
</el-descriptions-item> <view class="mt-15">报价形式:{{ sheet.offerType === 0 ? '整单报价' : '可分项报价' }}</view>
</el-descriptions> <view class="mt-15">报价期限:
<text v-if="sheet.answerStartTime && sheet.answerEndTime">{{
<el-descriptions class="description" title="运输要求" :column="3" size="medium" border direction="vertical"> dayjs(sheet.answerStartTime).format('YYYY-MM-DD')
<el-descriptions-item label="随货资料"> }}~{{ dayjs(sheet.answerEndTime).format('YYYY-MM-DD') }}
{{sheet.transportDocuments.join("、")}} </text>
</el-descriptions-item> </view>
<el-descriptions-item label="其他资料"> </view>
{{sheet.otherTransportDocuments}}
</el-descriptions-item>
<el-descriptions-item label="运输限制">
{{sheet.transportLimit}}
</el-descriptions-item>
</el-descriptions>
<el-descriptions class="description" title="交易模式" :column="3" size="medium" border>
<el-descriptions-item label="交易模式">
<template v-if="sheet.tradeMethod == 1">自主交易</template>
<template v-else-if="sheet.tradeMethod == 0">金久信公正</template>
</el-descriptions-item>
<el-descriptions-item label="付款方式">
<template v-if="sheet.payMethod == 1">预付{{sheet.advancePayRate}}%货到付全款</template>
<template v-else-if="sheet.payMethod == 2">货到验收后付款</template>
<template v-else-if="sheet.payMethod == 3">提货付全款</template>
<template v-else-if="sheet.payMethod == 4">信誉采购</template>
<template v-else-if="sheet.payMethod == 5">{{item.otherPayMethod}}</template>
</el-descriptions-item>
<el-descriptions-item label="报价时限">
{{vk.pubfn.timeFormat(sheet.answerTime,"yyyy-MM-dd hh:mm:ss")}}
</el-descriptions-item>
<el-descriptions-item label="保证金要求">
{{sheet.earnestMoney}}
</el-descriptions-item>
</el-descriptions>
<view class="item-wrap">
<view class="form-title-wrap">
<view class="goods-sheet-title">
<view class="form-title">
简易合同备注和其他补充条款
</view>
</view>
</view>
<view class="mt-15">违约责任:</view>
<view class="mt-15">
1.乙方所交产品品种、型号、规格、质量不符合规定的,如果甲方同意利用,应当按质论价;如果甲方不能利用的,应根据产品的具体情况,由乙方负责包换或包修,并承担修理、调换或退货而支付的实际费用;2.乙方不予供货违约责任为甲方的实际损失+违约金,如乙方材料符合订货标准,甲方不能退货和不收货,甲方无条件应按实际本合同订货数量支付100%货款,并支付乙方因此产生的实际费用。带有甲乙双方单位相关收货人和发货人签字的本合同的发货清单事项和内容均视为本合同的补充合同,与本合同有相同的法律效力,双方应共同遵照执行。
</view>
<view class="mt-15">解决纠纷的方法:</view>
<view class="mt-15">
1、凡因本合同引起的或与本合同有关的任何争议,均可友好协商或仲裁解决,协商或仲裁不成的,双方协商同意在合同签订地人民法院管辖地起诉,违约一方或对合同争议承担主要责任的一方,应承担对方因仲裁和起诉而产生的全部律师代理费、鉴定(检验)费、诉讼保全费、诉讼保险费、公告费、差旅费、执行费、误工費和获取证据产生费用等其他相关费用。2、双方本合同相关权利放弃均应有双方书面作出并加盖公章或授权委托人签字后生效。
</view>
<view class="mt-15">不可抗力:</view>
<view class="mt-15">
甲乙双方的任何一方由于不可抗力或突发公共事件的原因不能履行合同时,应及时向对方通报不能履行或不能完全履行的理由,以减轻可能给对方造成的损失,在取得有关机构证明以后,允许延期履行、部分履行或者不履行合同,并根据情况可部分或全部免予承担违约责任。
</view>
<view class="mt-15">其他:</view>
<view class="mt-15">
本合同的全部内容由双方平等共同协商一致,共同起草制定,非一方事先拟定,不属于格式条款。本合同自双方签字盖章后生效(包括电子签字、盖章),按本合同内容地址、联系方式寄送的一切文书、函件送达与否,均为视为送达有法律效力,通知途径和本合同内联系方式或地址送达文件双方均予以验证。
</view>
<view class="mt-15">采购方补充条款: 供货方逾期供货承担采购方一切损失</view>
<view class="mt-15"> 供应方补充条款:</view>
</view>
<view class="item-wrap">
<view class="form-title-wrap">
<view class="goods-info-title">
<view class="form-title">
已收到的加工申请
</view>
</view>
</view>
<!-- 报价列表 --> <!-- 报价列表 -->
<vk-data-table :data="sheet.quoteList" :columns="table1.columns" title="adasda " :customRightBtns="table1.customRightBtns"></vk-data-table> <vk-data-table :data="sheet.quoteList" :columns="table1.columns" title="adasda "
:customRightBtns="table1.customRightBtns"></vk-data-table>
</view>
</view> </view>
<common-footer></common-footer> <common-footer></common-footer>
<el-dialog :visible.sync="showDialog" width="70%" :show-close="false">
<view slot="title" class="text-main text-40 m-30 flex justify-between items-center">
<text>收到的报价</text>
<el-button type="primary" @click.native="showDialog = false">关闭</el-button>
</view>
<view class="mt-15">
<view class="request-header">
<text class="flex-1">供应商</text>
<text class="flex-1">报价时间</text>
<text class="flex-1">联系方式</text>
<text class="flex-1">报价</text>
<text class="flex-1">操作</text>
</view>
<view class="quote" v-for="(item, index) in sheet.quoteList.rows" :key="index">
<text class="flex-1">{{ item.subjectName }}</text>
<text class="flex-1">{{ item._add_time_str }}</text>
<text class="flex-1">{{ item.subjectMobile }}</text>
<text class="flex-1">{{ item.totalPrice }}元</text>
<text class="flex-1">
<el-button type="primary">选择</el-button>
</text>
</view>
</view>
</el-dialog>
</view> </view>
</template> </template>
<script> <script>
import {BuildingOne, IdCard} from "@icon-park/vue";
import dayjs from "dayjs";
import {WRITE_INVOICE_TIME, INVOICE_TYPE, PROCESS_PAY_METHOD} from '@/util'
export default { export default {
components: {BuildingOne, IdCard},
data() { data() {
return { return {
WRITE_INVOICE_TIME,
INVOICE_TYPE,
PROCESS_PAY_METHOD,
enquiryId: undefined, enquiryId: undefined,
showDialog: false,
productList: [], productList: [],
sheetTitle: '', sheetTitle: '',
sheet: { sheet: {
@@ -278,6 +347,7 @@
this.getEnquiryDetail() this.getEnquiryDetail()
}, },
methods: { methods: {
dayjs,
/** /**
* 打开报价窗口 * 打开报价窗口
*/ */
@@ -318,18 +388,20 @@
const { const {
productList productList
} = res.data } = res.data
let title = []
productList.forEach(item => { productList.forEach(item => {
const keys = Object.keys(item.extraAttributes) const keys = Object.keys(item.extraAttributes)
keys.forEach(citem => { keys.forEach(citem => {
item.extraAttributes[citem] = JSON.parse(item.extraAttributes[ item.extraAttributes[citem] = JSON.parse(item.extraAttributes[
citem]) citem])
}) })
title.push(item.goodsName)
}) })
this.productList = productList this.productList = productList
delete res.data.productList delete res.data.productList
this.sheet = res.data this.sheet = {...res.data, ...{title: title.join()}}
} }
}); });
} }
@@ -338,14 +410,71 @@
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/common/css/app.scss";
.page-main { .page-main {
width: 1200px; width: 1200px;
margin: 20px auto; margin: 20px auto;
background-color: #FFFFFF; background-color: #FFFFFF;
padding: 20px; padding: 20px;
border-radius: 5px;
} }
.description { .countdown {
margin-bottom: 40px; padding: 2px 5px;
margin: 0 5px;
}
.item-wrap {
margin: 24px 0;
.form-title-wrap {
display: flex;
align-items: center;
justify-content: space-between;
.goods-info-title {
display: flex;
align-items: center;
justify-content: flex-start;
}
.form-title {
padding-left: 10px;
color: $--color-primary;
font-size: 18px;
line-height: 18px;
border-left: 4px solid $--color-primary;
}
}
}
.request-header {
border: 1px solid #EDEDED;
background-color: #FFF8F1;
display: flex;
align-items: center;
justify-content: center;
padding: 15px;
margin-top: 30px;
text {
text-align: center;
}
}
.quote {
border-left: 1px solid #EDEDED;
border-right: 1px solid #EDEDED;
border-bottom: 1px solid #EDEDED;
display: flex;
align-items: center;
justify-content: center;
padding: 15px;
text {
text-align: center;
}
} }
</style> </style>
+176 -46
View File
@@ -22,7 +22,8 @@
<view class="goods-options"> <view class="goods-options">
<el-row class=""> <el-row class="">
<el-button @click="toRelease" type="primary" round>发布询价单</el-button> <el-button @click="toRelease" type="primary" round>发布询价单</el-button>
<el-button @click="toMyEnquiry" type="primary" round plain>我发布的询价单</el-button> <el-button @click="toMyEnquiry" type="primary" round plain class="post-btn">我发布的询价单
</el-button>
</el-row> </el-row>
</view> </view>
</view> </view>
@@ -31,29 +32,77 @@
<!-- 筛选表单 --> <!-- 筛选表单 -->
<view class="filter-outer"> <view class="filter-outer">
<el-form @submit.native.prevent label-width="80px"> <el-form @submit.native.prevent label-width="80px">
<el-form-item label="关键词"> <el-form-item label="关键词:" class="border-bottom pb-30">
<el-input @keyup.enter.native="query(1)" clearable placeholder="输入关键字搜索" v-model="keyword"> <el-input @keyup.enter.native="search(1)" clearable placeholder="输入关键字搜索" v-model="keyword">
<el-button @click="query(1)" type="primary" slot="append" icon="el-icon-search"></el-button> <i slot="prefix" class="el-input__icon el-icon-search"></i>
<el-button @click="search(1)" type="primary" slot="append" style="border-radius: 0">搜索
</el-button>
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item label="分类"> <el-form-item label="分类:" class="border-bottom pb-30">
<el-tabs> <view class="flex justify-start items-center flex-wrap">
<el-tab-pane v-for="(item, index) in categoryTreeData" :label="item.name" :key="item._id"> <text @click="clickedCateIndex = -1" class="pointer mr-25"
<el-checkbox-group v-model="checkCategoryList[index]"> :class="[clickedCateIndex === -1 ? 'text-main selected-cate' : '']">全部
<el-checkbox v-for="(citem, cindex) in item.children" :label="citem" </text>
:key="cindex">{{citem.name}}</el-checkbox> <view v-for="(item, index) in categoryTreeData" :key="index">
</el-checkbox-group> <text @click="clickedCateIndex = index" class="pointer mr-25"
</el-tab-pane> :class="[clickedCateIndex === index ? 'text-main selected-cate' : '']"
</el-tabs> v-if="index < 10">
{{ item.name }}
</text>
</view>
</view>
<view class="child-cate flex justify-start items-center flex-wrap">
<template v-if="clickedCateIndex === -1">
<text class="pointer mr-25" @click="selectCate(item._id)"
:class="[checkCategoryList.includes(item._id) ? 'text-main' : '']"
v-for="(item, index) in allChildCate" :key="index">{{ item.name }}
</text>
</template>
<template v-else>
<text class="pointer mr-25" @click="selectCate(item._id)"
:class="[checkCategoryList.includes(item._id) ? 'text-main' : '']"
v-for="(item, index) in categoryTreeData[clickedCateIndex].children" :key="index">
{{ item.name }}
</text>
</template>
<!-- <text @click="showAllTexture = !showAllTexture" class="pointer mr-25" >查看更多-->
<!-- </text>-->
</view>
</el-form-item> </el-form-item>
<el-form-item label="城市"> <el-form-item label="材质:" class="border-bottom pb-30">
<el-checkbox-group v-model="checkProvinceList"> <view class="flex justify-start items-center flex-wrap">
<!-- <el-checkbox :label="{code:0,name: '全国'}">全国</el-checkbox> --> <text @click="selectTexture(-1)" class="pointer mr-25"
<el-checkbox :checked="cindex == 0" v-for="(citem, cindex) in provinceData" :label="citem" :class="[checkTextureList.length === 0 ? 'text-main selected-cate' : '']">全部
:key="cindex">{{citem.name}}</el-checkbox> </text>
</el-checkbox-group> <view v-for="(item, index) in attributes" :key="index">
<text @click="selectTexture(item.value)" class="pointer mr-25"
:class="[checkTextureList.includes(item.value) ? 'text-main selected-cate' : '']"
v-if="index < 10 || showAllTexture">
{{ item.name }}
</text>
</view>
<text @click="showAllTexture = !showAllTexture" class="pointer mr-25" v-if="attributes.length > 10">查看更多
</text>
</view>
</el-form-item> </el-form-item>
<el-form-item label="已选"> <el-form-item label="供应商:" class="border-bottom pb-30">
<view class="flex justify-start items-center">
<text @click="selectCompany(-1)" class="pointer mr-25"
:class="[checkCompanyList.length === 0 ? 'text-main selected-cate' : '']">全部
</text>
<view v-for="(item, index) in companyList" :key="index">
<text @click="selectCompany(item._id)" class="pointer mr-25"
:class="[checkCompanyList.includes(item._id) ? 'text-main selected-cate' : '']"
v-if="index < 10 || showAllCompany">
{{ item.name }}
</text>
</view>
<text @click="showAllCompany = !showAllCompany" class="pointer mr-25" v-if="companyList.length > 10">查看更多
</text>
</view>
</el-form-item>
<el-form-item label="已选择">
<view class="tags"> <view class="tags">
<el-tag v-for="(item, index) in checkCategoryArr" :key="index">{{ item.name }}</el-tag> <el-tag v-for="(item, index) in checkCategoryArr" :key="index">{{ item.name }}</el-tag>
</view> </view>
@@ -63,7 +112,8 @@
<!-- 商品列表 --> <!-- 商品列表 -->
<view class="sheet-list"> <view class="sheet-list">
<vk-data-table ref="table1" :action="table1.action" :columns="table1.columns" :customRightBtns="table1.customRightBtns" <vk-data-table ref="table1" :action="table1.action" :columns="table1.columns"
:customRightBtns="table1.customRightBtns"
:pagination="true"></vk-data-table> :pagination="true"></vk-data-table>
</view> </view>
@@ -74,17 +124,22 @@
<script> <script>
import provinces from "@/uni_modules/vk-uview-ui/libs/address/provinces.json"; import provinces from "@/uni_modules/vk-uview-ui/libs/address/provinces.json";
provinces.unshift({
code: 9999,
name: '全国'
})
export default { export default {
data() { data() {
return { return {
allChildCate: [],
categoryTreeData: [], categoryTreeData: [],
companyList: [],
clickedCateIndex: -1,
showAllProvince: false,
showAllTexture: false,
showAllCompany: false,
provinceData: provinces, provinceData: provinces,
checkCategoryList: [], checkCategoryList: [],
checkProvinceList: [], checkTextureList: [],
checkCompanyList: [],
attributes: [],
keyword: '', keyword: '',
// 表格相关开始 ----------------------------------------------------------- // 表格相关开始 -----------------------------------------------------------
table1: { table1: {
@@ -126,7 +181,8 @@
type: "text", type: "text",
width: 280, width: 280,
formatter: (val, row, column, index) => { formatter: (val, row, column, index) => {
return val.map(item=>item.name).join("/") console.log(val)
return val.map(item => item.goodsName).join("/")
} }
}, },
{ {
@@ -193,19 +249,45 @@
vk.callFunction({ vk.callFunction({
url: 'client/spot/category/pub/getTree', url: 'client/spot/category/pub/getTree',
title: '请求中...', title: '请求中...',
data: { data: {},
},
success: (data) => { success: (data) => {
this.categoryTreeData = data.rows this.categoryTreeData = data.rows
for (var i = 0; i < data.rows.length; i++) { this.allChildCate = []
this.checkCategoryList.push([]) this.categoryTreeData.forEach(item => {
} item.children.forEach(child => {
this.allChildCate.push(child)
})
})
} }
}); });
this.getAttributes()
this.getCompany()
}, },
methods: { methods: {
selectCate(id) {
const index = this.checkCategoryList.indexOf(id)
if (index === -1) this.checkCategoryList.push(id)
else this.checkCategoryList.splice(index, 1)
this.search(1)
},
selectTexture(id) {
if (id === -1) this.checkTextureList = []
else {
const index = this.checkTextureList.indexOf(id)
if (index === -1) this.checkTextureList.push(id)
else this.checkTextureList.splice(index, 1)
}
this.search(1)
},
selectCompany(id) {
if (id === -1) this.checkCompanyList = []
else {
const index = this.checkCompanyList.indexOf(id)
if (index === -1) this.checkCompanyList.push(id)
else this.checkCompanyList.splice(index, 1)
}
this.search(1)
},
toMyEnquiry() { toMyEnquiry() {
vk.navigateTo({ vk.navigateTo({
url: '/pages/enquiry/my' url: '/pages/enquiry/my'
@@ -236,8 +318,6 @@
} }
}, },
search(pageIndex) { search(pageIndex) {
const categoryIds = [] const categoryIds = []
@@ -267,24 +347,53 @@
} }
}); });
}, },
getAttributes() {
vk.callFunction({
url: 'client/enquiry/attributes/pub/getList',
title: '请求中...',
data: {},
success: (data) => {
this.attributes = data.rows.find(attr => attr.label === '材质').options.map(item => {
item.name = item.label
return item
})
}
});
},
getCompany() {
vk.callFunction({
url: 'client/user/pub/getCompany',
title: '请求中...',
data: {},
success: (data) => {
this.companyList = data.rows.map(item => {
item.name = item.company.companyName
return item
})
}
});
},
}, },
computed: { computed: {
checkCategoryArr() { checkCategoryArr() {
let arr = [] const arr = []
this.allChildCate.forEach(item => {
this.checkCategoryList.forEach(item => { if (this.checkCategoryList.includes(item._id)) arr.push(item)
arr.push(...item)
}) })
this.attributes.forEach(item => {
this.checkProvinceList.forEach(item => { if (this.checkTextureList.includes(item.value)) {
arr.push({ arr.push(item)
...item }
}) })
this.companyList.forEach(item => {
if (this.checkCompanyList.includes(item._id)) {
arr.push(item)
}
}) })
return arr return arr
} }
} }
} }
</script> </script>
@@ -329,7 +438,6 @@
} }
.paginatio { .paginatio {
float: none; float: none;
width: 1200px; width: 1200px;
@@ -337,4 +445,26 @@
display: flex; display: flex;
justify-content: center; justify-content: center;
} }
.post-btn {
background: none;
}
.post-btn:hover {
background: #f6eae9;
color: #A92924;
}
.selected-cate {
border-bottom: 2px solid #BD3124;
line-height: 40rpx;
}
.child-cate {
background-color: #DB8382;
color: white;
margin-top: 10rpx;
border-radius: 15rpx;
padding: 0 20rpx;
}
</style> </style>
+12 -10
View File
@@ -41,13 +41,14 @@
form1: { form1: {
// 表单请求数据,此处可以设置默认值 // 表单请求数据,此处可以设置默认值
data: { data: {
radio: 1, // radio: 1,
checkbox : [1,2] // checkbox : [1,2]
sheetId: null
}, },
// 表单属性 // 表单属性
props: { props: {
// 表单请求地址 // 表单请求地址
action: "template/test/sys/test", action: "client/enquiry/quote/kh/addQuote",
// 表单字段显示规则 // 表单字段显示规则
columns: [ columns: [
{key: "totalPrice", title: "货款总价", type: "money"}, {key: "totalPrice", title: "货款总价", type: "money"},
@@ -72,8 +73,9 @@
}; };
}, },
onLoad(options = {}) { onLoad(options = {}) {
console.log(options)
const { const {
sheetId enquiryId
} = options } = options
if (!enquiryId) { if (!enquiryId) {
vk.navigateTo('/pages/process/sheet/list'); vk.navigateTo('/pages/process/sheet/list');
@@ -81,7 +83,7 @@
} }
this.enquiryId = enquiryId this.enquiryId = enquiryId
this.form1.data.sheetId = enquiryId
this.getEnquiryDetail() this.getEnquiryDetail()
}, },
computed: { computed: {
@@ -115,10 +117,10 @@
vk.callFunction({ vk.callFunction({
url: 'client/enquiry/quote/kh/addQuote', url: 'client/enquiry/quote/kh/addQuote',
title: '请求中...', title: '请求中...',
data: { // data: {
sheet: this.sheet, // sheet: this.sheet,
totalPrice: this.totalPrice // totalPrice: this.totalPrice
}, // },
success: (data) => { success: (data) => {
this.$message({ this.$message({
message: "报价成功", message: "报价成功",
@@ -129,7 +131,6 @@
}) })
}, },
/** /**
* 获取询价单详情 * 获取询价单详情
@@ -179,6 +180,7 @@
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
} }
.quote-form { .quote-form {
width: 260px; width: 260px;
} }
+589 -91
View File
@@ -21,54 +21,353 @@
<view class="title-sub">询价信息越完整,供应商报价越精准</view> <view class="title-sub">询价信息越完整,供应商报价越精准</view>
<view class="form-type-box"> <view class="form-type-box">
<view @click="form1.data.fillType = 0" :class="{active: form1.data.fillType == 0}" class="form-type-item">手动填写</view> <view @click="form1.data.fillType = 0" :class="{active: form1.data.fillType == 0}"
<view @click="form1.data.fillType = 1" :class="{active: form1.data.fillType == 1}" class="form-type-item">批量上传</view> class="form-type-item">手动填写
</view>
<view @click="form1.data.fillType = 1" :class="{active: form1.data.fillType == 1}"
class="form-type-item">批量上传
</view>
</view> </view>
</view> </view>
<!-- 手动填写 --> <!-- 手动填写 -->
<template v-if="form1.data.fillType == 0"> <template v-if="form1.data.fillType == 0">
<view class="form-title-wrap">
<view class="goods-info-title">
<view class="form-title">
商品信息
</view>
<text class="enquiry-no">询价单编号: {{ enquiryNo }}</text>
</view>
<view class="sales-code flex justify-end items-center">
<text>金九信业务员编号:</text>
<el-input v-model="salesCode" placeholder="请输入编号没有则留空" size="small"/>
</view>
</view>
<view class="p-20">
<view v-for="(item, index) in productList" :key="index"> <view v-for="(item, index) in productList" :key="index">
<enquiry-template :ref="'product' + index" v-model="productList[index]" :base-attributes="baseAttributes" :productIndex="index"></enquiry-template> <enquiry-template :ref="'product' + index" v-model="productList[index]"
:base-attributes="baseAttributes" :productIndex="index"/>
</view>
</view> </view>
</template> </template>
<!-- 批量上传 --> <!-- 批量上传 -->
<view v-if="form1.data.fillType == 0" class="btn-add-outer"> <view v-if="form1.data.fillType == 0" class="btn-add-outer">
<el-button @click="addProduct" type="primary" size="small">添加商品</el-button> <el-button @click="addProduct" type="primary" size="small" plain icon="el-icon-plus"
<el-button v-show="productList.length > 1" @click="removeProduct" type="warning" size="small">删除商品</el-button> class="empty-bg-plain-btn">添加商品
</el-button>
<el-button v-show="productList.length > 1" @click="removeProduct" type="warning" size="small">删除商品
</el-button>
</view>
<el-form ref="form1" :model="form1.data" label-width="80px">
<view class="form-title-wrap">
<view class="goods-info-title">
<view class="form-title">
采购商其他要求
</view>
</view> </view>
<vk-data-form ref="form1" v-model="form1.data" :action="form1.props.action" :columns="form1.props.columns"
:rules="form1.props.rules" :form-type="form1.props.formType" :loading.sync="form1.props.loading"
:before-action="form1.props.beforeAction" label-width="140px" cancel-text="保存草稿" submit-text="提交询价单"
@success="onFormSuccess" :footer-show="false">
<template v-slot:productCategoryIds="{ form, keyName }">
<el-form-item label="主要商品分类">
<el-tabs>
<el-tab-pane v-for="(item, index) in categoryTreeData" :label="item.name" :key="item._id">
<el-checkbox-group v-model="checkCategoryList[index]">
<el-checkbox v-for="(citem, cindex) in item.children" :label="citem"
:key="cindex">{{citem.name}}</el-checkbox>
</el-checkbox-group>
</el-tab-pane>
</el-tabs>
</el-form-item>
<el-form-item label="已选分类">
<view class="tags">
<el-tag v-for="(item, index) in checkCategoryArr" :key="index">{{item.name}}</el-tag>
</view> </view>
</el-form-item>
</template>
</vk-data-form> <view class="p-30">
<el-radio-group v-model="hasRequire" class="my-20">
<el-radio :label="true">有</el-radio>
<el-radio :label="false">无</el-radio>
</el-radio-group>
<view class="pos-r">
<el-input type="textarea" v-model="form1.data.remark" :disabled="!hasRequire"
placeholder="复杂加工提供图纸、简单加工详细说明加工内容,如:镀锌、刷漆、防腐、折弯、裁剪等"
:rows="15"/>
<view></view>
<view class="remark-upload">
<vk-data-upload v-model="form1.data.files">
<!-- <i class="el-icon-plus"/>-->
</vk-data-upload>
</view>
</view>
</view>
<view class="form-title-wrap">
<view class="goods-info-title">
<view class="form-title">
发票要求
</view>
</view>
</view>
<view class="p-30">
<view class="mb-20">
<el-radio-group v-model="form1.data.invoice">
<el-radio :label="true">含税</el-radio>
<el-radio :label="false">不含税</el-radio>
</el-radio-group>
</view>
<template v-if="form1.data.invoice">
<view class="mb-20 flex justify-start items-center">
<text>开票时间:</text>
<el-radio-group v-model="form1.data.writeInvoiceTime">
<el-radio :label="0">付款当月(限20号之前付款,20号之后付款次月开票)</el-radio>
<el-radio :label="1">付款后次月</el-radio>
<el-radio :label="2">付款前</el-radio>
</el-radio-group>
</view>
<view class="mb-20 flex justify-start items-center">
<text>发票种类:</text>
<el-radio-group v-model="form1.data.invoiceType">
<el-radio :label="0">增值税专用发票13%</el-radio>
<el-radio :label="1">增值税普通发票</el-radio>
<el-radio :label="2">普通发票</el-radio>
</el-radio-group>
<view class="ml-20 flex justify-start items-center">
<text class="label-width">其他要求:</text>
<el-input v-model="form1.data.invoiceOther" placeholder="请输入" size="small"/>
</view>
</view>
</template>
</view>
<view class="form-title-wrap">
<view class="goods-info-title">
<view class="form-title">
运输要求
</view>
</view>
</view>
<view class="p-30">
<view class="mb-20 flex justify-start items-center">
<text>随货资料:</text>
<el-checkbox-group v-model="form1.data.transportDocuments">
<el-checkbox label="合格证"/>
<el-checkbox label="检测报告"/>
<el-checkbox label="销售清单"/>
<el-checkbox label="磅重"/>
</el-checkbox-group>
</view>
<view class="mb-20 flex justify-start items-center">
<text class="label-width">其他要求:</text>
<el-input v-model="form1.data.otherTransportDocuments" placeholder="请输入"/>
</view>
<view class="mb-20 flex justify-start items-center">
<text>运输限制:</text>
<el-radio-group v-model="form1.data.transportLimit">
<el-radio :label="false">无</el-radio>
<el-radio :label="true">有</el-radio>
</el-radio-group>
</view>
</view>
<view class="form-title-wrap">
<view class="goods-info-title">
<view class="form-title">
交易模式
</view>
</view>
</view>
<view class="p-30">
<view class="mb-20 flex justify-start items-center">
<text>交易模式:</text>
<el-radio-group v-model="form1.data.tradeMethod">
<el-radio :label="0">自主交易</el-radio>
<el-radio :label="1">金久信公证</el-radio>
</el-radio-group>
</view>
</view>
<view class="form-title-wrap">
<view class="goods-info-title">
<view class="form-title">
交易说明
</view>
</view>
</view>
<view class="p-30">
<view class="mb-20 flex justify-start items-center">
<text>付款方式:</text>
<el-radio v-model="form1.data.payMethod" :label="0">预付</el-radio>
<view class="flex justify-start items-center">
<el-input v-model="form1.data.advancePayRate"
class="advance-pay-rate"/>
<text>%货到付全款</text>
</view>
<view class="mx-20">
<el-radio v-model="form1.data.payMethod" :label="1">货到验收后付款</el-radio>
</view>
<el-radio v-model="form1.data.payMethod" :label="2">提货付全款</el-radio>
<view class="mx-20 flex justify-start items-center">
<el-radio v-model="form1.data.payMethod" :label="3">信誉采购,货到签单后账期:</el-radio>
<el-input v-model="form1.data.reputationPayDay"
class="advance-pay-rate">
<template slot="suffix">天</template>
</el-input>
</view>
</view>
<view class="mb-20 flex justify-start items-center">
<el-radio v-model="form1.data.payMethod" :label="4">其他付款方式</el-radio>
<el-input v-model="form1.data.otherPayMethod"/>
</view>
<view class="mb-20 flex justify-start items-center">
<text>报价形式:</text>
<el-radio v-model="form1.data.offerType" :label="0">整单报价</el-radio>
<el-radio v-model="form1.data.offerType" :label="1">可分项报价</el-radio>
</view>
<view class="mb-20 flex justify-start items-center">
<text>报价时限:</text>
<view class="flex justify-start items-center">
<el-date-picker
v-model="form1.data.answerStartTime"
type="datetime"/>
<view class="mx-15">~</view>
<el-date-picker
v-model="form1.data.answerEndTime"
type="datetime"/>
</view>
</view>
</view>
<view class="form-title-wrap">
<view class="goods-info-title">
<view class="form-title">
交易说明
</view>
</view>
</view>
<view class="p-30">
<view class="mb-20 flex justify-start items-center">
<text style="width: 140px">交保证金要求:</text>
<el-input v-model="form1.data.earnestMoney" placeholder="请输入交保证金要求(如无要求则留空)"/>
</view>
</view>
<view class="form-title-wrap">
<view class="goods-info-title">
<view class="form-title">
简易合同备注和其他补充条款
</view>
</view>
</view>
<view class="p-30">
<view class="mb-20 flex justify-start items-center">
<el-radio v-model="form1.data.signMethod" :label="0">法大大</el-radio>
<el-radio v-model="form1.data.signMethod" :label="1">线下签约</el-radio>
</view>
<view v-if="form1.data.signMethod === 0">
<view class="flex justify-start items-start border">
<view class="m-10 sign-method-header">违约责任:</view>
<view class="border-left m-10 pl-20 flex-1">
1.
乙方所交产品品种、型号、规格、质量不符合规定的,如果甲方同意利用,应当按质论价;如果甲方不能利用的,应根据产品的具体情况,由乙方负责包换或包修,并承担修理、调换或退货而支付的实际费用;
2.乙方不予供货违约责任为甲方的实际损失+违约金,如乙方材料符合订货标准,甲方不能退货和不收货,甲方无条件应按实际本合同订货数量支付100%货款,并支付乙方因此产生的实际费用。带有甲乙双方单位相关收货人和发货人签字的本合同的发货清单事项和内容均视为本合同的补充合同,与本合同有相同的法律效力,双方应共同遵照执行。
</view>
</view>
<view class="flex justify-start items-start border">
<view class="m-10 sign-method-header">解决纠纷的方法:</view>
<view class="border-left m-10 pl-20 flex-1">
1、凡因本合同引起的或与本合同有关的任何争议,均可友好协商或仲裁解决,协商或仲裁不成的,双方协商同意在合同签订地人民法院管辖地起诉,违约一方或对合同争议承担主要责任的一方,应承担对方因仲裁和起诉而产生的全部律师代理费、鉴定(检验)费、诉讼保全费、诉讼保险费、公告费、差旅费、执行费、误工费和获取证据产生费用等其他相关费用。
2、双方本合同相关权利放弃均应有双方书面作出并加盖公章或授权委托人签字后生效。
</view>
</view>
<view class="flex justify-start items-start border">
<view class="m-10 sign-method-header">不可抗力:</view>
<view class="border-left m-10 pl-20 flex-1">
甲乙双方的任何一方由于不可抗力或突发公共事件的原因不能履行合同时,应及时向对方通报不能履行或不能完全履行的理由,以减轻可能给对方造成的损失,在取得有关机构证明以后,允许延期履行、部分履行或者不履行合同,并根据情况可部分或全部免予承担违约责任。
</view>
</view>
<view class="flex justify-start items-start border">
<view class="m-10 sign-method-header">其他:</view>
<view class="border-left m-10 pl-20 flex-1">
本合同的全部内容由双方平等共同协商一致,共同起草制定,非一方事先拟定,不属于格式条款。本合同自双方签字盖章后生效(包括电子签字、盖章),按本合同内容地址、联系方式寄送的一切文书、函件送达与否,均为视为送达有法律效力,通知途径和本合同内联系方式或地址送达文件双方均予以验证。
</view>
</view>
<view class="flex justify-start items-start border">
<view class="m-10 sign-method-header">采购方补充条款:</view>
<view class="border-left m-10 pl-20 flex-1">
供货方逾期供货承担采购方一切损失
</view>
</view>
</view>
</view>
<view class="form-title-wrap">
<view class="goods-info-title">
<view class="form-title">
采购商信息
</view>
</view>
</view>
<view class="p-30">
<view class="mb-20 flex justify-start items-center">
<text style="width: 140px">项目名称:</text>
<el-input v-model="form1.data.projectName" placeholder="请输入交保证金要求(如无要求则留空)"/>
</view>
<view class="mb-20 flex justify-start items-center">
<text style="width: 140px">项目地址:</text>
<el-row :gutter="10">
<el-col :span="5">
<el-select v-model="projectProvinceIndex" placeholder="省">
<el-option v-for="(item, index) in provinceData" :key="index" :value="index"
:label="item.name"/>
<!-- <span slot="prefix">省</span>-->
</el-select>
</el-col>
<el-col :span="5">
<el-select v-model="projectCityIndex" placeholder="市">
<template v-if="projectProvinceIndex !== null">
<el-option v-for="(item, index) in cityData[projectProvinceIndex]" :key="index"
:value="index"
:label="item.name"/>
</template>
<!-- <span slot="prefix">市</span>-->
</el-select>
</el-col>
<el-col :span="5">
<el-select v-model="projectAreaIndex" placeholder="区/县">
<template v-if="projectProvinceIndex !== null && projectCityIndex !== null">
<el-option
v-for="(item, index) in areaData[projectProvinceIndex][projectCityIndex]"
:key="index" :value="index"
:label="item.name"/>
</template>
<!-- <span slot="prefix">区/县</span>-->
</el-select>
</el-col>
<el-col :span="8">
<el-input v-model="form1.data.projectAddress"
placeholder="详细地址或几公里范围内"></el-input>
</el-col>
</el-row>
</view>
<el-row :gutter="10" class="mb-20">
<el-col :span="12" class="flex justify-start items-center">
<text style="width: 160px">公司信息:</text>
<el-input v-model="company.companyName" placeholder="" disabled/>
</el-col>
<el-col :span="12" class="flex justify-start items-center">
<text style="width: 160px">公司联系方式:</text>
<el-input v-model="company.legalMobile" disabled/>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="12" class="flex justify-start items-center">
<text style="width: 160px">授权业务咨询人:</text>
<el-input placeholder=""/>
</el-col>
<el-col :span="12" class="flex justify-start items-center">
<text style="width: 160px">业务咨询联系方式:</text>
<el-input placeholder=""/>
</el-col>
</el-row>
</view>
</el-form>
<view class="form-footer"> <view class="form-footer">
<el-button type="" @click="draft">保存草稿</el-button> <el-button type="" @click="draft">保存草稿</el-button>
<el-button type="primary" @click="submit">提交询价单</el-button> <el-button type="primary" @click="submit">提交询价单</el-button>
</view> </view>
<!-- <el-divider content-position="left">其他设置</el-divider> --> <!-- <el-divider content-position="left">其他设置</el-divider> -->
</view> </view>
<Gap/>
<common-footer></common-footer> <common-footer></common-footer>
</view> </view>
@@ -77,15 +376,32 @@
<script> <script>
import {reject} from 'lodash'; import {reject} from 'lodash';
import EnquiryTemplate from './components/template.vue' import EnquiryTemplate from './components/template.vue'
import dayjs from "dayjs";
import Gap from "../../components/gap/gap.vue";
import provinces from "@/uni_modules/vk-uview-ui/libs/address/provinces.json";
import citys from "@/uni_modules/vk-uview-ui/libs/address/citys.json";
import areas from "@/uni_modules/vk-uview-ui/libs/address/areas.json";
export default { export default {
components: {EnquiryTemplate}, components: {Gap, EnquiryTemplate},
data() { data() {
return { return {
provinceData: provinces,
cityData: citys,
areaData: areas,
company: {
companyName: '',
legalMobile: '',
},
enquiryNo: '',
// 表单相关开始----------------------------------------------------------- // 表单相关开始-----------------------------------------------------------
productList: [{}], productList: [{}],
baseAttributes: [], baseAttributes: [],
categoryTreeData: [], categoryTreeData: [],
checkCategoryList: [], checkCategoryList: [],
projectProvinceIndex: null,
projectCityIndex: null,
projectAreaIndex: null,
form1: { form1: {
// 表单请求数据,此处可以设置默认值 // 表单请求数据,此处可以设置默认值
data: { data: {
@@ -93,14 +409,28 @@ import EnquiryTemplate from './components/template.vue'
// extraAttributes: {}, // extraAttributes: {},
// attributes: {}, // attributes: {},
invoice: false, invoice: false,
breachLiability: `1. 乙方所交产品品种、型号、规格、质量不符合规定的,如果甲方同意利用,应当按质论价;如果甲方不能利用的,应根据产品的具体情况,由乙方负责包换或包修,并承担修理、调换或退货而支付的实际费用; invoiceType: 0,
2.乙方不予供货违约责任为甲方的实际损失+违约金,如乙方材料符合订货标准,甲方不能退货和不收货,甲方无条件应按实际本合同订货数量支付100%货款,并支付乙方因此产生的实际费用。带有甲乙双方单位相关收货人和发货人签字的本合同的发货清单事项和内容均视为本合同的补充合同,与本合同有相同的法律效力,双方应共同遵照执行。`, invoiceOther: '',
solveDispute: `1、凡因本合同引起的或与本合同有关的任何争议,均可友好协商或仲裁解决,协商或仲裁不成的,双方协商同意在合同签订地人民法院管辖地起诉,违约一方或对合同争议承担主要责任的一方,应承担对方因仲裁和起诉而产生的全部律师代理费、鉴定(检验)费、诉讼保全费、诉讼保险费、公告费、差旅费、执行费、误工费和获取证据产生费用等其他相关费用。 writeInvoiceTime: 0,
2、双方本合同相关权利放弃均应有双方书面作出并加盖公章或授权委托人签字后生效。`, transportDocuments: [],
forceMajeure: `甲乙双方的任何一方由于不可抗力或突发公共事件的原因不能履行合同时,应及时向对方通报不能履行或不能完全履行的理由,以减轻可能给对方造成的损失,在取得有关机构证明以后,允许延期履行、部分履行或者不履行合同,并根据情况可部分或全部免予承担违约责任。`, files: [],
contracOther: `本合同的全部内容由双方平等共同协商一致,共同起草制定,非一方事先拟定,不属于格式条款。本合同自双方签字盖章后生效(包括电子签字、盖章),按本合同内容地址、联系方式寄送的一切文书、函件送达与否,均为视为送达有法律效力,通知途径和本合同内联系方式或地址送达文件双方均予以验证。`, otherTransportDocuments: '',
buyerSupplement: '供货方逾期供货承担采购方一切损失', transportLimit: false,
tradeMethod: 0,
payMethod: 0,
advancePayRate: null,
reputationPayDay: null,
otherPayMethod: '',
offerType: 0,
answerStartTime: '',
answerEndTime: '',
earnestMoney: '',
signMethod: 0, signMethod: 0,
projectName: '',
province: '',
city: '',
area: '',
projectAddress: '',
}, },
// 表单属性 // 表单属性
props: { props: {
@@ -115,23 +445,29 @@ import EnquiryTemplate from './components/template.vue'
{key: "remark", title: "其他要求", type: "textarea",}, {key: "remark", title: "其他要求", type: "textarea",},
{key: "", title: "发票要求", type: "bar-title"}, {key: "", title: "发票要求", type: "bar-title"},
{key: "invoice", title: "发票要求", type: "radio", {
key: "invoice", title: "发票要求", type: "radio",
data: [ data: [
{value: true, label: "含税"}, {value: true, label: "含税"},
{value: false, label: "不含税"} {value: false, label: "不含税"}
], ],
}, },
{key: "writeInvoiceTime", {
key: "writeInvoiceTime",
title: "开票时间", title: "开票时间",
type: "radio", type: "radio",
data: [ data: [
{ value: '付款当月(限20号之前付款,20号之后付款次月开票)', label: "付款当月(限20号之前付款,20号之后付款次月开票)" }, {
value: '付款当月(限20号之前付款,20号之后付款次月开票)',
label: "付款当月(限20号之前付款,20号之后付款次月开票)"
},
{value: '付款后次月', label: "付款后次月"}, {value: '付款后次月', label: "付款后次月"},
{value: '付款前', label: "付款前"}, {value: '付款前', label: "付款前"},
], ],
showRule: 'invoice==true' showRule: 'invoice==true'
}, },
{key: "nvoiceType", {
key: "nvoiceType",
title: "发票种类", title: "发票种类",
type: "radio", type: "radio",
data: [ data: [
@@ -142,7 +478,8 @@ import EnquiryTemplate from './components/template.vue'
showRule: 'invoice == true' showRule: 'invoice == true'
}, },
{key: "", title: "运输要求", type: "bar-title"}, {key: "", title: "运输要求", type: "bar-title"},
{key: "transportDocuments", {
key: "transportDocuments",
title: "随货资料", title: "随货资料",
type: "checkbox", type: "checkbox",
data: [ data: [
@@ -153,12 +490,14 @@ import EnquiryTemplate from './components/template.vue'
], ],
}, },
{key: "otherTransportDocuments", title: "其他资料", type: "text"}, {key: "otherTransportDocuments", title: "其他资料", type: "text"},
{key: "transportLimit", {
key: "transportLimit",
title: "运输限制", title: "运输限制",
type: "text", type: "text",
}, },
{key: "", title: "交易说明", type: "bar-title", component: 'custom-form-section'}, {key: "", title: "交易说明", type: "bar-title", component: 'custom-form-section'},
{key: "tradeMethod", {
key: "tradeMethod",
title: "交易模式", title: "交易模式",
type: "radio", type: "radio",
data: [ data: [
@@ -182,29 +521,79 @@ import EnquiryTemplate from './components/template.vue'
{ {
key: "", title: "", type: 'group', showLabel: false, justify: "start", columns: [ key: "", title: "", type: 'group', showLabel: false, justify: "start", columns: [
{key: "advancePayRate", title: "预付百分比", type: "percentage",showRule: "payMethod==1"}, {
key: "advancePayRate",
title: "预付百分比",
type: "percentage",
showRule: "payMethod==1"
},
{key: "otherPayMethod", title: "其他付款方式", type: "text", showRule: "payMethod==5"}, {key: "otherPayMethod", title: "其他付款方式", type: "text", showRule: "payMethod==5"},
{key: "reputationPayDay", title: "货到签单后账期天数", type: "number",showRule: "payMethod==4",rightText: '天'}, {
key: "reputationPayDay",
title: "货到签单后账期天数",
type: "number",
showRule: "payMethod==4",
rightText: '天'
},
] ]
}, },
{key: "answerTime", title: "报价时限", type: "date", dateType: "datetime"}, {key: "answerTime", title: "报价时限", type: "date", dateType: "datetime"},
{key: "earnestMoney", title: "保证金要求", type: "text"}, {key: "earnestMoney", title: "保证金要求", type: "text"},
{key: "", title: "合同要求", type: "bar-title"}, {key: "", title: "合同要求", type: "bar-title"},
{key: 'signMethod', title: '签约方式', type: 'radio', data: [ {
key: 'signMethod', title: '签约方式', type: 'radio', data: [
{value: 0, label: "法大大"}, {value: 0, label: "法大大"},
{value: 1, label: "线下签约"}, {value: 1, label: "线下签约"},
]}, ]
{key: 'contractType', title: '合同选择', type: 'radio',showRule: 'signMethod==0', data: [ },
{
key: 'contractType', title: '合同选择', type: 'radio', showRule: 'signMethod==0', data: [
{value: 0, label: "标准合同模板"}, {value: 0, label: "标准合同模板"},
{value: 1, label: "自定义合同"}, {value: 1, label: "自定义合同"},
]}, ]
{key: "breachLiability", title: "违约责任", type: "textarea", readonly: true, showRule: 'signMethod==0&&contractType==0'}, },
{key: "solveDispute", title: "解决纠纷的方法", type: "textarea", readonly: true, showRule: 'signMethod==0&&contractType==0'}, {
{key: "forceMajeure", title: "不可抗力", type: "textarea", readonly: true, showRule: 'signMethod==0&&contractType==0'}, key: "breachLiability",
{key: "contracOther", title: "其他", type: "textarea", readonly: true, showRule: 'signMethod==0&&contractType==0'}, title: "违约责任",
{key: "buyerSupplement", title: "采购方补充条款", type: "textarea", readonly: true, showRule: 'signMethod==0&&contractType==0'}, type: "textarea",
{key: "sellerSupplement", title: "供应方补充条款", type: "textarea", showRule: 'signMethod==0&&contractType==0'}, readonly: true,
showRule: 'signMethod==0&&contractType==0'
},
{
key: "solveDispute",
title: "解决纠纷的方法",
type: "textarea",
readonly: true,
showRule: 'signMethod==0&&contractType==0'
},
{
key: "forceMajeure",
title: "不可抗力",
type: "textarea",
readonly: true,
showRule: 'signMethod==0&&contractType==0'
},
{
key: "contracOther",
title: "其他",
type: "textarea",
readonly: true,
showRule: 'signMethod==0&&contractType==0'
},
{
key: "buyerSupplement",
title: "采购方补充条款",
type: "textarea",
readonly: true,
showRule: 'signMethod==0&&contractType==0'
},
{
key: "sellerSupplement",
title: "供应方补充条款",
type: "textarea",
showRule: 'signMethod==0&&contractType==0'
},
// {key: "", title: "采购商信息", type: "bar-title"}, // {key: "", title: "采购商信息", type: "bar-title"},
{ {
key: "files", key: "files",
@@ -267,17 +656,19 @@ import EnquiryTemplate from './components/template.vue'
loading: false, loading: false,
// 是否显示表单1 的弹窗 // 是否显示表单1 的弹窗
show: false, show: false,
beforeAction: (formData)=> { // beforeAction: (formData) => {
//
// console.log('formData: ',JSON.parse(JSON.stringify(formData))); // // console.log('formData: ',JSON.parse(JSON.stringify(formData)));
// console.log('product: ',JSON.parse(JSON.stringify(this.productList))); // // console.log('product: ',JSON.parse(JSON.stringify(this.productList)));
formData.productList = JSON.parse(JSON.stringify(this.productList)) // formData.productList = JSON.parse(JSON.stringify(this.productList))
formData.productCategoryList = this.checkCategoryArr // formData.productCategoryList = this.checkCategoryArr
return formData // return formData
} // },
} },
}, },
// 表单相关结束----------------------------------------------------------- // 表单相关结束-----------------------------------------------------------
salesCode: '',
hasRequire: false
}; };
}, },
computed: { computed: {
@@ -292,13 +683,15 @@ import EnquiryTemplate from './components/template.vue'
}, },
onLoad() { onLoad() {
this.enquiryNo = dayjs().format('YYYYMMDD') + (Math.ceil(Math.random() * 10000)).toString()
const company = vk.getVuex('$user.userInfo.company')
this.company.companyName = company?.companyName
this.company.legalMobile = company?.legalMobile
this.getAttributes() this.getAttributes()
vk.callFunction({ vk.callFunction({
url: 'client/spot/category/pub/getTree', url: 'client/spot/category/pub/getTree',
title: '请求中...', title: '请求中...',
data: { data: {},
},
success: (data) => { success: (data) => {
this.categoryTreeData = data.rows this.categoryTreeData = data.rows
for (var i = 0; i < data.rows.length; i++) { for (var i = 0; i < data.rows.length; i++) {
@@ -343,34 +736,56 @@ import EnquiryTemplate from './components/template.vue'
}, },
async submitAll() { async submitAll() {
// 手动填写表单校验 // 手动填写表单校验
if(this.form1.data.fillType == 0) { // if (this.form1.data.fillType == 0) {
const verifyTasks = [] // const verifyTasks = []
for (var i = 0; i < this.productList.length; i++) { // for (var i = 0; i < this.productList.length; i++) {
const valid = new Promise((resolve, reject) => { // const valid = new Promise((resolve, reject) => {
console.log(this.$refs['product' + i]); // console.log(this.$refs['product' + i]);
console.log(this.$refs['product' + i][0].$refs); // console.log(this.$refs['product' + i][0].$refs);
this.$refs['product' + i][0].$refs.form1.validate((valid) => { // this.$refs['product' + i][0].$refs.form1.validate((valid) => {
if(valid) { // if (valid) {
resolve(valid) // resolve(valid)
}else { // } else {
reject() // reject()
// }
// })
// })
// verifyTasks.push(valid)
// }
//
// await Promise.all(verifyTasks)
// }
this.form1.data.productList = this.productList
if (this.projectProvinceIndex !== null) {
this.form1.data.province = this.provinceData[this.projectProvinceIndex]
if (this.projectCityIndex !== null) {
this.form1.data.city = this.cityData[this.projectProvinceIndex]
if (this.projectAreaIndex !== null) {
this.form1.data.area = this.areaData[this.projectProvinceIndex][this.projectCityIndex]
}
}
}
// this.$refs.form1.submitForm()
vk.callFunction({
url: 'client/enquiry/sheet/kh/add',
data: this.form1.data,
title: '请求中...',
success: (data) => {
this.$message({
message: "提交成功",
type: 'success'
})
vk.navigateBack()
} }
}) })
})
verifyTasks.push(valid)
}
await Promise.all(verifyTasks)
}
this.$refs.form1.submitForm()
} }
} }
} }
</script> </script>
<style lang="scss"> <style lang="scss" scoped>
@import "@/common/css/app.scss";
.form-type-box { .form-type-box {
position: absolute; position: absolute;
@@ -382,6 +797,7 @@ import EnquiryTemplate from './components/template.vue'
bottom: 0; bottom: 0;
margin: auto; margin: auto;
} }
.form-type-item { .form-type-item {
width: 120px; width: 120px;
height: 35px; height: 35px;
@@ -392,22 +808,26 @@ import EnquiryTemplate from './components/template.vue'
color: rgba(0, 0, 0, 1); color: rgba(0, 0, 0, 1);
cursor: pointer; cursor: pointer;
} }
.form-type-item.active { .form-type-item.active {
background-color: #A92924; background-color: #A92924;
color: #FFFFFF; color: #FFFFFF;
} }
.form-view { .form-view {
width: 1200px; width: 1200px;
margin: 0 auto; margin: 0 auto;
background-color: #FFFFFF; background-color: #FFFFFF;
padding: 20rpx; padding: 20rpx;
border-radius: 20px;
} }
.m-20 { .m-20 {
margin: 20px; margin: 20px;
position: relative; position: relative;
} }
.title-main { .title-main {
font-size: 18px; font-size: 18px;
font-weight: bold; font-weight: bold;
@@ -420,16 +840,28 @@ import EnquiryTemplate from './components/template.vue'
} }
.btn-add-outer { .btn-add-outer {
padding-left: 140px; margin: 0 0 20px 30px;
margin: 0 0 20px 0;
} }
.form-footer { .form-footer {
height: 40px; height: 40px;
line-height: 40px; line-height: 40px;
background: #fff; background: #fff;
padding-top: 0; padding-top: 0;
text-align: center; text-align: center;
display: block; width: 50%;
display: flex;
align-items: center;
justify-content: center;
margin: auto;
* {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
margin: 0 40px;
}
} }
.tags { .tags {
@@ -440,4 +872,70 @@ import EnquiryTemplate from './components/template.vue'
margin-right: 10px; margin-right: 10px;
} }
} }
.form-title-wrap {
display: flex;
align-items: center;
justify-content: space-between;
.goods-info-title {
display: flex;
align-items: center;
justify-content: flex-start;
}
.form-title {
padding-left: 10px;
color: $--color-primary;
font-size: 18px;
line-height: 18px;
border-left: 4px solid $--color-primary;
}
.enquiry-no {
margin-left: 10px;
font-size: 14px;
}
}
.sales-code {
text {
width: 400rpx;
}
}
.remark-upload {
position: absolute;
left: 0;
bottom: 0;
//border: 1px solid #ddd;
display: flex;
align-items: center;
justify-content: center;
padding: 5px;
i {
color: #ddd;
font-size: 18px;
}
}
.label-width {
width: 100px;
}
.advance-pay-rate {
width: 100px;
}
.sign-method-header {
width: 120px;
}
</style>
<style>
.vk-data-upload .el-upload--picture-card {
width: 40px !important;
height: 40px !important;
}
</style> </style>
+41 -22
View File
@@ -77,8 +77,10 @@
<!-- <span>{{item.}}</span><span>{{}}支</span> --> <!-- <span>{{item.}}</span><span>{{}}支</span> -->
</div> </div>
<div class="detail-num"> <div class="detail-num">
<span v-if="item.user.accountType == 1" class="company">{{item.user.person.personName}}</span> <span v-if="item.user.accountType === 1"
<span v-if="item.user.accountType == 2" class="company">{{item.user.company.companyName}}</span> class="company">{{ item.user.person.personName }}</span>
<span v-if="item.user.accountType === 2"
class="company">{{ item.user.company.companyName }}</span>
<span class="time">{{ item._add_time_str }}</span> <span class="time">{{ item._add_time_str }}</span>
</div> </div>
</div> </div>
@@ -95,7 +97,7 @@
<view class="" style="height: 40px;"></view> <view class="" style="height: 40px;"></view>
<view class="spot-outer"> <view class="spot-outer">
<el-divider> <el-divider>
<view class="divider-text">现货市场</view> <view class="spot-divider-text">现货市场</view>
</el-divider> </el-divider>
<view class="" style="height: 40px;"></view> <view class="" style="height: 40px;"></view>
<view class="goods-list"> <view class="goods-list">
@@ -106,11 +108,13 @@
<view class="goods-image"> <view class="goods-image">
<image :src="item.user.businessCard.logo" mode="aspectFit"></image> <image :src="item.user.businessCard.logo" mode="aspectFit"></image>
</view> </view>
<view v-if="item.user.accountType == 1" class="goods-company">{{item.user.person.personName}}</view> <view v-if="item.user.accountType === 1" class="goods-company">{{ item.user.person.personName }}
<view v-if="item.user.accountType == 2" class="goods-company">{{item.user.company.companyName}}
</view> </view>
<el-button @click="vk.navigateTo('/pages/spot/goods/detail?id=' + item._id);" type="primary" plain <view v-if="item.user.accountType === 2" class="goods-company">{{ item.user.company.companyName }}
round size="small">立即查看</el-button> </view>
<el-button class="empty-bg-plain-btn" @click="vk.navigateTo('/pages/spot/goods/detail?id=' + item._id);"
type="primary" plain size="small">立即查看
</el-button>
</view> </view>
</view> </view>
<view class="text-center"> <view class="text-center">
@@ -118,13 +122,14 @@
</view> </view>
</view> </view>
<!-- 现货市场 end --> <!-- 现货市场 end -->
<gap height="100"/>
<common-footer></common-footer> <common-footer></common-footer>
</view> </view>
</template> </template>
<script> <script>
var vk = uni.vk; var vk = uni.vk;
export default { export default {
data() { data() {
@@ -133,13 +138,9 @@
// init请求返回的数据 // init请求返回的数据
spotGoodsData: [], spotGoodsData: [],
enquirySheetData: [], enquirySheetData: [],
data: { data: {},
},
// 表单请求数据 // 表单请求数据
form1: { form1: {},
},
scrollTop: 0, scrollTop: 0,
} }
}, },
@@ -216,17 +217,14 @@
} }
}, },
// 监听器 // 监听器
watch: { watch: {},
},
// 计算属性 // 计算属性
computed: { computed: {}
}
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.banner-outer {} .banner-outer {
}
.carousel-img { .carousel-img {
width: 760px; width: 760px;
@@ -250,6 +248,14 @@
font-weight: bold; font-weight: bold;
} }
.spot-divider-text {
color: #393735;
font-size: 28px;
font-weight: bold;
padding: 0 20px;
background-color: white;
}
.enquiry-outer { .enquiry-outer {
width: 1200px; width: 1200px;
margin: 0px auto; margin: 0px auto;
@@ -263,7 +269,10 @@
.spot-outer { .spot-outer {
width: 1200px; width: 1200px;
margin: 0px auto; margin: 0px auto;
background-color: white;
padding: 50px;
} }
.goods-list { .goods-list {
display: flex; display: flex;
@@ -272,12 +281,13 @@
.goods { .goods {
width: 217px; width: 217px;
height: 280px; //height: 280px;
background-color: #FFFFFF; background-color: #FFFFFF;
box-shadow: 0px 2px 6px 0px rgba(0, 0, 0, 0.05); box-shadow: 0px 2px 6px 0px rgba(0, 0, 0, 0.05);
text-align: center; text-align: center;
margin-right: 20px; margin-right: 20px;
margin-bottom: 25px; margin-bottom: 25px;
padding: 10px 20px;
&-title { &-title {
font-size: 15px; font-size: 15px;
@@ -327,5 +337,14 @@
margin: 0 auto; margin: 0 auto;
cursor: pointer; cursor: pointer;
} }
.goods-image {
width: 100%;
}
.goods-address {
color: gray;
}
} }
</style> </style>
+309 -2
View File
@@ -3,20 +3,327 @@
<top-bar></top-bar> <top-bar></top-bar>
<common-header></common-header> <common-header></common-header>
<category-bar></category-bar> <category-bar></category-bar>
<view class="page-main" v-if="info">
<view class="flex justify-between items-center">
<text class="text-gray">加工询价单编号:{{ info.orderNo }}</text>
<text class="text-gray">发布时间:{{ info._add_time_str }}</text>
</view>
<view class="my-25 flex justify-between items-center">
<view class="flex justify-start items-center">
<text class="text-40 font-bold">{{ info.title }}</text>
<view class="ml-20 flex justify-start items-center">
<building-one theme="outline" size="24" fill="#a92924" strokeLinecap="square"/>
<view class="text-main ">
<text class="mx-20">{{ info.quoteList.rows.length }}</text>
<text>家已报价</text>
</view>
</view>
</view>
<view class="flex justify-end items-end"
v-if="info.answerEndTime && dayjs().diff(dayjs(info.answerEndTime), 'second') > 0">
<text>距离加工结束还有:</text>
<view class="border-main countdown text-main">{{
dayjs().diff(dayjs(info.answerEndTime), 'day')
}}
</view>
<text>天</text>
<view class="border-main countdown text-main">
{{ (dayjs().diff(dayjs(info.answerEndTime), 'hour')) % 24 }}
</view>
<text>时</text>
</view>
</view>
<view class="my-25 flex justify-between items-center pb-20 border-bottom">
<view class="flex justify-start items-center">
<id-card theme="outline" size="24" fill="#a92924" strokeLinecap="square"/>
<text class="ml-15 text-gray">
{{ info.user.accountType === 1 ? info.user.person.personName : info.user.company.companyName }}
</text>
</view>
<el-button type="primary" @click.native="toQuote"
v-if="vk.getVuex('$user.userInfo._id') !== info.userId">我要申请加工
</el-button>
<el-button type="primary" @click.native="showDialog = true"
v-else>查看收到的申请加工
</el-button>
</view>
<view class="item-wrap">
<view class="form-title-wrap">
<view class="goods-info-title">
<view class="form-title">
上传的附件
</view>
</view>
</view>
</view>
<view class="item-wrap">
<view class="form-title-wrap">
<view class="goods-info-title">
<view class="form-title">
加工商其他要求
</view>
</view>
</view>
<view class="mt-15">{{ info.remark }}</view>
</view>
<view class="item-wrap">
<view class="form-title-wrap">
<view class="goods-info-title">
<view class="form-title">
纳税和税票
</view>
</view>
</view>
<view class="mt-15">是否含税:{{ info.invoice ? '含税' : '不含税' }}</view>
<view class="mt-15">开票时间:{{ WRITE_INVOICE_TIME[info.writeInvoiceTime] }}</view>
<view class="mt-15">发票种类:{{ INVOICE_TYPE[info.invoiceType] }}</view>
<view class="mt-15">其他要求:{{ info.invoiceOther }}</view>
</view>
<view class="item-wrap">
<view class="form-title-wrap">
<view class="goods-info-title">
<view class="form-title">
运输要求
</view>
</view>
</view>
<view class="mt-15">随货资料:{{ info.transportDocuments.join() }}</view>
<view class="mt-15">其他要求:{{ info.otherTransportDocuments }}</view>
<view class="mt-15">运输限制要求:{{ info.transportLimit ? '有' : '无' }}</view>
</view>
<view class="item-wrap">
<view class="form-title-wrap">
<view class="goods-info-title">
<view class="form-title">
交易说明
</view>
</view>
</view>
<view class="mt-15">付款方式:{{ PROCESS_PAY_METHOD[info.payMethod] }}</view>
<view class="mt-15">报价形式:{{ info.offerType === 0 ? '整单报价' : '可分项报价' }}</view>
<view class="mt-15">报价期限:
<text v-if="info.answerStartTime && info.answerEndTime">{{
dayjs(info.answerStartTime).format('YYYY-MM-DD')
}}~{{ dayjs(info.answerEndTime).format('YYYY-MM-DD') }}
</text>
</view>
</view>
<view class="item-wrap">
<view class="form-title-wrap">
<view class="goods-info-title">
<view class="form-title">
简易合同备注和其他补充条款
</view>
</view>
</view>
<view class="mt-15">违约责任:</view>
<view class="mt-15">
1.乙方所交产品品种、型号、规格、质量不符合规定的,如果甲方同意利用,应当按质论价;如果甲方不能利用的,应根据产品的具体情况,由乙方负责包换或包修,并承担修理、调换或退货而支付的实际费用;2.乙方不予供货违约责任为甲方的实际损失+违约金,如乙方材料符合订货标准,甲方不能退货和不收货,甲方无条件应按实际本合同订货数量支付100%货款,并支付乙方因此产生的实际费用。带有甲乙双方单位相关收货人和发货人签字的本合同的发货清单事项和内容均视为本合同的补充合同,与本合同有相同的法律效力,双方应共同遵照执行。
</view>
<view class="mt-15">解决纠纷的方法:</view>
<view class="mt-15">
1、凡因本合同引起的或与本合同有关的任何争议,均可友好协商或仲裁解决,协商或仲裁不成的,双方协商同意在合同签订地人民法院管辖地起诉,违约一方或对合同争议承担主要责任的一方,应承担对方因仲裁和起诉而产生的全部律师代理费、鉴定(检验)费、诉讼保全费、诉讼保险费、公告费、差旅费、执行费、误工費和获取证据产生费用等其他相关费用。2、双方本合同相关权利放弃均应有双方书面作出并加盖公章或授权委托人签字后生效。
</view>
<view class="mt-15">不可抗力:</view>
<view class="mt-15">
甲乙双方的任何一方由于不可抗力或突发公共事件的原因不能履行合同时,应及时向对方通报不能履行或不能完全履行的理由,以减轻可能给对方造成的损失,在取得有关机构证明以后,允许延期履行、部分履行或者不履行合同,并根据情况可部分或全部免予承担违约责任。
</view>
<view class="mt-15">其他:</view>
<view class="mt-15">
本合同的全部内容由双方平等共同协商一致,共同起草制定,非一方事先拟定,不属于格式条款。本合同自双方签字盖章后生效(包括电子签字、盖章),按本合同内容地址、联系方式寄送的一切文书、函件送达与否,均为视为送达有法律效力,通知途径和本合同内联系方式或地址送达文件双方均予以验证。
</view>
<view class="mt-15">采购方补充条款: 供货方逾期供货承担采购方一切损失</view>
<view class="mt-15"> 供应方补充条款:</view>
</view>
<view class="item-wrap">
<view class="form-title-wrap">
<view class="goods-info-title">
<view class="form-title">
已收到的加工申请
</view>
</view>
</view>
<view class="mt-15">
<view class="request-header">
<text class="flex-1">加工商</text>
<text class="flex-1">申请时间</text>
</view>
<view class="quote" v-for="(item, index) in info.quoteList.rows" :key="index">
<text class="flex-1">{{
item.user.accountType === 1 ? item.user.person.personName : item.user.company.companyName
}}
</text>
<text class="flex-1">{{ item._add_time_str }}</text>
</view>
</view>
</view>
</view>
<common-footer></common-footer> <common-footer></common-footer>
<el-dialog :visible.sync="showDialog" width="70%" :show-close="false">
<view slot="title" class="text-main text-40 m-30 flex justify-between items-center">
<text>收到的加工申请</text>
<el-button type="primary" @click.native="showDialog = false">关闭</el-button>
</view>
<view class="mt-15">
<view class="request-header">
<text class="flex-1">加工商</text>
<text class="flex-1">报价</text>
<text class="flex-1">申请时间</text>
<text class="flex-1">操作</text>
</view>
<view class="quote" v-for="(item, index) in info.quoteList.rows" :key="index">
<text class="flex-1">{{
item.user.accountType === 1 ? item.user.person.personName : item.user.company.companyName
}}
</text>
<text class="flex-1">{{ item.totalPrice }}元</text>
<text class="flex-1">{{ item._add_time_str }}</text>
<text class="flex-1">
<el-button type="primary" @click.native="createContract(item)">选择</el-button>
</text>
</view>
</view>
</el-dialog>
</view> </view>
</template> </template>
<script> <script>
import {BuildingOne, IdCard} from '@icon-park/vue'
import dayjs from "dayjs";
import {WRITE_INVOICE_TIME, INVOICE_TYPE, PROCESS_PAY_METHOD} from '@/util'
export default { export default {
components: {BuildingOne, IdCard},
data() { data() {
return { return {
WRITE_INVOICE_TIME,
INVOICE_TYPE,
PROCESS_PAY_METHOD,
id: null,
info: null,
showDialog: false
}; };
},
methods: {
dayjs,
getInfo() {
vk.callFunction({
url: 'client/process/sheet/pub/getInfo',
data: {
id: this.id
}
}).then((res) => {
this.info = res
})
},
toQuote() {
vk.navigateTo(`/pages/process/quote?sheetId=${this.id}`)
},
createContract({totalPrice, uid}) {
vk.callFunction({
url: 'client/contract/kh/add',
data: {
type: 'process',
productTitle: this.info.title,
transactionId: vk.pubfn.createOrderNo("P", 20),
quoteId: this.id,
buyer: vk.getVuex('$user.userInfo._id'),
seller: uid,
amount: totalPrice,
partyCount: 2,
signCount: 0,
}
}).then((res) => {
this.$message({
message: '选择成功',
type: 'success'
})
setTimeout(() => {
vk.navigateTo('/pages/contract/index')
}, 1500)
})
}
},
onLoad(option) {
if (!option.id) vk.navigateBack()
this.id = option.id
this.getInfo()
} }
} }
</script> </script>
<style lang="scss"> <style lang="scss" scoped>
@import "@/common/css/app.scss";
.page-main {
width: 1200px;
margin: 20px auto;
background-color: #FFFFFF;
padding: 20px;
border-radius: 5px;
}
.countdown {
padding: 2px 5px;
margin: 0 5px;
}
.item-wrap {
margin: 24px 0;
.form-title-wrap {
display: flex;
align-items: center;
justify-content: space-between;
.goods-info-title {
display: flex;
align-items: center;
justify-content: flex-start;
}
.form-title {
padding-left: 10px;
color: $--color-primary;
font-size: 18px;
line-height: 18px;
border-left: 4px solid $--color-primary;
}
}
}
.request-header {
border: 1px solid #EDEDED;
background-color: #FFF8F1;
display: flex;
align-items: center;
justify-content: center;
padding: 15px;
margin-top: 30px;
text {
text-align: center;
}
}
.quote {
border-left: 1px solid #EDEDED;
border-right: 1px solid #EDEDED;
border-bottom: 1px solid #EDEDED;
display: flex;
align-items: center;
justify-content: center;
padding: 15px;
text {
text-align: center;
}
}
</style> </style>
+186 -67
View File
@@ -31,29 +31,62 @@
<!-- 筛选表单 --> <!-- 筛选表单 -->
<view class="filter-outer"> <view class="filter-outer">
<el-form @submit.native.prevent label-width="80px"> <el-form @submit.native.prevent label-width="80px">
<el-form-item label="关键词"> <el-form-item label="关键词:" class="border-bottom pb-30">
<el-input @keyup.enter.native="query(1)" clearable placeholder="输入关键字搜索" v-model="keyword"> <el-input @keyup.enter.native="search(1)" clearable placeholder="输入关键字搜索" v-model="keyword">
<el-button @click="query(1)" type="primary" slot="append" icon="el-icon-search"></el-button> <i slot="prefix" class="el-input__icon el-icon-search"></i>
<el-button @click="search(1)" type="primary" slot="append" style="border-radius: 0">搜索
</el-button>
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item label="分类"> <el-form-item label="分类:" class="border-bottom pb-30">
<el-tabs> <view class="flex justify-start items-center flex-wrap">
<el-tab-pane v-for="(item, index) in categoryTreeData" :label="item.name" :key="item._id"> <text @click="clickedCateIndex = -1" class="pointer mr-25"
<el-checkbox-group v-model="checkCategoryList[index]"> :class="[clickedCateIndex === -1 ? 'text-main selected-cate' : '']">全部
<el-checkbox v-for="(citem, cindex) in item.children" :label="citem" </text>
:key="cindex">{{citem.name}}</el-checkbox> <view v-for="(item, index) in categoryTreeData" :key="index">
</el-checkbox-group> <text @click="clickedCateIndex = index" class="pointer mr-25"
</el-tab-pane> :class="[clickedCateIndex === index ? 'text-main selected-cate' : '']"
</el-tabs> v-if="index < 10">
{{ item.name }}
</text>
</view>
</view>
<view class="child-cate flex justify-start items-center flex-wrap">
<template v-if="clickedCateIndex === -1">
<text class="pointer mr-25" @click="selectCate(item._id)"
:class="[checkCategoryList.includes(item._id) ? 'text-main' : '']"
v-for="(item, index) in allChildCate" :key="index">{{ item.name }}
</text>
</template>
<template v-else>
<text class="pointer mr-25" @click="selectCate(item._id)"
:class="[checkCategoryList.includes(item._id) ? 'text-main' : '']"
v-for="(item, index) in categoryTreeData[clickedCateIndex].children" :key="index">
{{ item.name }}
</text>
</template>
<!-- <text @click="showAllTexture = !showAllTexture" class="pointer mr-25" >查看更多-->
<!-- </text>-->
</view>
</el-form-item> </el-form-item>
<el-form-item label="城市"> <el-form-item label="供应商:" class="border-bottom pb-30">
<el-checkbox-group v-model="checkProvinceList"> <view class="flex justify-start items-center">
<!-- <el-checkbox :label="{code:0,name: '全国'}">全国</el-checkbox> --> <text @click="selectCompany(-1)" class="pointer mr-25"
<el-checkbox :checked="cindex == 0" v-for="(citem, cindex) in provinceData" :label="citem" :class="[checkCompanyList.length === 0 ? 'text-main selected-cate' : '']">全部
:key="cindex">{{citem.name}}</el-checkbox> </text>
</el-checkbox-group> <view v-for="(item, index) in companyList" :key="index">
<text @click="selectCompany(item._id)" class="pointer mr-25"
:class="[checkCompanyList.includes(item._id) ? 'text-main selected-cate' : '']"
v-if="index < 10 || showAllCompany">
{{ item.name }}
</text>
</view>
<text @click="showAllCompany = !showAllCompany" class="pointer mr-25"
v-if="companyList.length > 10">查看更多
</text>
</view>
</el-form-item> </el-form-item>
<el-form-item label="已选"> <el-form-item label="已选择">
<view class="tags"> <view class="tags">
<el-tag v-for="(item, index) in checkCategoryArr" :key="index">{{ item.name }}</el-tag> <el-tag v-for="(item, index) in checkCategoryArr" :key="index">{{ item.name }}</el-tag>
</view> </view>
@@ -63,7 +96,8 @@
<!-- 商品列表 --> <!-- 商品列表 -->
<view class="sheet-list"> <view class="sheet-list">
<vk-data-table ref="table1" :action="table1.action" :columns="table1.columns" :customRightBtns="table1.customRightBtns" <vk-data-table ref="table1" :action="table1.action" :columns="table1.columns"
:customRightBtns="table1.customRightBtns"
:pagination="true"></vk-data-table> :pagination="true"></vk-data-table>
</view> </view>
@@ -74,6 +108,7 @@
<script> <script>
import provinces from "@/uni_modules/vk-uview-ui/libs/address/provinces.json"; import provinces from "@/uni_modules/vk-uview-ui/libs/address/provinces.json";
provinces.unshift({ provinces.unshift({
code: 9999, code: 9999,
name: '全国' name: '全国'
@@ -83,8 +118,13 @@
return { return {
categoryTreeData: [], categoryTreeData: [],
provinceData: provinces, provinceData: provinces,
checkCategoryList: [],
checkProvinceList: [], checkProvinceList: [],
allChildCate: [],
companyList: [],
checkCompanyList: [],
clickedCateIndex: -1,
checkCategoryList: [],
showAllCompany: false,
keyword: '', keyword: '',
// 表格相关开始 ----------------------------------------------------------- // 表格相关开始 -----------------------------------------------------------
table1: { table1: {
@@ -111,32 +151,34 @@
}) })
}, },
customRightBtns: [{ customRightBtns: [{
title: '详情', title: '申请加工',
icon: 'el-icon-search', // icon: 'el-icon-search',
type: 'primary', type: 'primary',
onClick: (item) => { plain: true,
vk.navigateTo('/pages/process/detail?id=' + item._id); onClick: ({_id}) => {
this.toDetail(_id)
// vk.navigateTo('/pages/process/detail?id=' + item._id);
} }
},], },],
// 表格字段显示规则 // 表格字段显示规则
columns: [ columns: [
{ {
key: "productList", key: "title",
title: "品名/材质", title: "标题",
type: "text", type: "text",
width: 280, width: 280,
formatter: (val, row, column, index) => { // formatter: (val, row, column, index) => {
return val.map(item=>item.name).join("/") // return val.map(item=>item.name).join("/")
} // }
}, },
{ {
key: "productList", key: "num",
title: "采购量", title: "加工量",
type: "text", type: "text",
width: 280, width: 280,
formatter: (val, row, column, index) => { // formatter: (val, row, column, index) => {
return val.map(item=>item.procureNumber + item.procureUnit).join("/") // return val.map(item=>item.procureNumber + item.procureUnit).join("/")
} // }
}, },
{ {
key: "productList", key: "productList",
@@ -157,26 +199,26 @@
return str return str
} }
}, },
{
key: "user",
title: "采购单位",
type: "text",
width: 280,
formatter: (val, row, column, index) => {
if(val.accountType == 1) {
return val.person.personName
}else {
return val.company.companyName
}
}
},
// { // {
// key: "_add_time", // key: "user",
// title: "添加时间", // title: "采购单位",
// type: "time", // type: "text",
// width: 160 // width: 280,
// formatter: (val, row, column, index) => {
// if(val.accountType == 1) {
// return val.person.personName
// }else {
// return val.company.companyName
// }
// }
//
// }, // },
{
key: "_add_time",
title: "添加时间",
type: "time",
width: 160
},
], ],
// 多选框选中的值 // 多选框选中的值
@@ -193,26 +235,63 @@
vk.callFunction({ vk.callFunction({
url: 'client/spot/category/pub/getTree', url: 'client/spot/category/pub/getTree',
title: '请求中...', title: '请求中...',
data: { data: {},
},
success: (data) => { success: (data) => {
this.categoryTreeData = data.rows this.categoryTreeData = data.rows
for (var i = 0; i < data.rows.length; i++) { this.allChildCate = []
this.checkCategoryList.push([]) this.categoryTreeData.forEach(item => {
} item.children.forEach(child => {
this.allChildCate.push(child)
})
})
} }
}); });
this.getCompany()
}, },
methods: { methods: {
selectCate(id) {
const index = this.checkCategoryList.indexOf(id)
if (index === -1) this.checkCategoryList.push(id)
else this.checkCategoryList.splice(index, 1)
this.search(1)
},
selectTexture(id) {
if (id === -1) this.checkTextureList = []
else {
const index = this.checkTextureList.indexOf(id)
if (index === -1) this.checkTextureList.push(id)
else this.checkTextureList.splice(index, 1)
}
this.search(1)
},
selectCompany(id) {
if (id === -1) this.checkCompanyList = []
else {
const index = this.checkCompanyList.indexOf(id)
if (index === -1) this.checkCompanyList.push(id)
else this.checkCompanyList.splice(index, 1)
}
this.search(1)
},
getCompany() {
vk.callFunction({
url: 'client/user/pub/getCompany',
title: '请求中...',
data: {},
success: (data) => {
this.companyList = data.rows.map(item => {
item.name = item.company.companyName
return item
})
}
});
},
toMyEnquiry() { toMyEnquiry() {
vk.navigateTo({ vk.navigateTo({
url: '/pages/enquiry/my' url: '/pages/process/my'
}) })
}, },
toRelease() { toRelease() {
if (!vk.getVuex('$user.userInfo.fadadaConfirm')) { if (!vk.getVuex('$user.userInfo.fadadaConfirm')) {
this.$confirm('您尚未认证, 是否前往认证?', '提示', { this.$confirm('您尚未认证, 是否前往认证?', '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
@@ -234,10 +313,29 @@
url: '/pages/process/release' url: '/pages/process/release'
}) })
} }
},
toDetail(id) {
if (!vk.getVuex('$user.userInfo.fadadaConfirm')) {
this.$confirm('您尚未认证, 是否前往认证?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.getCertUrl()
})
} else if (vk.pubfn.isNull(vk.getVuex('$user.userInfo.businessCard'))) {
this.$confirm('请完善名片信息', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
vk.navigateTo('/pages/user/user?menu=business-card');
})
} else {
vk.navigateTo({
url: `/pages/process/detail?id=${id}`
})
}
}, },
search(pageIndex) { search(pageIndex) {
const categoryIds = [] const categoryIds = []
@@ -267,6 +365,14 @@
} }
}); });
}, },
getCertUrl() {
vk.callFunction({
url: 'client/fadada.getVerifyUrl',
success: (res) => {
location.href = res.data.url
}
});
},
}, },
computed: { computed: {
checkCategoryArr() { checkCategoryArr() {
@@ -329,7 +435,6 @@
} }
.paginatio { .paginatio {
float: none; float: none;
width: 1200px; width: 1200px;
@@ -337,4 +442,18 @@
display: flex; display: flex;
justify-content: center; justify-content: center;
} }
.selected-cate {
border-bottom: 2px solid #BD3124;
line-height: 40rpx;
}
.child-cate {
background-color: #DB8382;
color: white;
margin-top: 10rpx;
border-radius: 15rpx;
padding: 0 20rpx;
}
</style> </style>
+35 -42
View File
@@ -19,17 +19,18 @@
mode="aspectFill"></image> mode="aspectFill"></image>
</el-carousel-item> </el-carousel-item>
</el-carousel> </el-carousel>
<!-- <view class="goods-options"> <view class="goods-options">
<el-row class=""> <el-row class="">
<el-button @click="toRelease" type="primary" round>发布加工单</el-button> <el-button @click="toRelease" type="primary" round>发布加工单</el-button>
<el-button @click="toMyEnquiry" type="primary" round plain>我发布的加工单</el-button> <!-- <el-button @click="toMyEnquiry" type="primary" round plain>我发布的加工单</el-button>-->
</el-row> </el-row>
</view> --> </view>
</view> </view>
<!-- 加工单列表 --> <!-- 加工单列表 -->
<view class="sheet-list"> <view class="sheet-list">
<vk-data-table ref="table1" :action="table1.action" :columns="table1.columns" :customRightBtns="table1.customRightBtns" <vk-data-table ref="table1" :action="table1.action" :columns="table1.columns"
:customRightBtns="table1.customRightBtns"
:pagination="true"></vk-data-table> :pagination="true"></vk-data-table>
</view> </view>
@@ -40,6 +41,7 @@
<script> <script>
import provinces from "@/uni_modules/vk-uview-ui/libs/address/provinces.json"; import provinces from "@/uni_modules/vk-uview-ui/libs/address/provinces.json";
provinces.unshift({ provinces.unshift({
code: 9999, code: 9999,
name: '全国' name: '全国'
@@ -59,7 +61,11 @@
let {data, success, fail, complete} = obj; let {data, success, fail, complete} = obj;
vk.callFunction({ vk.callFunction({
url: `client/process/sheet/pub/getList`, url: `client/process/sheet/pub/getList`,
data: data, data: {
...data, ...{
userId: vk.getVuex('$user.userInfo._id')
}
},
success: (res) => { success: (res) => {
if (typeof success === "function") { if (typeof success === "function") {
success({ success({
@@ -87,22 +93,14 @@
// 表格字段显示规则 // 表格字段显示规则
columns: [ columns: [
{ {
key: "productList", key: "title",
title: "品名/材质", title: "标题",
type: "text", type: "text",
width: 280,
formatter: (val, row, column, index) => {
return val.map(item=>item.name).join("/")
}
}, },
{ {
key: "productList", key: "num",
title: "采购量", title: "加工量",
type: "text", type: "text"
width: 280,
formatter: (val, row, column, index) => {
return val.map(item=>item.procureNumber + item.procureUnit).join("/")
}
}, },
{ {
key: "productList", key: "productList",
@@ -123,26 +121,26 @@
return str return str
} }
}, },
{
key: "user",
title: "采购单位",
type: "text",
width: 280,
formatter: (val, row, column, index) => {
if(val.accountType == 1) {
return val.person.personName
}else {
return val.company.companyName
}
}
},
// { // {
// key: "_add_time", // key: "user",
// title: "添加时间", // title: "采购单位",
// type: "time", // type: "text",
// width: 160 // width: 280,
// formatter: (val, row, column, index) => {
// if(val.accountType == 1) {
// return val.person.personName
// }else {
// return val.company.companyName
// }
// }
//
// }, // },
{
key: "_add_time",
title: "添加时间",
type: "time",
width: 160
},
], ],
// 多选框选中的值 // 多选框选中的值
@@ -159,9 +157,7 @@
vk.callFunction({ vk.callFunction({
url: 'client/spot/category/pub/getTree', url: 'client/spot/category/pub/getTree',
title: '请求中...', title: '请求中...',
data: { data: {},
},
success: (data) => { success: (data) => {
this.categoryTreeData = data.rows this.categoryTreeData = data.rows
for (var i = 0; i < data.rows.length; i++) { for (var i = 0; i < data.rows.length; i++) {
@@ -202,8 +198,6 @@
} }
}, },
search(pageIndex) { search(pageIndex) {
const categoryIds = [] const categoryIds = []
@@ -295,7 +289,6 @@
} }
.paginatio { .paginatio {
float: none; float: none;
width: 1200px; width: 1200px;
+157 -5
View File
@@ -8,15 +8,27 @@
<el-breadcrumb separator="/"> <el-breadcrumb separator="/">
<el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item> <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
<el-breadcrumb-item> <el-breadcrumb-item>
<view style="display: inline-block;" @click="vk.navigateTo('/pages/process/list');">加工单</view> <navigator style="display: inline-block;" url="/pages/process/list">找加工</navigator>
</el-breadcrumb-item> </el-breadcrumb-item>
<el-breadcrumb-item>填写报价信息</el-breadcrumb-item> <el-breadcrumb-item>填写报价信息</el-breadcrumb-item>
</el-breadcrumb> </el-breadcrumb>
</view> </view>
<view class="form-footer"> <view class="page-main">
<el-button type="primary" @click="submit">提交报价单</el-button> <vk-data-form
ref="form1"
v-model="form1.data"
:action="form1.props.action"
:columns="form1.props.columns"
:rules="form1.props.rules"
:form-type="form1.props.formType"
:loading.sync="form1.props.loading"
:auto-close="true"
label-width="140px"
@success="onFormSuccess"
></vk-data-form>
</view> </view>
<common-footer></common-footer> <common-footer></common-footer>
</view> </view>
</template> </template>
@@ -25,12 +37,152 @@
export default { export default {
data() { data() {
return { return {
// 表单相关开始-----------------------------------------------------------
form1: {
// 表单请求数据,此处可以设置默认值
data: {
// radio: 1,
// checkbox : [1,2]
sheetId: null
},
// 表单属性
props: {
// 表单请求地址
action: "client/process/quote/kh/addQuote",
// 表单字段显示规则
columns: [
{key: "totalPrice", title: "货款总价", type: "money"},
{key: "totalPriceStr", title: "人民币大写", type: "text"},
{key: "remark", title: "报价单详情", type: "editor"},
],
// 表单验证规则
rules: {
text: [
{required: true, message: "text不能为空", trigger: "change"},
]
},
// add 代表添加 update 代表修改
formType: "",
// 表单是否在请求中
loading: false,
// 是否显示表单1 的弹窗
show: false
}
},
// 表单相关结束-----------------------------------------------------------
}; };
},
onLoad(options = {}) {
console.log(options)
const {
sheetId
} = options
if (!sheetId) {
vk.navigateBack()
return
}
this.sheetId = sheetId
this.form1.data.sheetId = sheetId
// this.getEnquiryDetail()
},
computed: {
totalPriceStr() {
if (this.totalPrice == 0) {
return "零元"
}
return vk.myfn.convertCurrency(this.totalPrice / 100)
}
},
methods: {
onFormSuccess() {
},
// 提交报价单
async submit() {
const data = await vk.userCenter.getCurrentUserInfo();
const {userInfo} = data
if (userInfo.quoteTimes > 3) {
}
vk.callFunction({
url: 'client/process/quote/kh/addQuote',
title: '请求中...',
// data: {
// sheet: this.sheet,
// totalPrice: this.totalPrice
// },
success: (data) => {
this.$message({
message: "报价成功",
type: 'success'
})
vk.navigateBack()
}
});
},
/**
* 获取询价单详情
*/
// getEnquiryDetail() {
// vk.callFunction({
// url: 'client/progress/sheet/pub/getDetail',
// title: '请求中...',
// data: {
// _id: this.sheetId
// },
// success: (res) => {
//
// res.data.productList.forEach(item => {
// item.unitPrice = 0
// const keys = Object.keys(item.extraAttributes)
// keys.forEach(citem => {
// item.extraAttributes[citem] = JSON.parse(item.extraAttributes[
// citem])
// })
// })
//
//
// this.sheet = res.data
// }
// });
// }
} }
} }
</script> </script>
<style lang="scss"> <style lang="scss" scoped>
.page-main {
width: 1200px;
margin: 20px auto;
background-color: #FFFFFF;
padding: 20px;
}
.description {
margin-bottom: 40px;
width: 800px;
}
.quote {
display: flex;
align-items: center;
justify-content: space-between;
}
.quote-form {
width: 260px;
}
.form-footer {
height: 40px;
line-height: 40px;
background: #fff;
padding-top: 0;
text-align: center;
display: block;
}
</style> </style>
+537 -34
View File
@@ -8,7 +8,7 @@
<el-breadcrumb separator="/"> <el-breadcrumb separator="/">
<el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item> <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
<el-breadcrumb-item> <el-breadcrumb-item>
<navigator style="display: inline-block;" url="/pages/enquiry/list">加工单</navigator> <navigator style="display: inline-block;" url="/pages/process/list">加工单</navigator>
</el-breadcrumb-item> </el-breadcrumb-item>
<el-breadcrumb-item>发布加工单</el-breadcrumb-item> <el-breadcrumb-item>发布加工单</el-breadcrumb-item>
</el-breadcrumb> </el-breadcrumb>
@@ -21,30 +21,301 @@
<view class="title-sub">加工单信息越完整,加工商报价越精准</view> <view class="title-sub">加工单信息越完整,加工商报价越精准</view>
</view> </view>
<vk-data-form ref="form1" v-model="form1.data" :action="form1.props.action" :columns="form1.props.columns" <!-- <vk-data-form ref="form1" v-model="form1.data" :action="form1.props.action" :columns="form1.props.columns"-->
:rules="form1.props.rules" :form-type="form1.props.formType" :loading.sync="form1.props.loading" <!-- :rules="form1.props.rules" :form-type="form1.props.formType" :loading.sync="form1.props.loading"-->
:before-action="form1.props.beforeAction" label-width="140px" cancel-text="保存草稿" submit-text="提交加工单" <!-- :before-action="form1.props.beforeAction" label-width="140px" cancel-text="保存草稿" submit-text="提交加工单"-->
@success="onFormSuccess" :footer-show="false"> <!-- @success="onFormSuccess" :footer-show="false">-->
</vk-data-form> <!-- </vk-data-form>-->
<el-form ref="form" :model="form1.data" label-width="120px">
<view class="form-title-wrap">
<view class="goods-info-title">
<view class="form-title">
加工信息
</view>
</view>
<view class="sales-code flex justify-end items-center">
<text>金九信业务员编号:</text>
<el-input v-model="form1.data.salesCode" placeholder="请输入编号没有则留空" size="small"/>
</view>
</view>
<view class="p-30">
<el-form-item label="品名/材质" required>
<el-input v-model="form1.data.title" disabled/>
</el-form-item>
<view class="flex justify-start items-center my-20">
<text class="text-30">点击添加加工商品</text>
<text class="text-gray text-25">(至少选择1个商品,最多选择5个商品)</text>
</view>
<view class="flex justify-start items-start flex-wrap mb-40">
<text class="text-35 mr-25 mb-20 pointer"
:class="[form1.data.productList.includes(item._id) ? 'text-main' : '']"
v-for="(item, index) in productList"
:key="index" @click="selectGoods(item)">{{ item.name }}
</text>
</view>
<el-form-item label="加工量" required>
<el-input v-model="form1.data.num" type="number"/>
</el-form-item>
<el-form-item label="附件内容" required>
<el-upload action="#" :on-change="selectFile" :auto-upload="false" ref="uploader">
<!-- <el-upload action="#" :before-upload="upload">-->
<view class="attachment-upload" v-if="!form1.data.attachment">
<i class="el-icon-plus"/>
</view>
<data-file theme="two-tone" size="24" :fill="['#333' ,'#ffffff']" strokeLinecap="square"
v-else/>
<!-- <el-image v-else :url="form1.data.attachment" fit="cover"/>-->
</el-upload>
</el-form-item>
</view>
<view class="form-title-wrap">
<view class="goods-info-title">
<view class="form-title">
加工商其他要求
</view>
</view>
</view>
<view class="p-30">
<el-radio-group v-model="hasRequire" class="my-20">
<el-radio :label="true">有</el-radio>
<el-radio :label="false">无</el-radio>
</el-radio-group>
<view class="pos-r">
<el-input type="textarea" v-model="form1.data.remark" :disabled="!hasRequire"
placeholder="复杂加工提供图纸、简单加工详细说明加工内容,如:镀锌、刷漆、防腐、折弯、裁剪等"
:rows="5"/>
<view class="remark-upload">
<i class="el-icon-plus"/>
</view>
</view>
</view>
<view class="form-title-wrap">
<view class="goods-info-title">
<view class="form-title">
发票要求
</view>
</view>
</view>
<view class="p-30">
<view class="mb-20">
<el-radio-group v-model="form1.data.invoice">
<el-radio :label="true">含税</el-radio>
<el-radio :label="false">不含税</el-radio>
</el-radio-group>
</view>
<template v-if="form1.data.invoice">
<view class="mb-20 flex justify-start items-center">
<text>开票时间:</text>
<el-radio-group v-model="form1.data.writeInvoiceTime">
<el-radio v-for="(item, index) in WRITE_INVOICE_TIME" :key="index" :label="index">
{{ item }}</el-radio>
</el-radio-group>
</view>
<view class="mb-20 flex justify-start items-center">
<text>发票种类:</text>
<el-radio-group v-model="form1.data.invoiceType">
<el-radio v-for="(item, index) in INVOICE_TYPE" :key="index" :label="index">{{ item }}</el-radio>
</el-radio-group>
<view class="ml-20 flex justify-start items-center">
<text class="label-width">其他要求:</text>
<el-input v-model="form1.data.invoiceOther" placeholder="请输入" size="small"/>
</view>
</view>
</template>
</view>
<view class="form-title-wrap">
<view class="goods-info-title">
<view class="form-title">
运输要求
</view>
</view>
</view>
<view class="p-30">
<view class="mb-20 flex justify-start items-center">
<text>随货资料:</text>
<el-checkbox-group v-model="form1.data.transportDocuments">
<el-checkbox label="合格证"/>
<el-checkbox label="检测报告"/>
<el-checkbox label="销售清单"/>
<el-checkbox label="磅重"/>
</el-checkbox-group>
</view>
<view class="mb-20 flex justify-start items-center">
<text class="label-width">其他要求:</text>
<el-input v-model="form1.data.otherTransportDocuments" placeholder="请输入"/>
</view>
<view class="mb-20 flex justify-start items-center">
<text>运输限制:</text>
<el-radio-group v-model="form1.data.transportLimit">
<el-radio :label="false">无</el-radio>
<el-radio :label="true">有</el-radio>
</el-radio-group>
</view>
</view>
<view class="form-title-wrap">
<view class="goods-info-title">
<view class="form-title">
交易模式
</view>
</view>
</view>
<view class="p-30">
<view class="mb-20 flex justify-start items-center">
<text>交易模式:</text>
<el-radio-group v-model="form1.data.tradeMethod">
<el-radio :label="0">自主交易</el-radio>
<el-radio :label="1">金久信公证</el-radio>
</el-radio-group>
</view>
</view>
<view class="form-title-wrap">
<view class="goods-info-title">
<view class="form-title">
交易说明
</view>
</view>
</view>
<view class="p-30">
<view class="mb-20 flex justify-start items-center">
<text>付款方式:</text>
<el-radio v-model="form1.data.payMethod" :label="0">预付</el-radio>
<view class="flex justify-start items-center">
<el-input v-model="form1.data.advancePayRate"
class="advance-pay-rate"/>
<text>%货到付全款</text>
</view>
<view class="mx-20">
<el-radio v-model="form1.data.payMethod" :label="1">货到验收后付款</el-radio>
</view>
<el-radio v-model="form1.data.payMethod" :label="2">提货付全款</el-radio>
<view class="mx-20 flex justify-start items-center">
<el-radio v-model="form1.data.payMethod" :label="3">信誉采购,货到签单后账期:</el-radio>
<el-input v-model="form1.data.reputationPayDay"
class="advance-pay-rate">
<template slot="suffix">天</template>
</el-input>
</view>
</view>
<view class="mb-20 flex justify-start items-center">
<el-radio v-model="form1.data.payMethod" :label="4">其他付款方式</el-radio>
<el-input v-model="form1.data.otherPayMethod"/>
</view>
<view class="mb-20 flex justify-start items-center">
<text>报价形式:</text>
<el-radio v-model="form1.data.offerType" :label="0">整单报价</el-radio>
<el-radio v-model="form1.data.offerType" :label="1">可分项报价</el-radio>
</view>
<view class="mb-20 flex justify-start items-center">
<text>报价时限:</text>
<view class="flex justify-start items-center">
<el-date-picker
v-model="form1.data.answerStartTime"
type="datetime"/>
<view class="mx-15">~</view>
<el-date-picker
v-model="form1.data.answerEndTime"
type="datetime"/>
</view>
</view>
</view>
<view class="form-title-wrap">
<view class="goods-info-title">
<view class="form-title">
交易说明
</view>
</view>
</view>
<view class="p-30">
<view class="mb-20 flex justify-start items-center">
<text style="width: 140px">交保证金要求:</text>
<el-input v-model="form1.data.earnestMoney" placeholder="请输入交保证金要求(如无要求则留空)"/>
</view>
</view>
<view class="form-title-wrap">
<view class="goods-info-title">
<view class="form-title">
简易合同备注和其他补充条款
</view>
</view>
</view>
<view class="p-30">
<view class="mb-20 flex justify-start items-center">
<el-radio v-model="form1.data.signMethod" :label="0">法大大</el-radio>
<el-radio v-model="form1.data.signMethod" :label="1">线下签约</el-radio>
</view>
<view v-if="form1.data.signMethod === 0">
<view class="flex justify-start items-start border">
<view class="m-10 sign-method-header">违约责任:</view>
<view class="border-left m-10 pl-20 flex-1">
1.
乙方所交产品品种、型号、规格、质量不符合规定的,如果甲方同意利用,应当按质论价;如果甲方不能利用的,应根据产品的具体情况,由乙方负责包换或包修,并承担修理、调换或退货而支付的实际费用;
2.乙方不予供货违约责任为甲方的实际损失+违约金,如乙方材料符合订货标准,甲方不能退货和不收货,甲方无条件应按实际本合同订货数量支付100%货款,并支付乙方因此产生的实际费用。带有甲乙双方单位相关收货人和发货人签字的本合同的发货清单事项和内容均视为本合同的补充合同,与本合同有相同的法律效力,双方应共同遵照执行。
</view>
</view>
<view class="flex justify-start items-start border">
<view class="m-10 sign-method-header">解决纠纷的方法:</view>
<view class="border-left m-10 pl-20 flex-1">
1、凡因本合同引起的或与本合同有关的任何争议,均可友好协商或仲裁解决,协商或仲裁不成的,双方协商同意在合同签订地人民法院管辖地起诉,违约一方或对合同争议承担主要责任的一方,应承担对方因仲裁和起诉而产生的全部律师代理费、鉴定(检验)费、诉讼保全费、诉讼保险费、公告费、差旅费、执行费、误工费和获取证据产生费用等其他相关费用。
2、双方本合同相关权利放弃均应有双方书面作出并加盖公章或授权委托人签字后生效。
</view>
</view>
<view class="flex justify-start items-start border">
<view class="m-10 sign-method-header">不可抗力:</view>
<view class="border-left m-10 pl-20 flex-1">
甲乙双方的任何一方由于不可抗力或突发公共事件的原因不能履行合同时,应及时向对方通报不能履行或不能完全履行的理由,以减轻可能给对方造成的损失,在取得有关机构证明以后,允许延期履行、部分履行或者不履行合同,并根据情况可部分或全部免予承担违约责任。
</view>
</view>
<view class="flex justify-start items-start border">
<view class="m-10 sign-method-header">其他:</view>
<view class="border-left m-10 pl-20 flex-1">
本合同的全部内容由双方平等共同协商一致,共同起草制定,非一方事先拟定,不属于格式条款。本合同自双方签字盖章后生效(包括电子签字、盖章),按本合同内容地址、联系方式寄送的一切文书、函件送达与否,均为视为送达有法律效力,通知途径和本合同内联系方式或地址送达文件双方均予以验证。
</view>
</view>
<view class="flex justify-start items-start border">
<view class="m-10 sign-method-header">采购方补充条款:</view>
<view class="border-left m-10 pl-20 flex-1">
供货方逾期供货承担采购方一切损失
</view>
</view>
</view>
</view>
</el-form>
<view class="form-footer"> <view class="form-footer">
<el-button type="" @click="draft">保存草稿</el-button> <el-button type="" @click="draft">保存草稿</el-button>
<el-button type="primary" @click="submit">提交加工单</el-button> <el-button type="primary" @click="submit">提交加工单</el-button>
</view> </view>
<!-- <el-divider content-position="left">其他设置</el-divider> --> <!-- <el-divider content-position="left">其他设置</el-divider> -->
</view> </view>
<Gap/>
<common-footer></common-footer> <common-footer></common-footer>
</view> </view>
</template> </template>
<script> <script>
import Gap from "../../components/gap/gap.vue";
import {DataFile} from '@icon-park/vue'
import dayjs from "dayjs";
import {WRITE_INVOICE_TIME, INVOICE_TYPE} from '@/util'
export default { export default {
components: {}, components: {Gap, DataFile},
data() { data() {
return { return {
WRITE_INVOICE_TIME,
INVOICE_TYPE,
// 表单相关开始----------------------------------------------------------- // 表单相关开始-----------------------------------------------------------
productList: [{}], productList: [{}],
baseAttributes: [], baseAttributes: [],
@@ -53,7 +324,29 @@
data: { data: {
// extraAttributes: {}, // extraAttributes: {},
// attributes: {}, // attributes: {},
invoice: false invoice: false,
salesCode: '',
title: '',
num: '',
remark: '',
transportDocuments: [],
writeInvoiceTime: 0,
invoiceType: 0,
invoiceOther: '',
otherTransportDocuments: '',
transportLimit: false,
tradeMethod: 0,
payMethod: 0,
advancePayRate: null,
reputationPayDay: null,
otherPayMethod: '',
offerType: 0,
answerStartTime: '',
answerEndTime: '',
earnestMoney: '',
signMethod: 0,
attachment: '',
productList: []
}, },
// 表单属性 // 表单属性
props: { props: {
@@ -74,27 +367,38 @@
{key: "detail", title: "详细交货地址", type: "textarea",}, {key: "detail", title: "详细交货地址", type: "textarea",},
], ],
}, },
{key: "files", title: "附件", type: "file",tips: '上传自有加工单图片或文档,支持jpg/png/word/excel'}, {
key: "files",
title: "附件",
type: "file",
tips: '上传自有加工单图片或文档,支持jpg/png/word/excel'
},
{key: "", title: "采购商其他要求", type: "bar-title"}, {key: "", title: "采购商其他要求", type: "bar-title"},
{key: "remark", title: "其他要求", type: "textarea",}, {key: "remark", title: "其他要求", type: "textarea",},
{key: "", title: "发票要求", type: "bar-title"}, {key: "", title: "发票要求", type: "bar-title"},
{key: "invoice", title: "发票要求", type: "radio", {
key: "invoice", title: "发票要求", type: "radio",
data: [ data: [
{value: true, label: "含税"}, {value: true, label: "含税"},
{value: false, label: "不含税"} {value: false, label: "不含税"}
], ],
}, },
{key: "writeInvoiceTime", {
key: "writeInvoiceTime",
title: "开票时间", title: "开票时间",
type: "radio", type: "radio",
data: [ data: [
{ value: '付款当月(限20号之前付款,20号之后付款次月开票)', label: "付款当月(限20号之前付款,20号之后付款次月开票)" }, {
value: '付款当月(限20号之前付款,20号之后付款次月开票)',
label: "付款当月(限20号之前付款,20号之后付款次月开票)"
},
{value: '付款后次月', label: "付款后次月"}, {value: '付款后次月', label: "付款后次月"},
{value: '付款前', label: "付款前"}, {value: '付款前', label: "付款前"},
], ],
showRule: 'invoice == true' showRule: 'invoice == true'
}, },
{key: "nvoiceType", {
key: "nvoiceType",
title: "发票种类", title: "发票种类",
type: "radio", type: "radio",
data: [ data: [
@@ -105,7 +409,8 @@
showRule: 'invoice == true' showRule: 'invoice == true'
}, },
{key: "", title: "运输要求", type: "bar-title"}, {key: "", title: "运输要求", type: "bar-title"},
{key: "transportDocuments", {
key: "transportDocuments",
title: "随货资料", title: "随货资料",
type: "checkbox", type: "checkbox",
data: [ data: [
@@ -116,12 +421,14 @@
], ],
}, },
{key: "otherTransportDocuments", title: "其他资料", type: "text"}, {key: "otherTransportDocuments", title: "其他资料", type: "text"},
{key: "transportLimit", {
key: "transportLimit",
title: "运输限制", title: "运输限制",
type: "text", type: "text",
}, },
{key: "", title: "交易说明", type: "bar-title", component: 'custom-form-section'}, {key: "", title: "交易说明", type: "bar-title", component: 'custom-form-section'},
{key: "tradeMethod", {
key: "tradeMethod",
title: "交易模式", title: "交易模式",
type: "radio", type: "radio",
data: [ data: [
@@ -144,29 +451,79 @@
}, },
{ {
key: "", title: "", type: 'group', showLabel: false, justify: "start", columns: [ key: "", title: "", type: 'group', showLabel: false, justify: "start", columns: [
{key: "advancePayRate", title: "预付百分比", type: "percentage",showRule: "payMethod==1"}, {
key: "advancePayRate",
title: "预付百分比",
type: "percentage",
showRule: "payMethod==1"
},
{key: "otherPayMethod", title: "其他付款方式", type: "text", showRule: "payMethod==5"}, {key: "otherPayMethod", title: "其他付款方式", type: "text", showRule: "payMethod==5"},
{key: "reputationPayDay", title: "货到签单后账期天数", type: "number",showRule: "payMethod==4",rightText: '天'}, {
key: "reputationPayDay",
title: "货到签单后账期天数",
type: "number",
showRule: "payMethod==4",
rightText: '天'
},
] ]
}, },
{key: "answerTime", title: "报价时限", type: "date", dateType: "datetime"}, {key: "answerTime", title: "报价时限", type: "date", dateType: "datetime"},
{key: "earnestMoney", title: "保证金要求", type: "text"}, {key: "earnestMoney", title: "保证金要求", type: "text"},
{key: "", title: "合同要求", type: "bar-title"}, {key: "", title: "合同要求", type: "bar-title"},
{key: 'signMethod', title: '签约方式', type: 'radio', data: [ {
key: 'signMethod', title: '签约方式', type: 'radio', data: [
{value: 0, label: "法大大"}, {value: 0, label: "法大大"},
{value: 1, label: "线下签约"}, {value: 1, label: "线下签约"},
]}, ]
{key: 'contractType', title: '合同选择', type: 'radio',showRule: 'signMethod==0', data: [ },
{
key: 'contractType', title: '合同选择', type: 'radio', showRule: 'signMethod==0', data: [
{value: 0, label: "标准合同模板"}, {value: 0, label: "标准合同模板"},
{value: 1, label: "自定义合同"}, {value: 1, label: "自定义合同"},
]}, ]
{key: "breachLiability", title: "违约责任", type: "textarea", readonly: true, showRule: 'signMethod==0&&contractType==0'}, },
{key: "solveDispute", title: "解决纠纷的方法", type: "textarea", readonly: true, showRule: 'signMethod==0&&contractType==0'}, {
{key: "forceMajeure", title: "不可抗力", type: "textarea", readonly: true, showRule: 'signMethod==0&&contractType==0'}, key: "breachLiability",
{key: "contracOther", title: "其他", type: "textarea", readonly: true, showRule: 'signMethod==0&&contractType==0'}, title: "违约责任",
{key: "buyerSupplement", title: "采购方补充条款", type: "textarea", readonly: true, showRule: 'signMethod==0&&contractType==0'}, type: "textarea",
{key: "sellerSupplement", title: "供应方补充条款", type: "textarea", showRule: 'signMethod==0&&contractType==0'}, readonly: true,
showRule: 'signMethod==0&&contractType==0'
},
{
key: "solveDispute",
title: "解决纠纷的方法",
type: "textarea",
readonly: true,
showRule: 'signMethod==0&&contractType==0'
},
{
key: "forceMajeure",
title: "不可抗力",
type: "textarea",
readonly: true,
showRule: 'signMethod==0&&contractType==0'
},
{
key: "contracOther",
title: "其他",
type: "textarea",
readonly: true,
showRule: 'signMethod==0&&contractType==0'
},
{
key: "buyerSupplement",
title: "采购方补充条款",
type: "textarea",
readonly: true,
showRule: 'signMethod==0&&contractType==0'
},
{
key: "sellerSupplement",
title: "供应方补充条款",
type: "textarea",
showRule: 'signMethod==0&&contractType==0'
},
// {key: "", title: "采购商信息", type: "bar-title"}, // {key: "", title: "采购商信息", type: "bar-title"},
{ {
key: "files", key: "files",
@@ -209,11 +566,23 @@
} }
}, },
// 表单相关结束----------------------------------------------------------- // 表单相关结束-----------------------------------------------------------
hasRequire: false
}; };
}, },
onLoad() { onLoad() {
this.getProductList()
}, },
methods: { methods: {
getProductList() {
this.productList = []
vk.callFunction({
url: 'client/spot/category/pub/getList',
}).then(({data}) => {
data.forEach(item => {
if (item.parent_id) this.productList.push(item)
})
})
},
onFormSuccess() { onFormSuccess() {
vk.navigateTo('/pages/process/list'); vk.navigateTo('/pages/process/list');
}, },
@@ -228,24 +597,79 @@
this.submitAll() this.submitAll()
}, },
async submitAll() { async submitAll() {
this.$refs.form1.submitForm() // this.$refs.form1.submitForm()
vk.callFunction({
url: this.form1.props.action,
data: {
...this.form1.data, ...{
orderNo: dayjs().format('YYYYMMDDHHmm') + Math.ceil((Math.random() * 1000))
}
}
}).then(() => {
this.$message({
message: "已提交",
type: 'success'
})
setTimeout(() => {
vk.navigateBack()
}, 1500)
})
},
upload(file) {
// vk.uploadFile({
// title: '上传中',
// file,
// success: ({url}) => {
// this.form1.data.attachment = url
// }
// })
console.log(file)
},
selectFile(file) {
// vk.uploadFile({
// title: '上传中',
// file,
// success: ({url}) => {
// this.form1.data.attachment = url
// }
// })
// this.$refs.uploader.clearFiles();
console.log(file)
},
selectGoods(item) {
const index = this.form1.data.productList.indexOf(item._id)
if (this.form1.data.productList.length === 5 && index === -1) return this.$message({
message: "最多选择5个商品",
type: 'error'
})
if (index === -1) this.form1.data.productList.push(item._id)
else this.form1.data.productList.splice(index, 1)
const list = []
this.productList.forEach(item => {
if (this.form1.data.productList.includes(item._id)) list.push(item.name)
})
this.form1.data.title = list.join()
} }
} }
} }
</script> </script>
<style lang="scss"> <style lang="scss" scoped>
@import "@/common/css/app.scss";
.form-view { .form-view {
width: 1200px; width: 1200px;
margin: 0 auto; margin: 0 auto;
background-color: #FFFFFF; background-color: #FFFFFF;
padding: 20rpx; padding: 20rpx;
border-radius: 20px;
} }
.m-20 { .m-20 {
margin: 20px; margin: 20px;
} }
.title-main { .title-main {
font-size: 18px; font-size: 18px;
font-weight: bold; font-weight: bold;
@@ -261,6 +685,7 @@
padding-left: 140px; padding-left: 140px;
margin: 0 0 20px 0; margin: 0 0 20px 0;
} }
.form-footer { .form-footer {
height: 40px; height: 40px;
line-height: 40px; line-height: 40px;
@@ -269,4 +694,82 @@
text-align: center; text-align: center;
display: block; display: block;
} }
.form-title-wrap {
display: flex;
align-items: center;
justify-content: space-between;
.goods-info-title {
display: flex;
align-items: center;
justify-content: flex-start;
}
.form-title {
padding-left: 10px;
color: $--color-primary;
font-size: 18px;
line-height: 18px;
border-left: 4px solid $--color-primary;
}
.enquiry-no {
margin-left: 10px;
font-size: 14px;
}
}
.sales-code {
text {
width: 400rpx;
}
}
.remark-upload {
position: absolute;
left: 15px;
bottom: 15px;
border: 1px solid #ddd;
display: flex;
align-items: center;
justify-content: center;
padding: 5px;
i {
color: #ddd;
font-size: 18px;
}
}
.attachment-upload {
border: 1px solid #ddd;
display: flex;
align-items: center;
justify-content: center;
padding: 5px;
width: 50px;
height: 50px;
cursor: pointer;
i {
color: #ddd;
font-size: 18px;
}
}
.label-width {
width: 100px;
}
.advance-pay-rate {
width: 100px;
}
.sign-method-header {
width: 120px;
}
</style> </style>
+117 -67
View File
@@ -21,8 +21,8 @@
</el-carousel> </el-carousel>
<view class="goods-options"> <view class="goods-options">
<el-row class=""> <el-row class="">
<el-button @click="toRelease" type="primary" round>发布/编辑我的现货</el-button> <el-button @click="toRelease" type="primary" round>发布现货</el-button>
<!-- <el-button type="primary" round plain>我发布的现货</el-button> --> <el-button type="primary" round plain class="empty-bg-plain-btn">我发布的现货</el-button>
</el-row> </el-row>
</view> </view>
</view> </view>
@@ -31,30 +31,59 @@
<!-- 筛选表单 --> <!-- 筛选表单 -->
<view class="filter-outer"> <view class="filter-outer">
<el-form @submit.native.prevent label-width="80px"> <el-form @submit.native.prevent label-width="80px">
<el-form-item label="关键词"> <el-form-item label="关键词" class="border-bottom pb-30">
<el-input @keyup.enter.native="search(1)" clearable placeholder="输入关键字搜索" v-model="keyword"> <el-input @keyup.enter.native="search(1)" clearable placeholder="输入关键字搜索" v-model="keyword">
<el-button @click="search(1)" type="primary" slot="append" icon="el-icon-search"></el-button> <i slot="prefix" class="el-input__icon el-icon-search"></i>
<el-button @click="search(1)" type="primary" slot="append" style="border-radius: 0">搜索
</el-button>
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item label="分类"> <el-form-item label="现货分类" class="border-bottom pb-30">
<el-tabs> <view class="flex justify-start items-center flex-wrap">
<el-tab-pane v-for="(item, index) in categoryTreeData" :label="item.name" :key="item._id"> <text @click="clickedCateIndex = -1" class="pointer mr-25"
<el-checkbox-group v-model="checkCategoryList[index]"> :class="[clickedCateIndex === -1 ? 'text-main selected-cate' : '']">全部
<el-checkbox v-for="(citem, cindex) in item.children" :label="citem" </text>
:key="cindex">{{citem.name}}</el-checkbox> <view v-for="(item, index) in categoryTreeData" :key="index">
</el-checkbox-group> <text @click="clickedCateIndex = index" class="pointer mr-25"
</el-tab-pane> :class="[clickedCateIndex === index ? 'text-main selected-cate' : '']"
v-if="index < 10">
</el-tabs> {{ item.name }}
</text>
</view>
</view>
<view class="child-cate flex justify-start items-center flex-wrap">
<template v-if="clickedCateIndex === -1">
<text class="pointer mr-25" @click="selectCate(item._id)"
:class="[checkCategoryList.includes(item._id) ? 'text-main' : '']"
v-for="(item, index) in allChildCate" :key="index">{{ item.name }}
</text>
</template>
<template v-else>
<text class="pointer mr-25" @click="selectCate(item._id)"
:class="[checkCategoryList.includes(item._id) ? 'text-main' : '']"
v-for="(item, index) in categoryTreeData[clickedCateIndex].children" :key="index">
{{ item.name }}
</text>
</template>
</view>
</el-form-item> </el-form-item>
<el-form-item label="城市"> <el-form-item label="城市" class="border-bottom pb-30">
<el-checkbox-group v-model="checkProvinceList"> <view class="flex justify-start items-center flex-wrap">
<!-- <el-checkbox :label="{code:0,name: '全国'}">全国</el-checkbox> --> <text @click="selectProvince(-1)" class="pointer mr-25 flex-grow-0"
<el-checkbox :checked="cindex == 0" v-for="(citem, cindex) in provinceData" :label="citem" :class="[checkProvinceList.length === 0 ? 'text-main selected-cate' : '']">全国
:key="cindex">{{citem.name}}</el-checkbox> </text>
</el-checkbox-group> <view v-for="(item, index) in provinceData" :key="index" class="flex-grow-0 pointer mr-25">
<text @click="selectProvince(item.code)"
:class="[checkProvinceList.includes(item.code)? 'text-main selected-cate' : '']"
v-if="index < 10 || showAllProvince">
{{ item.name }}
</text>
</view>
<text @click="showAllProvince = !showAllProvince" class="pointer mr-25">查看更多
</text>
</view>
</el-form-item> </el-form-item>
<el-form-item label="已选分类"> <el-form-item label="已选择">
<view class="tags"> <view class="tags">
<el-tag v-for="(item, index) in checkCategoryArr" :key="index">{{ item.name }}</el-tag> <el-tag v-for="(item, index) in checkCategoryArr" :key="index">{{ item.name }}</el-tag>
</view> </view>
@@ -67,14 +96,17 @@
<view class="goods-list"> <view class="goods-list">
<view v-for="(item, index) in goodsData.rows" :key="index" class="goods"> <view v-for="(item, index) in goodsData.rows" :key="index" class="goods">
<view class="goods-title">{{ item.name }}</view> <view class="goods-title">{{ item.name }}</view>
<view class="goods-stock">库存:{{item.stock}}吨</view> <view class="goods-stock mt-40">现货库存:{{ item.stock }}吨</view>
<view class="goods-address">供货地:{{item.addressStr}}</view> <view class="goods-address text-gray">供货地:{{ item.addressStr }}</view>
<view class="goods-image"> <view class="goods-image">
<image :src="item.user.businessCard.logo" mode="aspectFit"></image> <image :src="item.user.businessCard.logo" mode="aspectFit"></image>
</view> </view>
<view v-if="item.user.accountType == 1" class="goods-company">{{ item.user.person.personName }}</view> <view v-if="item.user.accountType == 1" class="goods-company">{{ item.user.person.personName }}</view>
<view v-if="item.user.accountType == 2" class="goods-company">{{ item.user.company.companyName }}</view> <view v-if="item.user.accountType == 2" class="goods-company">{{ item.user.company.companyName }}</view>
<el-button @click="vk.navigateTo('/pages/spot/goods/detail?id=' + item._id);" type="primary" plain round size="small">立即查看</el-button> <el-button @click="vk.navigateTo('/pages/spot/goods/detail?id=' + item._id);" type="primary" plain
class="empty-bg-plain-btn"
size="small">立即查看
</el-button>
</view> </view>
</view> </view>
@@ -92,23 +124,22 @@
<script> <script>
import provinces from "@/uni_modules/vk-uview-ui/libs/address/provinces.json"; import provinces from "@/uni_modules/vk-uview-ui/libs/address/provinces.json";
provinces.unshift({
code: 9999,
name: '全国'
})
export default { export default {
data() { data() {
return { return {
categoryTreeData: [], categoryTreeData: [],
provinceData: provinces, allChildCate: [],
checkCategoryList: [], checkCategoryList: [],
clickedCateIndex: -1,
provinceData: provinces,
checkProvinceList: [], checkProvinceList: [],
keyword: '', keyword: '',
goodsData: { goodsData: {
total: 0, total: 0,
rows: [] rows: []
} },
showAllProvince: false
}; };
}, },
onLoad() { onLoad() {
@@ -116,20 +147,35 @@
vk.callFunction({ vk.callFunction({
url: 'client/spot/category/pub/getTree', url: 'client/spot/category/pub/getTree',
title: '请求中...', title: '请求中...',
data: { data: {},
},
success: (data) => { success: (data) => {
this.categoryTreeData = data.rows this.categoryTreeData = data.rows
for (var i = 0; i < data.rows.length; i++) { this.allChildCate = []
this.checkCategoryList.push([]) this.categoryTreeData.forEach(item => {
} item.children.forEach(child => {
this.allChildCate.push(child)
})
})
} }
}); });
}, },
methods: { methods: {
selectCate(id) {
const index = this.checkCategoryList.indexOf(id)
if (index === -1) this.checkCategoryList.push(id)
else this.checkCategoryList.splice(index, 1)
this.search(1)
},
selectProvince(code) {
if (code === -1) this.checkProvinceList = []
else {
const index = this.checkProvinceList.indexOf(code)
if (index === -1) this.checkProvinceList.push(code)
else this.checkProvinceList.splice(index, 1)
}
this.search(1)
},
toRelease() { toRelease() {
if (!vk.getVuex('$user.userInfo.fadadaConfirm')) { if (!vk.getVuex('$user.userInfo.fadadaConfirm')) {
this.$confirm('您尚未认证, 是否前往认证?', '提示', { this.$confirm('您尚未认证, 是否前往认证?', '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
@@ -151,34 +197,16 @@
url: '/pages/spot/release/release' url: '/pages/spot/release/release'
}) })
} }
}, },
search(pageIndex) { search(pageIndex) {
const categoryIds = []
this.checkCategoryList.forEach(item => {
item.forEach(sitem => {
categoryIds.push(sitem._id)
})
})
let provinceCodes = this.checkProvinceList.map(item => item.code)
if (provinceCodes.includes(9999)) {
provinceCodes = []
}
vk.callFunction({ vk.callFunction({
url: 'client/spot/goods/pub/getList', url: 'client/spot/goods/pub/getList',
data: { data: {
pageIndex: pageIndex, pageIndex: pageIndex,
pageSize: 20, pageSize: 20,
keyword: this.keyword, keyword: this.keyword,
categoryIds: categoryIds, categoryIds: this.checkCategoryList,
provinceCodes: provinceCodes provinceCodes: this.checkProvinceList
}, },
success: (data) => { success: (data) => {
console.log('data: ', data); console.log('data: ', data);
@@ -193,18 +221,25 @@
} }
}); });
}, },
getCertUrl() {
vk.callFunction({
url: 'client/fadada.getVerifyUrl',
success: (res) => {
location.href = res.data.url
}
});
},
}, },
computed: { computed: {
checkCategoryArr() { checkCategoryArr() {
let arr = [] const arr = []
this.checkCategoryList.forEach(item => { this.allChildCate.forEach(item => {
arr.push(...item) if (this.checkCategoryList.includes(item._id)) arr.push(item)
})
this.checkProvinceList.forEach(item => {
arr.push({
...item
}) })
this.provinceData.forEach(item => {
if (this.checkProvinceList.includes(item.code)) {
arr.push(item)
}
}) })
return arr return arr
} }
@@ -239,6 +274,7 @@
.tags { .tags {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
.el-tag { .el-tag {
margin-right: 10px; margin-right: 10px;
} }
@@ -254,12 +290,12 @@
.goods { .goods {
width: 217px; width: 217px;
height: 280px;
background-color: #FFFFFF; background-color: #FFFFFF;
box-shadow: 0px 2px 6px 0px rgba(0, 0, 0, 0.05); box-shadow: 0px 2px 6px 0px rgba(0, 0, 0, 0.05);
text-align: center; text-align: center;
margin-right: 20px; margin-right: 20px;
margin-bottom: 25px; margin-bottom: 25px;
padding: 10px 20px;
&-title { &-title {
font-size: 15px; font-size: 15px;
@@ -283,6 +319,7 @@
width: 200px; width: 200px;
height: 70px; height: 70px;
margin: 0 auto; margin: 0 auto;
image { image {
width: 100%; width: 100%;
height: 100%; height: 100%;
@@ -317,4 +354,17 @@
display: flex; display: flex;
justify-content: center; justify-content: center;
} }
.selected-cate {
border-bottom: 2px solid #BD3124;
line-height: 40rpx;
}
.child-cate {
background-color: #DB8382;
color: white;
margin-top: 10rpx;
border-radius: 15rpx;
padding: 0 20rpx;
}
</style> </style>
+112
View File
@@ -0,0 +1,112 @@
<template>
<vk-data-form ref="form1" v-model="form1.data" :action="form1.props.action" :columns="form1.props.columns"
:footer-show="false"
:before-action="form1.props.beforeAction" :rules="form1.props.rules"
:form-type="form1.props.formType"
:loading.sync="form1.props.loading" :auto-close="true" label-width="140px"
@success="onFormSuccess1">
</vk-data-form>
</template>
<script>
import {IdCard} from "@icon-park/vue";
import _ from "lodash";
export default {
name: "manageList",
components: {IdCard},
props: {
value: {
type: Object,
default: () => {
return {}
}
},
},
data() {
return {
form1: {
// 表单请求数据,此处可以设置默认值
data: {
person: {},
company: {},
manager: {},
fadadaConfirm: false,
authType: 1,
},
// 表单属性
props: {
// 表单请求地址
action: "",
// 表单字段显示规则
columns: [
{
key: "type",
title: "代理人类型",
type: "radio",
data: [
{value: 0, label: '个人'},
{value: 1, label: '法人'},
{value: 2, label: '代理人'},
]
},
{
key: "personName",
title: "代理人姓名",
type: "text"
},
{
key: "certType",
title: "证件类型",
type: "radio",
data: [
{value: 0, label: '身份证'},
{value: 1, label: '护照'},
]
},
{
key: "idCard",
title: "代理人身份证号",
type: "text"
},
{
key: "mobile",
title: "代理人电话",
type: "text"
},
{
key: "headPhotoPath",
title: "身份证正面",
type: "image",
limit: 1
},
{
key: "backgroundIdCardPath",
title: "身份证反面",
type: "image",
limit: 1
},
],
// 表单验证规则
rules: {},
// add 代表添加 update 代表修改
formType: "",
// 表单是否在请求中
loading: false,
// 是否显示表单1 的弹窗
show: false
}
},
}
},
methods: {},
watch: {
"form1.data"(val) {
this.$emit('input', val)
console.log("this.$emit('input', val.data)");
}
}
}
</script>
+184 -48
View File
@@ -2,36 +2,71 @@
<view> <view>
<el-card> <el-card>
<div slot="header" class="clearfix"> <div slot="header" class="clearfix">
<span v-if="vk.getVuex('$user.userInfo.accountType') === 1">个人认证</span> <div class="flex justify-between items-center text-main">
<span v-if="vk.getVuex('$user.userInfo.accountType') === 2">企业认证</span> <div class="flex justify-start items-center">
<id-card theme="outline" size="24" fill="#a92924" strokeLinecap="square" style="height: 24px"/>
<span class="text-40" v-if="vk.getVuex('$user.userInfo.accountType') === 1">个人认证</span>
<span class="text-40" v-if="vk.getVuex('$user.userInfo.accountType') === 2">企业认证</span>
<div class="ml-20 flex justify-start items-center" v-if="!form1.data.fadadaConfirm">
<info theme="outline" size="18" fill="#a92924" strokeLinecap="square" style="height: 18px"/>
<span v-if="vk.getVuex('$user.userInfo.accountType') === 1">您还未提交您的个人资料</span>
<span v-if="vk.getVuex('$user.userInfo.accountType') === 2">您还未提交您的企业资料</span>
</div>
</div>
<el-button type="primary" plain class="empty-bg-plain-btn" size="small">制作我的名片</el-button>
</div>
</div>
<vk-data-form ref="form1" v-model="form1.data" :action="form1.props.action" :columns="form1.props.columns"
:footer-show="false"
:before-action="form1.props.beforeAction" :rules="form1.props.rules"
:form-type="form1.props.formType"
:loading.sync="form1.props.loading" :auto-close="true" label-width="140px"
@success="onFormSuccess1">
<template v-slot:toFadada="{form, keyName}">
<el-button @click="getCertUrl" type="primary" size="small">去认证</el-button>
</template>
<template v-slot:accountAuth="{form, keyName}">
<div>
<p>请用个人账户向以下账户转账0.10元。请备注:账号认证,平台将7个工作日内退回原账户。</p>
<div>
<span>户名:金久信</span>
<span class="ml-35">开户行:中国广发银行南宁支行</span>
<span class="ml-35">账号:6222XXXXX</span>
</div>
</div>
</template>
<template v-slot:manageList="{form, keyName}">
<div class="flex justify-start items-center">
<id-card theme="outline" size="24" fill="#a92924" strokeLinecap="square" style="height: 24px"/>
<span class="text-40 mr-35">企业授权人信息</span>
<el-button type="primary" size="small" @click.native="addManage" v-if="manageList.length === 0">
添加授权人
</el-button>
</div> </div>
<vk-data-form ref="form1" v-model="form1.data" :action="form1.props.action" :columns="form1.props.columns" :footer-show="false"
:before-action="form1.props.beforeAction" :rules="form1.props.rules" :form-type="form1.props.formType"
:loading.sync="form1.props.loading" :auto-close="true" label-width="140px" @success="onFormSuccess1">
<template v-slot:fadadaConfirm="{ form, keyName }">
<view style="display: flex;">
<el-tag type="primary" v-if="form[keyName]">已认证</el-tag>
<el-tag type="info" v-if="!form[keyName]">未认证</el-tag>
<view style="margin-left: 10px;" class="">
<el-button v-if="!form[keyName]" @click="getCertUrl" type="text"
size="small">去认证</el-button>
</view>
</view>
</template> </template>
</vk-data-form> </vk-data-form>
<view v-for="(item, index) in manageList" :key="index">
<manage-list v-model="manageList[index]"/>
</view>
<el-button type="primary" @click.native="allSubmit" v-if="form1.data.authType === 2">{{
vk.getVuex('$user.userInfo.accountType') === 2 ? '提交企业认证' : '提交个人认证'
}}
</el-button>
</el-card> </el-card>
</view> </view>
</template> </template>
<script> <script>
import {IdCard, Info} from '@icon-park/vue'
import ManageList from "./manageList.vue";
var _ = require('lodash'); var _ = require('lodash');
export default { export default {
components: {ManageList, IdCard, Info},
data() { data() {
// 页面数据变量 // 页面数据变量
return { return {
manageList: [],
// 表单相关开始----------------------------------------------------------- // 表单相关开始-----------------------------------------------------------
form1: { form1: {
// 表单请求数据,此处可以设置默认值 // 表单请求数据,此处可以设置默认值
@@ -39,7 +74,8 @@
person: {}, person: {},
company: {}, company: {},
manager: {}, manager: {},
fadadaConfirm: false fadadaConfirm: false,
authType: 1,
}, },
// 表单属性 // 表单属性
props: { props: {
@@ -48,11 +84,22 @@
// 表单字段显示规则 // 表单字段显示规则
columns: [ columns: [
{ {
key: "fadadaConfirm", key: "authType", title: "认证方式", type: "radio",
title: "认证状态", data: [
type: "text", {value: 1, label: "法大大接口认证"},
{value: 2, label: "后台审核认证"},
],
showRule: ({fadadaConfirm}) => {
return fadadaConfirm
},
},
{
key: "toFadada", title: "认证方式", type: "html",
showLabel: false,
showRule: (formData) => {
return formData.authType === 1 && (!formData.hasOwnProperty('fadadaConfirm') || !formData.fadadaConfirm)
},
}, },
{ {
key: "person", key: "person",
title: "个人", title: "个人",
@@ -99,8 +146,13 @@
showLabel: false, showLabel: false,
showRule: (formData) => { showRule: (formData) => {
return vk.getVuex('$user.userInfo.accountType') === 2 return vk.getVuex('$user.userInfo.accountType') === 2
&& (formData.authType === 2 || (formData.hasOwnProperty('fadadaConfirm') && formData.fadadaConfirm))
}, },
columns: [{ columns: [
{
key: "", title: "", type: "group", justify: "start",
columns: [
{
key: "companyName", key: "companyName",
title: "企业名称", title: "企业名称",
type: "text", type: "text",
@@ -111,27 +163,105 @@
key: "organization", key: "organization",
title: "统一社会信用代码", title: "统一社会信用代码",
type: "text", type: "text",
readonly: true,
disabled: true
}, },
{
key: "legalName",
title: "法人",
type: "text",
readonly: true,
disabled: true
},
{
key: "legalMobile",
title: "法人电话",
type: "text",
readonly: true,
disabled: true
},
] ]
}, },
{
key: "", title: "", type: "group", justify: "start",
columns: [
{key: "addressRegion", title: "公司所在地", type: "address",},
{
key: "addressDetail",
title: "详细地址",
type: "text",
showLabel: false,
placeholder: "详细地址",
},
]
},
{
key: "mailAddress",
title: "有效通信地址",
type: "text",
placeholder: "请输入您的通信地址",
},
{
key: "contactEmail",
title: "有效邮箱地址",
type: "text",
placeholder: "请输入您的邮箱地址",
},
{
key: "", title: "", type: "group", justify: "start",
columns: [
{
key: "companyAccount",
title: "对公账号",
type: "text",
placeholder: "请输入对公账号",
},
{
key: "companyBankName",
title: "开户行",
type: "text",
placeholder: "请输入开户行",
},
]
},
{
key: "", title: "", type: "group", justify: "start",
columns: [
{
key: "personAccount",
title: "个人账号",
type: "text",
placeholder: "请输入个人账号",
},
{
key: "personBankName",
title: "个人开户行",
type: "text",
placeholder: "请输入个人开户行",
},
]
},
{key: "accountName", title: "户名", type: "text", placeholder: "请输入户名",},
{
key: "", title: "", type: "group", justify: "start",
columns: [
{key: "organizationPath", title: "上传营业执照", type: "image", limit: 1},
{key: "businessType", title: "经营类目", type: "text"},
]
},
{
key: "", title: "", type: "group", justify: "start",
columns: [
{key: "invoiceInfo", title: "上传开票资料", type: "image", limit: 1},
{
key: "taxType", title: "", type: "radio", showLabel: false,
data: [
{value: "一般纳税人", label: "一般纳税人"},
{value: "小规模纳税人", label: "小规模纳税人"},
{value: "其他", label: "其他"},
],
},
]
},
{key: "taxImage", title: "纳税人资格", type: "image", limit: 1},
],
},
{
key: "accountAuth", title: "平台交易账号认证", type: "html", showRule: (formData) => {
return vk.getVuex('$user.userInfo.accountType') === 2
&& (formData.authType === 2 || (formData.hasOwnProperty('fadadaConfirm') && formData.fadadaConfirm))
},
},
{
key: "manageList", title: "", type: "html", showLabel: false, showRule: (formData) => {
return vk.getVuex('$user.userInfo.accountType') === 2
&& (formData.authType === 2 || (formData.hasOwnProperty('fadadaConfirm') && formData.fadadaConfirm))
},
},
{ {
key: "manager", key: "manager",
title: "代理人", title: "代理人",
@@ -218,7 +348,6 @@
// }, // },
], ],
// 表单验证规则 // 表单验证规则
rules: { rules: {
@@ -260,11 +389,11 @@
// 是否显示表单1 的弹窗 // 是否显示表单1 的弹窗
show: false, show: false,
beforeAction: (formData) => { beforeAction: (formData) => {
const newFormData = _.pick(formData, ['contactWechat', 'contactEmail', // const newFormData = _.pick(formData, ['contactWechat', 'contactEmail',
'contactWechatImage', 'contactQq', 'mailAddress' // 'contactWechatImage', 'contactQq', 'mailAddress'
]) // ])
vk.userCenter.updateUser({ vk.userCenter.updateUser({
data: newFormData, data: {...formData, ...{manager: this.manageList[0]}},
success: (data) => { success: (data) => {
// 成功后的逻辑 // 成功后的逻辑
@@ -290,7 +419,8 @@
'fadadaConfirm', 'person', 'company', 'manager', 'contactWechat', 'fadadaConfirm', 'person', 'company', 'manager', 'contactWechat',
'contactEmail', 'contactWechatImage', 'contactQq', 'mailAddress' 'contactEmail', 'contactWechatImage', 'contactQq', 'mailAddress'
]) ])
// if (!this.form1.data.hasOwnProperty('fadadaConfirm') || !this.form1.data.fadadaConfirm) this.form1.data.authType = 1
// this.form1.data.authType = 2
if (data.userInfo.fadadaConfirm && data.userInfo.businessCard == null) { if (data.userInfo.fadadaConfirm && data.userInfo.businessCard == null) {
this.$confirm('请完善名片信息', '提示', { this.$confirm('请完善名片信息', '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
@@ -302,7 +432,6 @@
} }
} }
}); });
}, },
onFormSuccess1() { onFormSuccess1() {
console.log(123); console.log(123);
@@ -314,6 +443,13 @@
location.href = res.data.url location.href = res.data.url
} }
}); });
},
addManage() {
this.manageList.push({})
},
allSubmit() {
// this.form1.data.manager = this.manageList[0]
this.$refs.form1.submitForm()
} }
} }
} }
+3 -3
View File
@@ -23,9 +23,9 @@
</el-menu> </el-menu>
</el-col> </el-col>
<el-col :span="18"> <el-col :span="18">
<personal v-if="currMenu == 'fadada'"></personal> <personal v-if="currMenu === 'fadada'"></personal>
<business-card v-else-if="currMenu == 'business-card'"></business-card> <business-card v-else-if="currMenu === 'business-card'"></business-card>
<seal v-else-if="currMenu == 'seal'"></seal> <seal v-else-if="currMenu === 'seal'"></seal>
</el-col> </el-col>
</el-row> </el-row>
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

File diff suppressed because one or more lines are too long
@@ -1,9 +0,0 @@
{
"name": "uni-config-center",
"version": "0.0.3",
"description": "配置中心",
"main": "index.js",
"keywords": [],
"author": "DCloud",
"license": "Apache-2.0"
}
@@ -1,70 +0,0 @@
{
"passwordSecret": "passwordSecret-demo",
"tokenSecret": "tokenSecret-demo",
"tokenExpiresIn": 604800,
"tokenExpiresThreshold": 259200,
"tokenMaxLimit": 10,
"passwordErrorLimit": 6,
"bindTokenToDevice": false,
"passwordErrorRetryTime": 3600,
"autoSetInviteCode": true,
"forceInviteCode": false,
"preferedAppPlatform": "app-plus",
"preferedWebPlatform": "h5",
"removeDcloudAppid": false,
"app-plus": {
"tokenExpiresIn": 604800,
"oauth": {
"weixin": {
"appid": "",
"appsecret": ""
}
}
},
"mp-weixin": {
"oauth": {
"weixin": {
"appid": "",
"appsecret": ""
}
}
},
"h5-weixin": {
"oauth": {
"weixin": {
"appid": "",
"appsecret": ""
}
}
},
"mp-alipay": {
"oauth": {
"alipay": {
"appid": "",
"privateKey": ""
}
}
},
"mp-qq": {
"oauth": {
"qq": {
"appid": "",
"appsecret": ""
}
}
},
"service": {
"sms": {
"name": "重要",
"codeExpiresIn": 180,
"smsKey": "",
"smsSecret": "",
"templateId": ""
},
"univerify": {
"appid": "",
"apiKey": "",
"apiSecret": ""
}
}
}
@@ -1,3 +0,0 @@
-----BEGIN CERTIFICATE-----
证书内容
-----END CERTIFICATE-----
@@ -1,15 +0,0 @@
-----BEGIN CERTIFICATE-----
证书内容
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
证书内容
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
证书内容
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
证书内容
-----END CERTIFICATE-----
@@ -1,3 +0,0 @@
-----BEGIN CERTIFICATE-----
证书内容
-----END CERTIFICATE-----
@@ -1,5 +0,0 @@
### 文件名:
#### 1、`alipayCertPublicKey_RSA2.crt`
#### 2、`alipayRootCert.crt`
#### 3、`appCertPublicKey.crt`
![证书位置](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-cf0c5e69-620c-4f3c-84ab-f4619262939f/61c1582a-2ca7-43d3-92eb-b82136cc583f.png)
@@ -1,128 +0,0 @@
const fs = require('fs');
const path = require('path');
module.exports = {
/**
* 统一支付回调地址,格式为 "服务空间SpaceID":"URL化完整地址"
* 这里的本地开发并不是指 http://localhost:8080/ 的地址,而是另外一个服务空间的ULR化地址(如果你本地开发和线上环境共用同一个服务空间则只需要填线上环境的即可)
* 回调的云函数地址,建议填 /http/vk-pay,因为vk-pay云函数已经写好了回调处理的逻辑,否则你需要自己写全部的回调逻辑。
* 其中vk-pay是可以改名的,只需要修改 uniCloud/cloudfunctions/vk-pay/package.json 文件中的 "path": "/http/vk-pay", 把 /http/vk-pay 改成 /http/xxxx 即可(需要重新上传云函数vk-pay)。
*/
"notifyUrl": {
// 本地开发环境,如果你本地开发和线上环境共用同一个服务空间则只需要填线上环境的即可
"mp-0737e52b-fffa-4223-bcdf-d4ad3d9968a5": "https://mp-0737e52b-fffa-4223-bcdf-d4ad3d9968a5.bspapp.com/http/vk-pay",
// 线上正式环境
"mp-0737e52b-fffa-4223-bcdf-d4ad3d9968a5": "https://fc-mp-0737e52b-fffa-4223-bcdf-d4ad3d9968a5.next.bspapp.com/http/vk-pay"
},
/**
* 微信
* 公共参数说明
* appId 微信后台的appId
* secret 微信后台的secret
* mchId 微信支付的商户id
* key 微信支付的api密钥(V2版本)
* pfx 微信支付的p12证书(退款需要)
*/
"wxpay": {
// 微信 - 小程序支付(微信支付申请JSAPI支付)
"mp-weixin": {
"appId": "",
"secret": "",
"mchId": "",
"key": "",
"pfx": fs.readFileSync(__dirname + '/wxpay/wxpay.p12')
},
// 微信 - APP支付(微信支付申请APP支付)
"app-plus": {
"appId": "",
"secret": "",
"mchId": "",
"key": "",
"pfx": fs.readFileSync(__dirname + '/wxpay/wxpay.p12')
},
// 微信 - H5电脑网站二维码支付(微信支付申请Native支付)
"h5": {
"appId": "",
"secret": "",
"mchId": "",
"key": "",
"pfx": fs.readFileSync(__dirname + '/wxpay/wxpay.p12')
},
// 微信 - 公众号支付(微信支付申请JSAPI支付)
"h5-weixin": {
"appId": "",
"secret": "",
"mchId": "",
"key": "",
"pfx": fs.readFileSync(__dirname + '/wxpay/wxpay.p12')
},
// 微信 - 手机外部浏览器H5支付(微信支付申请H5支付)
"mweb": {
"appId": "",
"secret": "",
"mchId": "",
"key": "",
"pfx": fs.readFileSync(__dirname + '/wxpay/wxpay.p12'),
// 场景信息,必填
"sceneInfo": {
"h5_info": {
"type": "Wap", // 此值固定Wap
"wap_url": "https://www.xxxxxx.com", // 你的H5首页地址,必须和你发起支付的页面的域名一致。
"wap_name": "网站名称", // 你的H5网站名称
}
}
}
},
/**
* 支付宝(证书记得选java版本)
* 公共参数说明
* mchId 支付宝商户id 2088开头的那个(此参数可以去除)
* appId 支付宝开放平台的应用appId
* secret 支付宝开放平台的应用secret
* privateKey 应用私钥
* alipayPublicCertPath 支付宝公钥证书路径地址 与之对应的 alipayPublicCertContent 为支付宝公钥证书内容(值可以是字符串也可以是Buffer)
* alipayRootCertPath 支付宝根证书路径地址 与之对应的 alipayRootCertContent 为支付宝根证书内容(值可以是字符串也可以是Buffer)
* appCertPath 应用证书路径地址 与之对应的 appCertPathContent 为应用证书内容(值可以是字符串也可以是Buffer)
* sandbox 是否沙箱模式 true 沙箱模式 false 正常模式
*/
"alipay": {
// 支付宝 - 小程序支付配置
"mp-alipay": {
"mchId": "",
"appId": "",
"privateKey": "",
"alipayPublicCertPath": path.join(__dirname, 'alipay/alipayCertPublicKey_RSA2.crt'),
"alipayRootCertPath": path.join(__dirname, 'alipay/alipayRootCert.crt'),
"appCertPath": path.join(__dirname, 'alipay/appCertPublicKey.crt'),
"sandbox": false
},
// 支付宝 - APP支付配置
"app-plus": {
"mchId": "",
"appId": "",
"privateKey": "",
"alipayPublicCertPath": path.join(__dirname, 'alipay/alipayCertPublicKey_RSA2.crt'),
"alipayRootCertPath": path.join(__dirname, 'alipay/alipayRootCert.crt'),
"appCertPath": path.join(__dirname, 'alipay/appCertPublicKey.crt'),
"sandbox": false
},
// 支付宝 - H5支付配置(包含:网站二维码、手机H5,需申请支付宝当面付接口权限)
"h5": {
"mchId": "",
"appId": "",
"privateKey": "",
"alipayPublicCertPath": path.join(__dirname, 'alipay/alipayCertPublicKey_RSA2.crt'),
"alipayRootCertPath": path.join(__dirname, 'alipay/alipayRootCert.crt'),
"appCertPath": path.join(__dirname, 'alipay/appCertPublicKey.crt'),
"sandbox": false
},
// 支付宝 - 转账到支付宝等资金转出接口,其中 appCertSn 和 alipayRootCertSn 通过工具获取
"transfer": {
"mchId": "",
"appId": "",
"privateKey": "",
"appCertSn": "", // 应用证书的序列号
"alipayRootCertSn": "", // 支付宝根证书的序列号
"sandbox": false
}
}
}
@@ -1,3 +0,0 @@
### 文件名:
#### 1、`wxpay.p12`
![证书位置](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-cf0c5e69-620c-4f3c-84ab-f4619262939f/61c1582a-2ca7-43d3-92eb-b82136cc583f.png)
@@ -1,141 +0,0 @@
var uniIdConfig;
var uniPayConfig;
try {
uniIdConfig = require('../uni-id/config.json');
} catch(err) {
console.error("配置文件:uniCloud/cloudfunctions/common/uni-config-center/uni-id/config.json 编译错误,请检查!↓↓↓请查看下方的错误提示↓↓↓", err.name, err.message, err);
throw new Error("配置文件:uniCloud/cloudfunctions/common/uni-config-center/uni-id/config.json 编译错误,请检查!↑↑↑请查看上方的错误提示↑↑↑");
}
try {
uniPayConfig = require('../uni-pay/config.js');
} catch(err) {
console.error("配置文件:uniCloud/cloudfunctions/common/uni-config-center/uni-pay/config.js 编译错误,请检查!↓↓↓请查看下方的错误提示↓↓↓", err.name, err.message, err);
throw new Error("配置文件:uniCloud/cloudfunctions/common/uni-config-center/uni-pay/config.js 编译错误,请检查!↑↑↑请查看上方的错误提示↑↑↑");
}
module.exports = {
"uni": uniIdConfig,
"uni-pay": uniPayConfig,
"vk": {
"system": {
// 若serviceShutdow:true,则所有云函数无法访问(适用于需要临时关闭后端服务的情况,如迁移数据)
// 注意:本地调试时,需要重新启动本地服务才能生效。
"serviceShutdown": false,
"serviceShutdownDescription": "系统维护中,预计2小时恢复!",
// 云函数默认时区(中国为8)
"targetTimezone": 8
},
// 加密的密钥
"crypto": {
"aes": "dad4c0cb88c7d005bc5e844b8e79a9f0dad4c0cb88c7d005bc5e844b8e79a9f0", // 对称加密的密钥,建议长度在64位-128位(此处建议修改成自己的密钥)
},
// 当 context 内的下面值为空时,赋予默认的值(主要用于解决云函数 URL 后的默认 APPID 问题。
"context": {
"APPID": "", // 默认 dcloud_appid
"PLATFORM": "h5", // 可选项 h5、mp-weixin、app-plus、mp-alipay
"LOCALE": "zh-Hans", // 默认语言
"CLIENTIP":"127.0.0.1", // 默认客户端IP(主要用于解决本地调试无ip的问题)
},
"service": {
// 邮箱发送服务
"email": {
"codeExpiresIn": 180, // 邮件验证码有效期(单位秒)
// qq邮箱参数配置
"qq": {
"host": "smtp.qq.com",
"port": 465,
"secure": true,
"auth": {
"user": "你的邮箱@qq.com",
"pass": "邮箱授权码"
}
},
// 163邮箱配置
"163":{
"host": "smtp.163.com",
"port": 465,
"secure": true,
"auth": {
"user": "",
"pass": ""
}
}
},
// 日志服务
"log": {
// 用户登录日志
"login": {
"status": true // 是否开启用户登录日志
}
},
// 短信服务
"sms": {
// 阿里云短信服务
"aliyun": {
"enable": true, // 是否使用阿里云短信代替unicloud短信发送短信验证码
"accessKeyId": "LTAI4FyY6A493kVYn5ezyAw6", // 短信密钥key
"accessKeySecret": "776MyYZfRb8cQHTe5ji0jBVu1rHfa9", // 短信密钥secret
"signName": "亿利通", // 默认签名
"templateCode": {
"verifyCode": "SMS_210078693" // 验证码短信模板 - 配合uni-id需要
}
}
},
// 开放平台api
"openapi": {
// 百度开放平台 (主要用于身份证识别,营业执照识别等API)
// API Key申请地址:https://cloud.baidu.com/doc/OCR/s/rk3h7xzck 点击右上角注册
"baidu": {
"appid": "", // 对应的API Key
"appsecret": "" // 对应的Secret Key
}
}
},
"db": {
"unicloud": {
"maxLimit": 1000, // 最大limit限制(目前腾讯云最大1000,阿里云最大1000)
"cancelAddTime": false, // 取消 vk.baseDao.add 时自动生成 _add_time 和 _add_time_str
"cancelAddTimeStr": false, // 仅取消 vk.baseDao.add 时自动生成的 _add_time_str,若已设置 cancelAddTime 为true,则 cancelAddTimeStr 也会强制为true
"getTableData": {
"sortArr": [{ "name": "_add_time", "type": "desc" }], // vk.baseDao.getTableData 默认排序规则 vk.db.unicloud.getTableData.sortArr
}
}
},
// 其他小程序的密钥 当需要多个小程序绑定同一服务空间,并调用小程序服务端API时需要填写 暂只支持微信小程序
"oauth": {
// 微信小程序
"weixin": {
// 密钥列表
"list": [
{ "appid": "", "appsecret": "" },
{ "appid": "", "appsecret": "" }
]
},
// 支付宝
"alipay": {
// 密钥列表
"list": [
{ "appid": "", "privateKey": "" },
{ "appid": "", "privateKey": "" }
]
},
// qq
"qq": {
// 密钥列表
"list": [
{ "appid": "", "appsecret": "" },
{ "appid": "", "appsecret": "" }
]
},
// 抖音
"toutiao": {
// 密钥列表
"list": [
{ "appid": "", "appsecret": "" },
{ "appid": "", "appsecret": "" }
]
}
}
}
};
@@ -1,73 +0,0 @@
## 重要说明
#### 框架目前的配置(不含`uni-id`)在 `cloudfunctions/common/uni-config-center/vk-unicloud/index.js` 中配置
#### `uni-id` 的配置是在 `cloudfunctions/common/uni-config-center/uni-id/config.json` 中配置
#### 每次修改完 配置 中的内容后如果不生效,则尝试以下操作。
```
1. 上传 uni-config-center 公共模块
2. 重新上传 router 云函数
如果是连接本地云函数,则需要重启本地服务才会生效。(hbx的原因)
```
### 由于`uni-id`配置无法打注释,故下方为`uni-id`配置的介绍
```js
{
"passwordSecret": "passwordSecret-demo",// 加密密码所用的密钥,修改会导致所用户之前的密码失效。如一定要修改,请查看https://uniapp.dcloud.io/uniCloud/uni-id?id=modifysecret
"tokenSecret": "tokenSecret-demo", // 生成token所用的密钥,修改会导致所有用户之前的token失效。
"tokenExpiresIn": 604800, // 全平台token过期时间,未指定过期时间的平台会使用此值,604800代表7天
"tokenExpiresThreshold": 3600, // 新增于uni-id 1.1.7版本,checkToken时如果token有效期小于此值则自动获取新token,如果不配置此参数则不开启自动获取新token功能
"passwordErrorLimit": 6, // 密码错误最大重试次数
"bindTokenToDevice": false, // 是否将token和设备绑定,设置为true会进行ua校验
"passwordErrorRetryTime": 3600, // 密码错误重试次数超限之后的冻结时间
"autoSetInviteCode": true, // 是否在用户注册时自动设置邀请码
"forceInviteCode": false, // 是否强制用户注册时必填邀请码,默认为false(需要注意的是目前只有短信验证码注册才可以填写邀请码)
"app-plus": {
"tokenExpiresIn": 604800, // app端 token过期时间
"oauth" : {
// App微信登录所用到的appid、appsecret需要在微信开放平台获取,注意:不是公众平台而是开放平台
"weixin" : {
"appid" : "",
"appsecret" : ""
}
}
},
"mp-weixin": {
"oauth" : {
// 微信小程序登录所用的appid、appsecret需要在对应的小程序管理控制台获取
"weixin" : {
"appid" : "",
"appsecret" : ""
}
}
},
"mp-alipay": {
"oauth" : {
// 支付宝小程序登录用到的appid、privateKey请参考支付宝小程序的文档进行设置或者获取,https://opendocs.alipay.com/open/291/105971#LDsXr
"alipay" : {
"appid" : "",
"privateKey" : ""
}
}
},
"service": {
// unicloud短信
"sms": {
"name": "重要", // 应用名称,对应短信模版的name
"codeExpiresIn": 180, // 验证码过期时间,单位为秒,注意一定要是60的整数倍
"smsKey": "你的smsKey", // 短信密钥key,开通短信服务处可以看到 https://dev.dcloud.net.cn/uniSms
"smsSecret": "你的smsSecret", // 短信密钥secret,开通短信服务处可以看到 https://dev.dcloud.net.cn/uniSms
"templateId":"你的短信模板ID" // 短信模板ID
},
// 一键登录
"univerify": {
"appid":"your appid", // uniapp的appid
"apiKey": "your apiKey", // 一键登录的apiKey
"apiSecret": "your apiSecret" // 一键登录的apiSecret
}
}
}
```
-201
View File
@@ -1,201 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,9 +0,0 @@
{
"name": "uni-config-center",
"version": "0.0.3",
"description": "配置中心",
"main": "index.js",
"keywords": [],
"author": "DCloud",
"license": "Apache-2.0"
}
@@ -1,70 +0,0 @@
{
"passwordSecret": "passwordSecret-demo",
"tokenSecret": "tokenSecret-demo",
"tokenExpiresIn": 604800,
"tokenExpiresThreshold": 259200,
"tokenMaxLimit": 10,
"passwordErrorLimit": 6,
"bindTokenToDevice": false,
"passwordErrorRetryTime": 3600,
"autoSetInviteCode": true,
"forceInviteCode": false,
"preferedAppPlatform": "app-plus",
"preferedWebPlatform": "h5",
"removeDcloudAppid": false,
"app-plus": {
"tokenExpiresIn": 604800,
"oauth": {
"weixin": {
"appid": "",
"appsecret": ""
}
}
},
"mp-weixin": {
"oauth": {
"weixin": {
"appid": "",
"appsecret": ""
}
}
},
"h5-weixin": {
"oauth": {
"weixin": {
"appid": "",
"appsecret": ""
}
}
},
"mp-alipay": {
"oauth": {
"alipay": {
"appid": "",
"privateKey": ""
}
}
},
"mp-qq": {
"oauth": {
"qq": {
"appid": "",
"appsecret": ""
}
}
},
"service": {
"sms": {
"name": "重要",
"codeExpiresIn": 180,
"smsKey": "",
"smsSecret": "",
"templateId": ""
},
"univerify": {
"appid": "",
"apiKey": "",
"apiSecret": ""
}
}
}
@@ -1,3 +0,0 @@
-----BEGIN CERTIFICATE-----
证书内容
-----END CERTIFICATE-----
@@ -1,15 +0,0 @@
-----BEGIN CERTIFICATE-----
证书内容
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
证书内容
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
证书内容
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
证书内容
-----END CERTIFICATE-----
@@ -1,3 +0,0 @@
-----BEGIN CERTIFICATE-----
证书内容
-----END CERTIFICATE-----
@@ -1,5 +0,0 @@
### 文件名:
#### 1、`alipayCertPublicKey_RSA2.crt`
#### 2、`alipayRootCert.crt`
#### 3、`appCertPublicKey.crt`
![证书位置](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-cf0c5e69-620c-4f3c-84ab-f4619262939f/61c1582a-2ca7-43d3-92eb-b82136cc583f.png)
@@ -1,128 +0,0 @@
const fs = require('fs');
const path = require('path');
module.exports = {
/**
* 统一支付回调地址,格式为 "服务空间SpaceID":"URL化完整地址"
* 这里的本地开发并不是指 http://localhost:8080/ 的地址,而是另外一个服务空间的ULR化地址(如果你本地开发和线上环境共用同一个服务空间则只需要填线上环境的即可)
* 回调的云函数地址,建议填 /http/vk-pay,因为vk-pay云函数已经写好了回调处理的逻辑,否则你需要自己写全部的回调逻辑。
* 其中vk-pay是可以改名的,只需要修改 uniCloud/cloudfunctions/vk-pay/package.json 文件中的 "path": "/http/vk-pay", 把 /http/vk-pay 改成 /http/xxxx 即可(需要重新上传云函数vk-pay)。
*/
"notifyUrl": {
// 本地开发环境,如果你本地开发和线上环境共用同一个服务空间则只需要填线上环境的即可
"mp-0737e52b-fffa-4223-bcdf-d4ad3d9968a5": "https://mp-0737e52b-fffa-4223-bcdf-d4ad3d9968a5.bspapp.com/http/vk-pay",
// 线上正式环境
"mp-0737e52b-fffa-4223-bcdf-d4ad3d9968a5": "https://fc-mp-0737e52b-fffa-4223-bcdf-d4ad3d9968a5.next.bspapp.com/http/vk-pay"
},
/**
* 微信
* 公共参数说明
* appId 微信后台的appId
* secret 微信后台的secret
* mchId 微信支付的商户id
* key 微信支付的api密钥(V2版本)
* pfx 微信支付的p12证书(退款需要)
*/
"wxpay": {
// 微信 - 小程序支付(微信支付申请JSAPI支付)
"mp-weixin": {
"appId": "",
"secret": "",
"mchId": "",
"key": "",
"pfx": fs.readFileSync(__dirname + '/wxpay/wxpay.p12')
},
// 微信 - APP支付(微信支付申请APP支付)
"app-plus": {
"appId": "",
"secret": "",
"mchId": "",
"key": "",
"pfx": fs.readFileSync(__dirname + '/wxpay/wxpay.p12')
},
// 微信 - H5电脑网站二维码支付(微信支付申请Native支付)
"h5": {
"appId": "",
"secret": "",
"mchId": "",
"key": "",
"pfx": fs.readFileSync(__dirname + '/wxpay/wxpay.p12')
},
// 微信 - 公众号支付(微信支付申请JSAPI支付)
"h5-weixin": {
"appId": "",
"secret": "",
"mchId": "",
"key": "",
"pfx": fs.readFileSync(__dirname + '/wxpay/wxpay.p12')
},
// 微信 - 手机外部浏览器H5支付(微信支付申请H5支付)
"mweb": {
"appId": "",
"secret": "",
"mchId": "",
"key": "",
"pfx": fs.readFileSync(__dirname + '/wxpay/wxpay.p12'),
// 场景信息,必填
"sceneInfo": {
"h5_info": {
"type": "Wap", // 此值固定Wap
"wap_url": "https://www.xxxxxx.com", // 你的H5首页地址,必须和你发起支付的页面的域名一致。
"wap_name": "网站名称", // 你的H5网站名称
}
}
}
},
/**
* 支付宝(证书记得选java版本)
* 公共参数说明
* mchId 支付宝商户id 2088开头的那个(此参数可以去除)
* appId 支付宝开放平台的应用appId
* secret 支付宝开放平台的应用secret
* privateKey 应用私钥
* alipayPublicCertPath 支付宝公钥证书路径地址 与之对应的 alipayPublicCertContent 为支付宝公钥证书内容(值可以是字符串也可以是Buffer)
* alipayRootCertPath 支付宝根证书路径地址 与之对应的 alipayRootCertContent 为支付宝根证书内容(值可以是字符串也可以是Buffer)
* appCertPath 应用证书路径地址 与之对应的 appCertPathContent 为应用证书内容(值可以是字符串也可以是Buffer)
* sandbox 是否沙箱模式 true 沙箱模式 false 正常模式
*/
"alipay": {
// 支付宝 - 小程序支付配置
"mp-alipay": {
"mchId": "",
"appId": "",
"privateKey": "",
"alipayPublicCertPath": path.join(__dirname, 'alipay/alipayCertPublicKey_RSA2.crt'),
"alipayRootCertPath": path.join(__dirname, 'alipay/alipayRootCert.crt'),
"appCertPath": path.join(__dirname, 'alipay/appCertPublicKey.crt'),
"sandbox": false
},
// 支付宝 - APP支付配置
"app-plus": {
"mchId": "",
"appId": "",
"privateKey": "",
"alipayPublicCertPath": path.join(__dirname, 'alipay/alipayCertPublicKey_RSA2.crt'),
"alipayRootCertPath": path.join(__dirname, 'alipay/alipayRootCert.crt'),
"appCertPath": path.join(__dirname, 'alipay/appCertPublicKey.crt'),
"sandbox": false
},
// 支付宝 - H5支付配置(包含:网站二维码、手机H5,需申请支付宝当面付接口权限)
"h5": {
"mchId": "",
"appId": "",
"privateKey": "",
"alipayPublicCertPath": path.join(__dirname, 'alipay/alipayCertPublicKey_RSA2.crt'),
"alipayRootCertPath": path.join(__dirname, 'alipay/alipayRootCert.crt'),
"appCertPath": path.join(__dirname, 'alipay/appCertPublicKey.crt'),
"sandbox": false
},
// 支付宝 - 转账到支付宝等资金转出接口,其中 appCertSn 和 alipayRootCertSn 通过工具获取
"transfer": {
"mchId": "",
"appId": "",
"privateKey": "",
"appCertSn": "", // 应用证书的序列号
"alipayRootCertSn": "", // 支付宝根证书的序列号
"sandbox": false
}
}
}
@@ -1,3 +0,0 @@
### 文件名:
#### 1、`wxpay.p12`
![证书位置](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-cf0c5e69-620c-4f3c-84ab-f4619262939f/61c1582a-2ca7-43d3-92eb-b82136cc583f.png)
@@ -1,141 +0,0 @@
var uniIdConfig;
var uniPayConfig;
try {
uniIdConfig = require('../uni-id/config.json');
} catch(err) {
console.error("配置文件:uniCloud/cloudfunctions/common/uni-config-center/uni-id/config.json 编译错误,请检查!↓↓↓请查看下方的错误提示↓↓↓", err.name, err.message, err);
throw new Error("配置文件:uniCloud/cloudfunctions/common/uni-config-center/uni-id/config.json 编译错误,请检查!↑↑↑请查看上方的错误提示↑↑↑");
}
try {
uniPayConfig = require('../uni-pay/config.js');
} catch(err) {
console.error("配置文件:uniCloud/cloudfunctions/common/uni-config-center/uni-pay/config.js 编译错误,请检查!↓↓↓请查看下方的错误提示↓↓↓", err.name, err.message, err);
throw new Error("配置文件:uniCloud/cloudfunctions/common/uni-config-center/uni-pay/config.js 编译错误,请检查!↑↑↑请查看上方的错误提示↑↑↑");
}
module.exports = {
"uni": uniIdConfig,
"uni-pay": uniPayConfig,
"vk": {
"system": {
// 若serviceShutdow:true,则所有云函数无法访问(适用于需要临时关闭后端服务的情况,如迁移数据)
// 注意:本地调试时,需要重新启动本地服务才能生效。
"serviceShutdown": false,
"serviceShutdownDescription": "系统维护中,预计2小时恢复!",
// 云函数默认时区(中国为8)
"targetTimezone": 8
},
// 加密的密钥
"crypto": {
"aes": "dad4c0cb88c7d005bc5e844b8e79a9f0dad4c0cb88c7d005bc5e844b8e79a9f0", // 对称加密的密钥,建议长度在64位-128位(此处建议修改成自己的密钥)
},
// 当 context 内的下面值为空时,赋予默认的值(主要用于解决云函数 URL 后的默认 APPID 问题。
"context": {
"APPID": "", // 默认 dcloud_appid
"PLATFORM": "h5", // 可选项 h5、mp-weixin、app-plus、mp-alipay
"LOCALE": "zh-Hans", // 默认语言
"CLIENTIP":"127.0.0.1", // 默认客户端IP(主要用于解决本地调试无ip的问题)
},
"service": {
// 邮箱发送服务
"email": {
"codeExpiresIn": 180, // 邮件验证码有效期(单位秒)
// qq邮箱参数配置
"qq": {
"host": "smtp.qq.com",
"port": 465,
"secure": true,
"auth": {
"user": "你的邮箱@qq.com",
"pass": "邮箱授权码"
}
},
// 163邮箱配置
"163":{
"host": "smtp.163.com",
"port": 465,
"secure": true,
"auth": {
"user": "",
"pass": ""
}
}
},
// 日志服务
"log": {
// 用户登录日志
"login": {
"status": true // 是否开启用户登录日志
}
},
// 短信服务
"sms": {
// 阿里云短信服务
"aliyun": {
"enable": true, // 是否使用阿里云短信代替unicloud短信发送短信验证码
"accessKeyId": "LTAI4FyY6A493kVYn5ezyAw6", // 短信密钥key
"accessKeySecret": "776MyYZfRb8cQHTe5ji0jBVu1rHfa9", // 短信密钥secret
"signName": "亿利通", // 默认签名
"templateCode": {
"verifyCode": "SMS_210078693" // 验证码短信模板 - 配合uni-id需要
}
}
},
// 开放平台api
"openapi": {
// 百度开放平台 (主要用于身份证识别,营业执照识别等API)
// API Key申请地址:https://cloud.baidu.com/doc/OCR/s/rk3h7xzck 点击右上角注册
"baidu": {
"appid": "", // 对应的API Key
"appsecret": "" // 对应的Secret Key
}
}
},
"db": {
"unicloud": {
"maxLimit": 1000, // 最大limit限制(目前腾讯云最大1000,阿里云最大1000)
"cancelAddTime": false, // 取消 vk.baseDao.add 时自动生成 _add_time 和 _add_time_str
"cancelAddTimeStr": false, // 仅取消 vk.baseDao.add 时自动生成的 _add_time_str,若已设置 cancelAddTime 为true,则 cancelAddTimeStr 也会强制为true
"getTableData": {
"sortArr": [{ "name": "_add_time", "type": "desc" }], // vk.baseDao.getTableData 默认排序规则 vk.db.unicloud.getTableData.sortArr
}
}
},
// 其他小程序的密钥 当需要多个小程序绑定同一服务空间,并调用小程序服务端API时需要填写 暂只支持微信小程序
"oauth": {
// 微信小程序
"weixin": {
// 密钥列表
"list": [
{ "appid": "", "appsecret": "" },
{ "appid": "", "appsecret": "" }
]
},
// 支付宝
"alipay": {
// 密钥列表
"list": [
{ "appid": "", "privateKey": "" },
{ "appid": "", "privateKey": "" }
]
},
// qq
"qq": {
// 密钥列表
"list": [
{ "appid": "", "appsecret": "" },
{ "appid": "", "appsecret": "" }
]
},
// 抖音
"toutiao": {
// 密钥列表
"list": [
{ "appid": "", "appsecret": "" },
{ "appid": "", "appsecret": "" }
]
}
}
}
};
@@ -1,73 +0,0 @@
## 重要说明
#### 框架目前的配置(不含`uni-id`)在 `cloudfunctions/common/uni-config-center/vk-unicloud/index.js` 中配置
#### `uni-id` 的配置是在 `cloudfunctions/common/uni-config-center/uni-id/config.json` 中配置
#### 每次修改完 配置 中的内容后如果不生效,则尝试以下操作。
```
1. 上传 uni-config-center 公共模块
2. 重新上传 router 云函数
如果是连接本地云函数,则需要重启本地服务才会生效。(hbx的原因)
```
### 由于`uni-id`配置无法打注释,故下方为`uni-id`配置的介绍
```js
{
"passwordSecret": "passwordSecret-demo",// 加密密码所用的密钥,修改会导致所用户之前的密码失效。如一定要修改,请查看https://uniapp.dcloud.io/uniCloud/uni-id?id=modifysecret
"tokenSecret": "tokenSecret-demo", // 生成token所用的密钥,修改会导致所有用户之前的token失效。
"tokenExpiresIn": 604800, // 全平台token过期时间,未指定过期时间的平台会使用此值,604800代表7天
"tokenExpiresThreshold": 3600, // 新增于uni-id 1.1.7版本,checkToken时如果token有效期小于此值则自动获取新token,如果不配置此参数则不开启自动获取新token功能
"passwordErrorLimit": 6, // 密码错误最大重试次数
"bindTokenToDevice": false, // 是否将token和设备绑定,设置为true会进行ua校验
"passwordErrorRetryTime": 3600, // 密码错误重试次数超限之后的冻结时间
"autoSetInviteCode": true, // 是否在用户注册时自动设置邀请码
"forceInviteCode": false, // 是否强制用户注册时必填邀请码,默认为false(需要注意的是目前只有短信验证码注册才可以填写邀请码)
"app-plus": {
"tokenExpiresIn": 604800, // app端 token过期时间
"oauth" : {
// App微信登录所用到的appid、appsecret需要在微信开放平台获取,注意:不是公众平台而是开放平台
"weixin" : {
"appid" : "",
"appsecret" : ""
}
}
},
"mp-weixin": {
"oauth" : {
// 微信小程序登录所用的appid、appsecret需要在对应的小程序管理控制台获取
"weixin" : {
"appid" : "",
"appsecret" : ""
}
}
},
"mp-alipay": {
"oauth" : {
// 支付宝小程序登录用到的appid、privateKey请参考支付宝小程序的文档进行设置或者获取,https://opendocs.alipay.com/open/291/105971#LDsXr
"alipay" : {
"appid" : "",
"privateKey" : ""
}
}
},
"service": {
// unicloud短信
"sms": {
"name": "重要", // 应用名称,对应短信模版的name
"codeExpiresIn": 180, // 验证码过期时间,单位为秒,注意一定要是60的整数倍
"smsKey": "你的smsKey", // 短信密钥key,开通短信服务处可以看到 https://dev.dcloud.net.cn/uniSms
"smsSecret": "你的smsSecret", // 短信密钥secret,开通短信服务处可以看到 https://dev.dcloud.net.cn/uniSms
"templateId":"你的短信模板ID" // 短信模板ID
},
// 一键登录
"univerify": {
"appid":"your appid", // uniapp的appid
"apiKey": "your apiKey", // 一键登录的apiKey
"apiSecret": "your apiSecret" // 一键登录的apiSecret
}
}
}
```
-16
View File
@@ -1,16 +0,0 @@
{
"name": "uni-id",
"version": "3.3.28",
"description": "uni-id for uniCloud",
"main": "index.js",
"homepage": "https://uniapp.dcloud.io/uniCloud/uni-id",
"repository": {
"type": "git",
"url": "git+https://gitee.com/dcloud/uni-id.git"
},
"author": "",
"license": "Apache-2.0",
"dependencies": {
"uni-config-center": "file:../../../../../uni-config-center/uniCloud/cloudfunctions/common/uni-config-center"
}
}
@@ -1,201 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
File diff suppressed because one or more lines are too long
@@ -1,16 +0,0 @@
{
"name": "vk-unicloud",
"version": "2.15.3",
"description": "【云函数端SDK】VK云函数路由模式uniCloud开发框架,在router目录下执行 npm i vk-unicloud 进行安装和升级",
"main": "index.js",
"homepage": "https://gitee.com/vk-uni/vk-uni-cloud-router.git",
"repository": {
"type": "git",
"url": "git+https://gitee.com/vk-uni/vk-uni-cloud-router.git"
},
"files": [
"dist"
],
"author": "VK",
"license": "Apache-2.0"
}
@@ -25,7 +25,7 @@ module.exports = {
// 上传合同模板并填充 // 上传合同模板并填充
pubFun.fadada('generate_contract.api', { pubFun.fadada('generate_contract.api', {
template_id: '20231120', template_id: '20231120',
contract_id: fadadaContractId, contract_id: contract.fadadaContractId,
parameter_map: JSON.stringify({ parameter_map: JSON.stringify({
jiaName: userInfo.accountType == 1?userInfo.person.personName: userInfo.company.companyName, jiaName: userInfo.accountType == 1?userInfo.person.personName: userInfo.company.companyName,
jiaDate: '', jiaDate: '',
@@ -35,26 +35,22 @@ module.exports = {
res.data = await vk.baseDao.add({ res.data = await vk.baseDao.add({
dbName: "jjx-enquiry-quote",// 表名 dbName: "jjx-enquiry-quote",// 表名
dataJson: { // 需要新增的数据 json格式 dataJson: { // 需要新增的数据 json格式
userId: uid, ...data,
productList: sheet.productList, ...{
sheetId: sheet._id, userId: data.uid,
sheetUserId: sheet.userId, status: 0,
subjectName, subjectName,
subjectMobile, subjectMobile,
managerName, managerName,
managerMobile, managerMobile,
accountType, }
totalPrice,
status: 0
} }
}); });
// 更新用户数据
vk.baseDao.update({ vk.baseDao.update({
dbName: "jjx-enquiry-sheet",// 表名 dbName: "jjx-enquiry-sheet",// 表名
whereJson: { whereJson: {
_id: sheet._id, _id: data.sheetId,
}, },
dataJson: { dataJson: {
answerNumber: _.inc(1) answerNumber: _.inc(1)
@@ -14,55 +14,21 @@ module.exports = {
// 业务逻辑开始----------------------------------------------------------- // 业务逻辑开始-----------------------------------------------------------
// 生成询价编号 // 生成询价编号
let {
productList,
remark,
invoice,
writeInvoiceTime,
nvoiceType,
transportDocuments,
otherTransportDocuments,
transportLimit,
tradeMethod,
payMethod,
advancePayRate,
otherPayMethod,
reputationPayDay,
answerTime,
earnestMoney,
status
} = data;
// 这里需要把 params1 params2 params3 改成你数据库里允许用户添加的字段 // 这里需要把 params1 params2 params3 改成你数据库里允许用户添加的字段
let dbName = "jjx-enquiry-sheet"; let dbName = "jjx-enquiry-sheet";
res.id = await vk.baseDao.add({ res.id = await vk.baseDao.add({
dbName, dbName,
dataJson: { dataJson: {
productList, ...data,
remark, ...{
invoice,
writeInvoiceTime,
nvoiceType,
transportDocuments,
otherTransportDocuments,
transportLimit,
tradeMethod,
payMethod,
advancePayRate,
otherPayMethod,
reputationPayDay,
answerTime,
earnestMoney,
status,
answerNumber: 0, answerNumber: 0,
userId: uid userId: uid
} }
}
}); });
// 业务逻辑结束----------------------------------------------------------- // 业务逻辑结束-----------------------------------------------------------
return res; return res;
} }
@@ -51,12 +51,24 @@ module.exports = {
businessCard: true, businessCard: true,
accountType: true, accountType: true,
}, },
} },
] ]
}); });
const rows = res.rows
rows.forEach((row, rowIndex) => {
row.productList.forEach(async (product, productIndex) => {
const template = await vk.baseDao.findById({
dbName,
data: {
id: product.goodsId
}
});
rows[rowIndex].productList[productIndex].template = template
})
})
res.rows = rows
// 业务逻辑结束----------------------------------------------------------- // 业务逻辑结束-----------------------------------------------------------
return res; return res;
} }
@@ -118,7 +118,8 @@ var cloudObject = {
company: res.data.company, company: res.data.company,
manager: res.data.manager, manager: res.data.manager,
BankCard: res.data.BankCard, BankCard: res.data.BankCard,
fadadaConfirm: true fadadaConfirm: true,
status: 1
} }
}); });
@@ -5,16 +5,24 @@ module.exports = {
* 新增加工单 * 新增加工单
* @url client/process/kh/add 前端调用的url参数地址 * @url client/process/kh/add 前端调用的url参数地址
* data 请求参数 * data 请求参数
* @param {String} params1 参数1 * @param event
*/ */
main: async (event) => { main: async (event) => {
let {data = {}, userInfo, util, filterResponse, originalParam} = event; let {data = {}, userInfo, util, filterResponse, originalParam} = event;
let {customUtil, uniID, config, pubFun, vk, db, _} = util; let {customUtil, uniID, config, pubFun, vk, db, _} = util;
let { uid } = data;
let res = {code: 0, msg: ""}; let res = {code: 0, msg: ""};
// 业务逻辑开始----------------------------------------------------------- // 业务逻辑开始-----------------------------------------------------------
let dbName = "jjx-process-sheet";
res.id = await vk.baseDao.add({
dbName,
dataJson: {
...data,
...{
userId: data.uid,
answerNumber: 0
}
}
});
// 业务逻辑结束----------------------------------------------------------- // 业务逻辑结束-----------------------------------------------------------
@@ -10,11 +10,53 @@ module.exports = {
main: async (event) => { main: async (event) => {
let {data = {}, userInfo, util, filterResponse, originalParam} = event; let {data = {}, userInfo, util, filterResponse, originalParam} = event;
let {customUtil, uniID, config, pubFun, vk, db, _} = util; let {customUtil, uniID, config, pubFun, vk, db, _} = util;
let { uid } = data; let {uid, userId, pageIndex, pageSize, keyword, categoryIds, provinceCodes} = data;
let res = {code: 0, msg: ""}; let res = {code: 0, msg: ""};
// 业务逻辑开始----------------------------------------------------------- // 业务逻辑开始-----------------------------------------------------------
const dbName = "jjx-process-sheet";
const whereJson = {};
if (vk.pubfn.isNotNull(keyword)) {
whereJson.name = new RegExp(keyword)
}
if (vk.pubfn.isNotNull(userId)) {
whereJson.userId = userId
}
if (vk.pubfn.isNotNull(categoryIds)) {
whereJson.categoryIds = _.in(categoryIds)
}
if (vk.pubfn.isNotNull(provinceCodes)) {
whereJson['address.province.code'] = _.in(provinceCodes)
}
res = await vk.baseDao.selects({
dbName,
pageIndex,
pageSize,
whereJson,
foreignDB: [
{
dbName: "uni-id-users",
localKey: "userId",
foreignKey: "_id",
as: "user",
limit: 1, // limit=1则以对象形式返回
fieldJson: {
_id: true,
company: {
companyName: true
},
person: {
personName: true
},
businessCard: true,
accountType: true,
},
}
]
});
// 业务逻辑结束----------------------------------------------------------- // 业务逻辑结束-----------------------------------------------------------
@@ -18,12 +18,12 @@ module.exports = {
let res = {}; let res = {};
// 业务逻辑开始----------------------------------------------------------- // 业务逻辑开始-----------------------------------------------------------
// 允许修改的字段列表 // 允许修改的字段列表
let updateKeys = ["nickname", "avatar", "gender", "social_info", 'businessCard']; // let updateKeys = ["nickname", "avatar", "gender", "social_info", 'businessCard'];
let dataJson = {}; let dataJson = {};
for (let i in updateKeys) { // for (let i in updateKeys) {
let key = updateKeys[i]; // let key = updateKeys[i];
if (vk.pubfn.isNotNull(data[key])) dataJson[key] = data[key]; // if (vk.pubfn.isNotNull(data[key])) dataJson[key] = data[key];
} // }
dataJson.uid = uid; dataJson.uid = uid;
res = await uniID.updateUser(dataJson); res = await uniID.updateUser(dataJson);
// 业务逻辑结束----------------------------------------------------------- // 业务逻辑结束-----------------------------------------------------------
File diff suppressed because one or more lines are too long
@@ -1,9 +0,0 @@
{
"name": "uni-config-center",
"version": "0.0.3",
"description": "配置中心",
"main": "index.js",
"keywords": [],
"author": "DCloud",
"license": "Apache-2.0"
}
@@ -1,70 +0,0 @@
{
"passwordSecret": "passwordSecret-demo",
"tokenSecret": "tokenSecret-demo",
"tokenExpiresIn": 604800,
"tokenExpiresThreshold": 259200,
"tokenMaxLimit": 10,
"passwordErrorLimit": 6,
"bindTokenToDevice": false,
"passwordErrorRetryTime": 3600,
"autoSetInviteCode": true,
"forceInviteCode": false,
"preferedAppPlatform": "app-plus",
"preferedWebPlatform": "h5",
"removeDcloudAppid": false,
"app-plus": {
"tokenExpiresIn": 604800,
"oauth": {
"weixin": {
"appid": "",
"appsecret": ""
}
}
},
"mp-weixin": {
"oauth": {
"weixin": {
"appid": "",
"appsecret": ""
}
}
},
"h5-weixin": {
"oauth": {
"weixin": {
"appid": "",
"appsecret": ""
}
}
},
"mp-alipay": {
"oauth": {
"alipay": {
"appid": "",
"privateKey": ""
}
}
},
"mp-qq": {
"oauth": {
"qq": {
"appid": "",
"appsecret": ""
}
}
},
"service": {
"sms": {
"name": "重要",
"codeExpiresIn": 180,
"smsKey": "",
"smsSecret": "",
"templateId": ""
},
"univerify": {
"appid": "",
"apiKey": "",
"apiSecret": ""
}
}
}
@@ -1,3 +0,0 @@
-----BEGIN CERTIFICATE-----
证书内容
-----END CERTIFICATE-----
@@ -1,15 +0,0 @@
-----BEGIN CERTIFICATE-----
证书内容
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
证书内容
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
证书内容
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
证书内容
-----END CERTIFICATE-----
@@ -1,3 +0,0 @@
-----BEGIN CERTIFICATE-----
证书内容
-----END CERTIFICATE-----
@@ -1,5 +0,0 @@
### 文件名:
#### 1、`alipayCertPublicKey_RSA2.crt`
#### 2、`alipayRootCert.crt`
#### 3、`appCertPublicKey.crt`
![证书位置](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-cf0c5e69-620c-4f3c-84ab-f4619262939f/61c1582a-2ca7-43d3-92eb-b82136cc583f.png)
@@ -1,128 +0,0 @@
const fs = require('fs');
const path = require('path');
module.exports = {
/**
* 统一支付回调地址,格式为 "服务空间SpaceID":"URL化完整地址"
* 这里的本地开发并不是指 http://localhost:8080/ 的地址,而是另外一个服务空间的ULR化地址(如果你本地开发和线上环境共用同一个服务空间则只需要填线上环境的即可)
* 回调的云函数地址,建议填 /http/vk-pay,因为vk-pay云函数已经写好了回调处理的逻辑,否则你需要自己写全部的回调逻辑。
* 其中vk-pay是可以改名的,只需要修改 uniCloud/cloudfunctions/vk-pay/package.json 文件中的 "path": "/http/vk-pay", 把 /http/vk-pay 改成 /http/xxxx 即可(需要重新上传云函数vk-pay)。
*/
"notifyUrl": {
// 本地开发环境,如果你本地开发和线上环境共用同一个服务空间则只需要填线上环境的即可
"mp-0737e52b-fffa-4223-bcdf-d4ad3d9968a5": "https://mp-0737e52b-fffa-4223-bcdf-d4ad3d9968a5.bspapp.com/http/vk-pay",
// 线上正式环境
"mp-0737e52b-fffa-4223-bcdf-d4ad3d9968a5": "https://fc-mp-0737e52b-fffa-4223-bcdf-d4ad3d9968a5.next.bspapp.com/http/vk-pay"
},
/**
* 微信
* 公共参数说明
* appId 微信后台的appId
* secret 微信后台的secret
* mchId 微信支付的商户id
* key 微信支付的api密钥(V2版本)
* pfx 微信支付的p12证书(退款需要)
*/
"wxpay": {
// 微信 - 小程序支付(微信支付申请JSAPI支付)
"mp-weixin": {
"appId": "",
"secret": "",
"mchId": "",
"key": "",
"pfx": fs.readFileSync(__dirname + '/wxpay/wxpay.p12')
},
// 微信 - APP支付(微信支付申请APP支付)
"app-plus": {
"appId": "",
"secret": "",
"mchId": "",
"key": "",
"pfx": fs.readFileSync(__dirname + '/wxpay/wxpay.p12')
},
// 微信 - H5电脑网站二维码支付(微信支付申请Native支付)
"h5": {
"appId": "",
"secret": "",
"mchId": "",
"key": "",
"pfx": fs.readFileSync(__dirname + '/wxpay/wxpay.p12')
},
// 微信 - 公众号支付(微信支付申请JSAPI支付)
"h5-weixin": {
"appId": "",
"secret": "",
"mchId": "",
"key": "",
"pfx": fs.readFileSync(__dirname + '/wxpay/wxpay.p12')
},
// 微信 - 手机外部浏览器H5支付(微信支付申请H5支付)
"mweb": {
"appId": "",
"secret": "",
"mchId": "",
"key": "",
"pfx": fs.readFileSync(__dirname + '/wxpay/wxpay.p12'),
// 场景信息,必填
"sceneInfo": {
"h5_info": {
"type": "Wap", // 此值固定Wap
"wap_url": "https://www.xxxxxx.com", // 你的H5首页地址,必须和你发起支付的页面的域名一致。
"wap_name": "网站名称", // 你的H5网站名称
}
}
}
},
/**
* 支付宝(证书记得选java版本)
* 公共参数说明
* mchId 支付宝商户id 2088开头的那个(此参数可以去除)
* appId 支付宝开放平台的应用appId
* secret 支付宝开放平台的应用secret
* privateKey 应用私钥
* alipayPublicCertPath 支付宝公钥证书路径地址 与之对应的 alipayPublicCertContent 为支付宝公钥证书内容(值可以是字符串也可以是Buffer)
* alipayRootCertPath 支付宝根证书路径地址 与之对应的 alipayRootCertContent 为支付宝根证书内容(值可以是字符串也可以是Buffer)
* appCertPath 应用证书路径地址 与之对应的 appCertPathContent 为应用证书内容(值可以是字符串也可以是Buffer)
* sandbox 是否沙箱模式 true 沙箱模式 false 正常模式
*/
"alipay": {
// 支付宝 - 小程序支付配置
"mp-alipay": {
"mchId": "",
"appId": "",
"privateKey": "",
"alipayPublicCertPath": path.join(__dirname, 'alipay/alipayCertPublicKey_RSA2.crt'),
"alipayRootCertPath": path.join(__dirname, 'alipay/alipayRootCert.crt'),
"appCertPath": path.join(__dirname, 'alipay/appCertPublicKey.crt'),
"sandbox": false
},
// 支付宝 - APP支付配置
"app-plus": {
"mchId": "",
"appId": "",
"privateKey": "",
"alipayPublicCertPath": path.join(__dirname, 'alipay/alipayCertPublicKey_RSA2.crt'),
"alipayRootCertPath": path.join(__dirname, 'alipay/alipayRootCert.crt'),
"appCertPath": path.join(__dirname, 'alipay/appCertPublicKey.crt'),
"sandbox": false
},
// 支付宝 - H5支付配置(包含:网站二维码、手机H5,需申请支付宝当面付接口权限)
"h5": {
"mchId": "",
"appId": "",
"privateKey": "",
"alipayPublicCertPath": path.join(__dirname, 'alipay/alipayCertPublicKey_RSA2.crt'),
"alipayRootCertPath": path.join(__dirname, 'alipay/alipayRootCert.crt'),
"appCertPath": path.join(__dirname, 'alipay/appCertPublicKey.crt'),
"sandbox": false
},
// 支付宝 - 转账到支付宝等资金转出接口,其中 appCertSn 和 alipayRootCertSn 通过工具获取
"transfer": {
"mchId": "",
"appId": "",
"privateKey": "",
"appCertSn": "", // 应用证书的序列号
"alipayRootCertSn": "", // 支付宝根证书的序列号
"sandbox": false
}
}
}
@@ -1,3 +0,0 @@
### 文件名:
#### 1、`wxpay.p12`
![证书位置](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-cf0c5e69-620c-4f3c-84ab-f4619262939f/61c1582a-2ca7-43d3-92eb-b82136cc583f.png)
@@ -1,141 +0,0 @@
var uniIdConfig;
var uniPayConfig;
try {
uniIdConfig = require('../uni-id/config.json');
} catch(err) {
console.error("配置文件:uniCloud/cloudfunctions/common/uni-config-center/uni-id/config.json 编译错误,请检查!↓↓↓请查看下方的错误提示↓↓↓", err.name, err.message, err);
throw new Error("配置文件:uniCloud/cloudfunctions/common/uni-config-center/uni-id/config.json 编译错误,请检查!↑↑↑请查看上方的错误提示↑↑↑");
}
try {
uniPayConfig = require('../uni-pay/config.js');
} catch(err) {
console.error("配置文件:uniCloud/cloudfunctions/common/uni-config-center/uni-pay/config.js 编译错误,请检查!↓↓↓请查看下方的错误提示↓↓↓", err.name, err.message, err);
throw new Error("配置文件:uniCloud/cloudfunctions/common/uni-config-center/uni-pay/config.js 编译错误,请检查!↑↑↑请查看上方的错误提示↑↑↑");
}
module.exports = {
"uni": uniIdConfig,
"uni-pay": uniPayConfig,
"vk": {
"system": {
// 若serviceShutdow:true,则所有云函数无法访问(适用于需要临时关闭后端服务的情况,如迁移数据)
// 注意:本地调试时,需要重新启动本地服务才能生效。
"serviceShutdown": false,
"serviceShutdownDescription": "系统维护中,预计2小时恢复!",
// 云函数默认时区(中国为8)
"targetTimezone": 8
},
// 加密的密钥
"crypto": {
"aes": "dad4c0cb88c7d005bc5e844b8e79a9f0dad4c0cb88c7d005bc5e844b8e79a9f0", // 对称加密的密钥,建议长度在64位-128位(此处建议修改成自己的密钥)
},
// 当 context 内的下面值为空时,赋予默认的值(主要用于解决云函数 URL 后的默认 APPID 问题。
"context": {
"APPID": "", // 默认 dcloud_appid
"PLATFORM": "h5", // 可选项 h5、mp-weixin、app-plus、mp-alipay
"LOCALE": "zh-Hans", // 默认语言
"CLIENTIP":"127.0.0.1", // 默认客户端IP(主要用于解决本地调试无ip的问题)
},
"service": {
// 邮箱发送服务
"email": {
"codeExpiresIn": 180, // 邮件验证码有效期(单位秒)
// qq邮箱参数配置
"qq": {
"host": "smtp.qq.com",
"port": 465,
"secure": true,
"auth": {
"user": "你的邮箱@qq.com",
"pass": "邮箱授权码"
}
},
// 163邮箱配置
"163":{
"host": "smtp.163.com",
"port": 465,
"secure": true,
"auth": {
"user": "",
"pass": ""
}
}
},
// 日志服务
"log": {
// 用户登录日志
"login": {
"status": true // 是否开启用户登录日志
}
},
// 短信服务
"sms": {
// 阿里云短信服务
"aliyun": {
"enable": true, // 是否使用阿里云短信代替unicloud短信发送短信验证码
"accessKeyId": "LTAI4FyY6A493kVYn5ezyAw6", // 短信密钥key
"accessKeySecret": "776MyYZfRb8cQHTe5ji0jBVu1rHfa9", // 短信密钥secret
"signName": "亿利通", // 默认签名
"templateCode": {
"verifyCode": "SMS_210078693" // 验证码短信模板 - 配合uni-id需要
}
}
},
// 开放平台api
"openapi": {
// 百度开放平台 (主要用于身份证识别,营业执照识别等API)
// API Key申请地址:https://cloud.baidu.com/doc/OCR/s/rk3h7xzck 点击右上角注册
"baidu": {
"appid": "", // 对应的API Key
"appsecret": "" // 对应的Secret Key
}
}
},
"db": {
"unicloud": {
"maxLimit": 1000, // 最大limit限制(目前腾讯云最大1000,阿里云最大1000)
"cancelAddTime": false, // 取消 vk.baseDao.add 时自动生成 _add_time 和 _add_time_str
"cancelAddTimeStr": false, // 仅取消 vk.baseDao.add 时自动生成的 _add_time_str,若已设置 cancelAddTime 为true,则 cancelAddTimeStr 也会强制为true
"getTableData": {
"sortArr": [{ "name": "_add_time", "type": "desc" }], // vk.baseDao.getTableData 默认排序规则 vk.db.unicloud.getTableData.sortArr
}
}
},
// 其他小程序的密钥 当需要多个小程序绑定同一服务空间,并调用小程序服务端API时需要填写 暂只支持微信小程序
"oauth": {
// 微信小程序
"weixin": {
// 密钥列表
"list": [
{ "appid": "", "appsecret": "" },
{ "appid": "", "appsecret": "" }
]
},
// 支付宝
"alipay": {
// 密钥列表
"list": [
{ "appid": "", "privateKey": "" },
{ "appid": "", "privateKey": "" }
]
},
// qq
"qq": {
// 密钥列表
"list": [
{ "appid": "", "appsecret": "" },
{ "appid": "", "appsecret": "" }
]
},
// 抖音
"toutiao": {
// 密钥列表
"list": [
{ "appid": "", "appsecret": "" },
{ "appid": "", "appsecret": "" }
]
}
}
}
};
@@ -1,73 +0,0 @@
## 重要说明
#### 框架目前的配置(不含`uni-id`)在 `cloudfunctions/common/uni-config-center/vk-unicloud/index.js` 中配置
#### `uni-id` 的配置是在 `cloudfunctions/common/uni-config-center/uni-id/config.json` 中配置
#### 每次修改完 配置 中的内容后如果不生效,则尝试以下操作。
```
1. 上传 uni-config-center 公共模块
2. 重新上传 router 云函数
如果是连接本地云函数,则需要重启本地服务才会生效。(hbx的原因)
```
### 由于`uni-id`配置无法打注释,故下方为`uni-id`配置的介绍
```js
{
"passwordSecret": "passwordSecret-demo",// 加密密码所用的密钥,修改会导致所用户之前的密码失效。如一定要修改,请查看https://uniapp.dcloud.io/uniCloud/uni-id?id=modifysecret
"tokenSecret": "tokenSecret-demo", // 生成token所用的密钥,修改会导致所有用户之前的token失效。
"tokenExpiresIn": 604800, // 全平台token过期时间,未指定过期时间的平台会使用此值,604800代表7天
"tokenExpiresThreshold": 3600, // 新增于uni-id 1.1.7版本,checkToken时如果token有效期小于此值则自动获取新token,如果不配置此参数则不开启自动获取新token功能
"passwordErrorLimit": 6, // 密码错误最大重试次数
"bindTokenToDevice": false, // 是否将token和设备绑定,设置为true会进行ua校验
"passwordErrorRetryTime": 3600, // 密码错误重试次数超限之后的冻结时间
"autoSetInviteCode": true, // 是否在用户注册时自动设置邀请码
"forceInviteCode": false, // 是否强制用户注册时必填邀请码,默认为false(需要注意的是目前只有短信验证码注册才可以填写邀请码)
"app-plus": {
"tokenExpiresIn": 604800, // app端 token过期时间
"oauth" : {
// App微信登录所用到的appid、appsecret需要在微信开放平台获取,注意:不是公众平台而是开放平台
"weixin" : {
"appid" : "",
"appsecret" : ""
}
}
},
"mp-weixin": {
"oauth" : {
// 微信小程序登录所用的appid、appsecret需要在对应的小程序管理控制台获取
"weixin" : {
"appid" : "",
"appsecret" : ""
}
}
},
"mp-alipay": {
"oauth" : {
// 支付宝小程序登录用到的appid、privateKey请参考支付宝小程序的文档进行设置或者获取,https://opendocs.alipay.com/open/291/105971#LDsXr
"alipay" : {
"appid" : "",
"privateKey" : ""
}
}
},
"service": {
// unicloud短信
"sms": {
"name": "重要", // 应用名称,对应短信模版的name
"codeExpiresIn": 180, // 验证码过期时间,单位为秒,注意一定要是60的整数倍
"smsKey": "你的smsKey", // 短信密钥key,开通短信服务处可以看到 https://dev.dcloud.net.cn/uniSms
"smsSecret": "你的smsSecret", // 短信密钥secret,开通短信服务处可以看到 https://dev.dcloud.net.cn/uniSms
"templateId":"你的短信模板ID" // 短信模板ID
},
// 一键登录
"univerify": {
"appid":"your appid", // uniapp的appid
"apiKey": "your apiKey", // 一键登录的apiKey
"apiSecret": "your apiSecret" // 一键登录的apiSecret
}
}
}
```
+5
View File
@@ -0,0 +1,5 @@
export const WRITE_INVOICE_TIME = ['付款当月(限20号之前付款,20号之后付款次月开票)', '付款后次月', '付款前']
export const INVOICE_TYPE = ['增值税专用发票13%', '增值税普通发票', '普通发票']
export const PROCESS_PAY_METHOD = ['预付', '货到验收后付款', '提货付全款', '信誉采购,货到签单后账期:']