Browse Source

Merge tag '3.1.0-小区合伙人' into develop

develop
nesxy 6 years ago
parent
commit
2a2c845eee
30 changed files with 4536 additions and 1710 deletions
  1. 29
      build/webpack.base.conf.js
  2. 7
      config/index.js
  3. 1
      index.html
  4. 2
      package.json
  5. 19
      src/api/chooseCommunity.js
  6. 10
      src/api/home.js
  7. 7
      src/api/wxShare.js
  8. 115
      src/assets/styles/common/border.scss
  9. 1093
      src/assets/styles/common/common.scss
  10. 165
      src/assets/styles/common/icon.scss
  11. 86
      src/assets/styles/common/mixin.scss
  12. 46
      src/assets/styles/common/transition.scss
  13. 19
      src/assets/styles/common/variables.scss
  14. 200
      src/assets/styles/index.scss
  15. 164
      src/common/util.js
  16. 11
      src/main.js
  17. 30
      src/models/choose-community.js
  18. 24
      src/models/home-model.js
  19. 2
      src/models/utils-model.js
  20. 74
      src/models/wxLocation.js
  21. 6
      src/models/wxShare-model.js
  22. 195
      src/models/wxShare.js
  23. 7
      src/router/index.js
  24. 20
      src/utils/scroll.js
  25. 485
      src/view/choose-community.vue
  26. 2
      src/view/goods-classify.vue
  27. 1692
      src/view/home.vue
  28. 475
      src/view/month-card.vue
  29. 1258
      src/view/order-check.vue
  30. 2
      src/view/order-list.vue

29
build/webpack.base.conf.js

@ -9,7 +9,7 @@ var vueLoaderConfig = require('./vue-loader.conf')
var webpack = require("webpack")
function resolve (dir) {
function resolve(dir) {
return path.join(__dirname, '..', dir)
}
@ -17,12 +17,16 @@ let webpackConfig = {
entry: {
app: ["babel-polyfill", "./src/main.js"]
},
//添加
externals: {
"BMap": "BMap"
},
output: {
path: config.build.assetsRoot,
filename: '[name].js',
publicPath: process.env.NODE_ENV === 'production'
? config.build.assetsPublicPath
: config.dev.assetsPublicPath
publicPath: process.env.NODE_ENV === 'production' ?
config.build.assetsPublicPath :
config.dev.assetsPublicPath
},
resolve: {
extensions: ['.js', '.vue', '.json'],
@ -32,8 +36,7 @@ let webpackConfig = {
}
},
module: {
rules: [
{
rules: [{
test: /\.vue$/,
loader: 'vue-loader',
options: vueLoaderConfig
@ -62,16 +65,16 @@ let webpackConfig = {
]
},
plugins: [
new webpack.optimize.CommonsChunkPlugin('common.js'),
new webpack.ProvidePlugin({
jQuery: "jquery",
$: "jquery"
})
]
new webpack.optimize.CommonsChunkPlugin('common.js'),
new webpack.ProvidePlugin({
jQuery: "jquery",
$: "jquery"
})
]
}
module.exports = vuxLoader.merge(webpackConfig, {
plugins: ['vux-ui', 'progress-bar', 'duplicate-style']
})
})

7
config/index.js

@ -7,8 +7,8 @@ module.exports = {
index: path.resolve(__dirname, '../dist/index.html'),
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: '/',
productionSourceMap: true,
assetsPublicPath: '/v2/',
productionSourceMap: false,
// Gzip off by default as many popular static hosts such as
// Surge or Netlify already gzip all static assets for you.
// Before setting to `true`, make sure to:
@ -23,7 +23,8 @@ module.exports = {
},
dev: {
env: require('./dev.env'),
port: 8080,
host: '192.168.31.52',
port: 8081,
autoOpenBrowser: true,
assetsSubDirectory: 'static',
assetsPublicPath: '/',

1
index.html

@ -4,6 +4,7 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
<script src="https://res.wx.qq.com/open/libs/weuijs/1.0.0/weui.min.js"></script>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=m8sGHZTpKuDeDAU5qs4YUWWDP1v6XZsq"></script>
<title>一号家政</title>
</head>
<body>

2
package.json

@ -16,6 +16,7 @@
"lodash": "^4.17.4",
"vue": "^2.5.9",
"vue-awesome-swiper": "^3.1.3",
"vue-baidu-map": "^0.21.22",
"vue-cookies": "^1.5.13",
"vue-router": "^2.8.1",
"vue-template-compiler": "^2.5.9",
@ -59,6 +60,7 @@
"style-loader": "^0.16.1",
"url-loader": "^0.5.9",
"vue-awesome-swiper": "^3.1.3",
"vue-infinite-scroll": "^2.0.2",
"vue-loader": "^11.1.4",
"vue-style-loader": "^2.0.0",
"webpack": "^2.7.0",

19
src/api/chooseCommunity.js

@ -0,0 +1,19 @@
export default {
getAddressInfo:{
method:"get",
url:"/mall/web/estate/addressInfo"
},
// -- 查询单个小区信息 --
getEstateInfo: {
method: 'GET',
url: '/mall/web/estate/query/estateInfo',
},
getEstateList: {
method: 'GET',
url: '/mall/web/estate/query/estateList',
},
getGoodsTemlate: {
method: 'GET',
url: '/mall/web/goods/template',
},
}

10
src/api/home.js

@ -15,16 +15,16 @@ export default {
method: 'GET',
url: '/mall/web/defaultDistrict'
},
getLocation:{
method:"get",
url:"/mall/web/addressInfo"
},
countExtend:{
method:"POST",
url:"/mall/web/center/insert/data"
},
countPartner:{
method:"POST",
url:"/mall/web/center/insert/housing/data"
},
updateUniqueId:{
method:"get",
url:"/mall/web/center/update/uniqueId"
}
},
}

7
src/api/wxShare.js

@ -1,5 +1,10 @@
export default {
export default {
// -- 获取分享信息 --
getWXCheck: {
method: 'GET',
url: '/mall/web/wx/api/check',
} ,
// -- 获取分享信息 --
getShare: {
method: 'GET',

115
src/assets/styles/common/border.scss

@ -0,0 +1,115 @@
.border-1px {
position: relative;
&::before {
@include border-1px();
}
}
.border-1px-t {
position: relative;
&::before {
@include border-1px-top();
}
}
.border-1px-l {
position: relative;
&::before {
@include border-1px-left();
}
}
.border-1px-r {
position: relative;
&::after {
@include border-1px-right();
}
}
.border-1px-b {
position: relative;
&::after {
@include border-1px-bottom();
}
}
@media (-webkit-min-device-pixel-ratio: 2) {
.f-bb-gray {
position: relative;
&::after {
@include border-1px-bottom(#E8E8E8);
}
}
.f-bt-gray {
position: relative;
&::before {
@include border-1px-top(#E8E8E8);
}
}
.f-br-gray {
&::after {
@include border-1px-right(#E8E8E8);
}
}
.f-bl-gray {
&::before {
@include border-1px-left(#E8E8E8);
}
}
.f-bb-gray-dashed {
position: relative;
&:after {
height: 1px;
content: '';
width: 100%;
border-bottom: 1px dashed #dcdcdc;
position: absolute;
bottom: -1px;
right: 0;
transform: scaleY(0.5);
-webkit-transform: scaleY(0.5);
}
}
.f-bb-blue {
position: relative;
&:after {
@include border-1px-bottom(#33a7e6);
}
}
.f-bt-1px {
position: relative;
&:after {
@include border-1px-bottom(#D6D6D6);
}
}
.f-border-grey {
/* content: '';
position: absolute;
top: 0;
left: 0;
border: 1px solid #e8e8e8;
-webkit-box-sizing: border-box;
box-sizing: border-box;
width: 200%;
height: 200%;
-webkit-transform: scale(0.5);
transform: scale(0.5);
-webkit-transform-origin: left top;
transform-origin: left top;
z-index: 0;
border-radius: 3px; */
position: relative;
&::before {
@include border-1px(#e8e8e8, 3px);
}
}
}
.f-border-r4{
border-radius: 4px;
}
.f-border-b-E5{
border-bottom: 1px solid #f3f3f3;
}

1093
src/assets/styles/common/common.scss
File diff suppressed because it is too large
View File

165
src/assets/styles/common/icon.scss

@ -0,0 +1,165 @@
.icon {
width: 24px;
height: 24px;
display: inline-block;
font-size: inherit;
text-rendering: auto;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-11 {
width: 11px;
height: 11px;
}
.icon-13 {
width: 13px;
height: 13px;
}
.icon-14 {
width: 14px;
height: 14px;
}
.icon-15 {
width: 15px;
height: 15px;
}
.icon-16 {
width: 16px;
height: 16px;
}
.icon-17 {
width: 17px;
height: 17px;
}
.icon-18 {
width: 18px;
height: 18px;
}
.icon-20 {
width: 20px;
height: 20px;
}
.icon-22 {
width: 22px;
height: 22px;
}
.icon-25 {
width: 25px;
height: 25px;
}
.icon-28 {
width: 26px;
height: 26px;
}
.icon-30 {
width: 30px;
height: 30px;
}
.icon-33 {
width: 33px;
height: 33px;
}
.icon-35 {
width: 35px;
height: 35px;
}
.icon-44 {
width: 44px;
height: 44px;
}
.icon-65 {
width: 65px;
height: 65px;
}
.icon-arrow {
width: 6px;
height: 11px;
}
.icon-width-3 {
width: 3px;
}
.icon-width-14 {
width: 14px;
}
.icon-width-6 {
width: 6px;
}
.icon-width-10 {
width: 10px;
}
.icon-width-19 {
width: 19px;
}
.arrow-back {
width: 10px;
height: 18px;
margin-top: -4px;
}
// .icon-close {
// background: url(../assets/images/delete.png) no-repeat;
// background-size: contain;
// }
.arrow-left {
position: relative;
&:before {
content: ' ';
display: inline-block;
height: 10px;
width: 10px;
border-width: 2px 2px 0 0;
border-color: #000;
border-style: solid;
-webkit-transform: matrix(-0.71, 0.71, 0.71, 0.71, 0, 0);
transform: matrix(-0.71, 0.71, 0.71, 0.71, 0, 0);
position: absolute;
top: 50%;
left: 0;
margin-top: -5px;
}
}
.arrow-right {
position: relative;
&:after {
content: ' ';
display: inline-block;
height: 10px;
width: 10px;
border-width: 2px 2px 0 0;
border-color: #c8c8cd;
border-style: solid;
-webkit-transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0);
transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0);
position: absolute;
top: 50%;
right: 0px;
margin-top: -6px;
}
}

86
src/assets/styles/common/mixin.scss

@ -0,0 +1,86 @@
@mixin clearfix {
&:after {
content: '';
display: table;
clear: both;
}
}
@mixin scrollBar {
&::-webkit-scrollbar-track-piece {
background: #d3dce6;
}
&::-webkit-scrollbar {
width: 6px;
}
&::-webkit-scrollbar-thumb {
background: #99a9bf;
border-radius: 20px;
}
}
@mixin border-1px($color: #464353, $radius: 0px) {
content: ' ';
position: absolute;
left: 0;
top: 0;
width: 200%;
height: 200%;
border: 1px solid $color;
color: $color;
border-radius: $radius;
transform-origin: left top;
transform: scale(0.5);
}
@mixin border-1px-top($color: #464353) {
content: ' ';
position: absolute;
left: 0;
top: 0;
right: 0;
height: 1px;
border-top: 1px solid $color;
color: $color;
transform-origin: 0 0;
transform: scaleY(0.5);
}
@mixin border-1px-bottom($color: #464353) {
content: ' ';
position: absolute;
left: 0;
bottom: 0;
right: 0;
height: 1px;
border-bottom: 1px solid $color;
color: $color;
transform-origin: 0 100%;
transform: scaleY(0.5);
}
@mixin border-1px-left($color: #464353) {
content: ' ';
position: absolute;
left: 0;
top: 0;
width: 1px;
bottom: 0;
border-left: 1px solid $color;
color: $color;
transform-origin: 0 0;
transform: scaleX(0.5);
}
@mixin border-1px-right($color: #464353) {
content: ' ';
position: absolute;
right: 0;
top: 0;
width: 1px;
bottom: 0;
border-right: 1px solid $color;
color: $color;
transform-origin: 100% 0;
transform: scaleX(0.5);
}

46
src/assets/styles/common/transition.scss

@ -0,0 +1,46 @@
//globl transition css
/*fade*/
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.28s;
}
.fade-enter,
.fade-leave-active {
opacity: 0;
}
/*fade-transform*/
.fade-transform-leave-active,
.fade-transform-enter-active {
transition: all .5s;
}
.fade-transform-enter {
opacity: 0;
transform: translateX(-30px);
}
.fade-transform-leave-to {
opacity: 0;
transform: translateX(30px);
}
/*fade*/
.breadcrumb-enter-active,
.breadcrumb-leave-active {
transition: all .5s;
}
.breadcrumb-enter,
.breadcrumb-leave-active {
opacity: 0;
transform: translateX(20px);
}
.breadcrumb-move {
transition: all .5s;
}
.breadcrumb-leave-active {
position: absolute;
}

19
src/assets/styles/common/variables.scss

@ -0,0 +1,19 @@
//sidebar
$menuBg: #304156;
$subMenuBg: #1f2d3d;
$menuHover: #001528;
// public
$appWidth: 750px;
$appBg: #ededed;
$colorWhite: #fff;
$errorColor: #f45438;
// login
$versionColor: #aaa;
$borderBottomColor: #ccc;
$inputColor: #323232;
$placeholderColor: #c2c2c2;
$vertifyColor: #009ee0;
$loginButtonColor: #0099e0;

200
src/assets/styles/index.scss

@ -0,0 +1,200 @@
@import './common/icon.scss';
@import './common/mixin.scss';
// @import './common/transition.scss';
@import './common/variables.scss';
@import './common/border.scss';
@import './common/common.scss';
* {
margin: 0;
padding: 0;
}
img {
max-width: 100%;
vertical-align: middle;
}
html,
body {
width: 100%;
height: 100%;
}
@media screen and (min-width: 640px) {
body body,
body html,
html body,
html html {
width: 50%;
margin: 0 auto;
left: 25%;
}
}
body {
min-height: 100%;
line-height: 1.6;
background-color: #ededed;
font-family: PingFang-SC-Regular, Arial, sans-serif;
font-size: 14px;
color: #323232;
}
button {
border: none;
outline: none;
background: none;
}
*,
*:before,
*:after {
box-sizing: border-box;
}
a,
a:focus,
a:hover {
cursor: pointer;
outline: none;
text-decoration: none;
}
div:focus {
outline: none;
}
input::-webkit-input-placeholder,
textarea::-webkit-input-placeholder {
color: #cecece;
}
.clearfix {
&:after {
visibility: hidden;
display: block;
font-size: 0;
content: ' ';
clear: both;
height: 0;
}
}
.vertical-middle:after {
content: '';
width: 0;
height: 100%;
display: inline-block;
vertical-align: middle;
}
#app {
width: 100%;
max-width: 750px;
height: 100%;
margin: 0 auto;
}
@media screen and (min-width: 640px) {
.footer-toolbar {
width: 50% !important;
margin: 0 auto;
left: 25% !important;
}
}
select,
textarea,
input {
vertical-align: middle;
border: 0;
background: none;
-webkit-border-radius: 0;
border-radius: 0;
outline: none;
-webkit-appearance: none;
-webkit-tap-highlight-color: transparent;
font-size: 14px;
}
ul,
ul li {
list-style: none;
}
p {
word-break: break-word;
}
.el-input--suffix .el-input__inner {
height: 28px;
line-height: 28px;
background: #EDEDED;
border: none;
border-radius: 16px;
}
.el-input__icon {
line-height: 28px!important;
}
.el-dropdown-menu {
padding: 5px 0!important;
}
.el-dropdown-menu__item {
border-bottom: 1px solid #E3E3E3;
text-align: center;
font-size: 14px!important;
color: #333333!important;
margin: 0 10px!important;
padding: 0 10px!important;
}
.el-dropdown-menu__item:nth-last-child(2) {
border-bottom: none;
}
.md-example-child-steps-5 {
height: 40px!important;
}
.md-steps.md-steps-horizontal {
padding: 5px 16px 0px!important;
}
.md-steps.md-steps-horizontal .bar.horizontal-bar .bar-inner {
width: 100%;
height: 1px;
background-color: #00A0E8;
}
.md-steps .step-wrapper .text-wrapper {
padding-top: 0px!important;
.name {
line-height: 15px!important;
font-size: 11px!important;
color: #C4C4C4!important;
}
}
.md-steps.md-steps-horizontal .step-wrapper.reached .text-wrapper .name {
color: #333333!important;
}
.md-steps.md-steps-horizontal .step-wrapper.current .text-wrapper .name {
color: #00A0E8!important;
}
.md-steps .icon-wrapper .step-node-default-icon {
width: 10px!important;
height: 10px!important;
}
.md-steps .step-wrapper.reached .icon-wrapper .step-node-default-icon {
background: #00A0E8!important;
width: 12px!important;
height: 12px!important;
}
.md-steps .step-wrapper.current .icon-wrapper .step-node-default-icon {
background: #00A0E8!important;
width: 12px!important;
height: 12px!important;
}
.md-steps .step-wrapper, .md-steps .step-wrapper .icon-wrapper {
min-width: 16px!important;
min-height: 16px!important;
}
.md-steps.md-steps-horizontal .step-wrapper {
margin: 0 5px!important;
}

164
src/common/util.js

@ -1,63 +1,131 @@
/**
* Created by jerry on 2017/4/14.
*/
import homeApi from "../models/home-model.js";
var SIGN_REGEXP = /([yMdhsm])(\1*)/g
var DEFAULT_PATTERN = 'yyyy-MM-dd'
function padding (s, len) {
let l = len - (s + '').length
for (var i = 0; i < l; i++) { s = '0' + s }
return s
function padding(s, len) {
let l = len - (s + '').length
for (var i = 0; i < l; i++) { s = '0' + s }
return s
};
export default {
getQueryStringByName: function (name) {
var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i')
var r = window.location.search.substr(1).match(reg)
var context = ''
if (r != null) { context = r[2] }
reg = null
r = null
return context === null || context === '' || context === 'undefined' ? '' : context
},
formatDate: {
format: function (date, pattern) {
pattern = pattern || DEFAULT_PATTERN
return pattern.replace(SIGN_REGEXP, function ($0) {
switch ($0.charAt(0)) {
case 'y': return padding(date.getFullYear(), $0.length)
case 'M': return padding(date.getMonth() + 1, $0.length)
case 'd': return padding(date.getDate(), $0.length)
case 'w': return date.getDay() + 1
case 'h': return padding(date.getHours(), $0.length)
case 'm': return padding(date.getMinutes(), $0.length)
case 's': return padding(date.getSeconds(), $0.length)
}
})
getQueryStringByName: function (name) {
var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i')
var r = window.location.search.substr(1).match(reg)
var context = ''
if (r != null) { context = r[2] }
reg = null
r = null
return context === null || context === '' || context === 'undefined' ? '' : context
},
parse: function (dateString, pattern) {
var matchs1 = pattern.match(SIGN_REGEXP)
var matchs2 = dateString.match(/(\d)+/g)
if (matchs1.length === matchs2.length) {
var _date = new Date(1970, 0, 1)
for (var i = 0; i < matchs1.length; i++) {
var _int = parseInt(matchs2[i])
var sign = matchs1[i]
switch (sign.charAt(0)) {
case 'y': _date.setFullYear(_int); break
case 'M': _date.setMonth(_int - 1); break
case 'd': _date.setDate(_int); break
case 'h': _date.setHours(_int); break
case 'm': _date.setMinutes(_int); break
case 's': _date.setSeconds(_int); break
}
formatDate: {
format: function (date, pattern) {
pattern = pattern || DEFAULT_PATTERN
return pattern.replace(SIGN_REGEXP, function ($0) {
switch ($0.charAt(0)) {
case 'y': return padding(date.getFullYear(), $0.length)
case 'M': return padding(date.getMonth() + 1, $0.length)
case 'd': return padding(date.getDate(), $0.length)
case 'w': return date.getDay() + 1
case 'h': return padding(date.getHours(), $0.length)
case 'm': return padding(date.getMinutes(), $0.length)
case 's': return padding(date.getSeconds(), $0.length)
}
})
},
parse: function (dateString, pattern) {
var matchs1 = pattern.match(SIGN_REGEXP)
var matchs2 = dateString.match(/(\d)+/g)
if (matchs1.length === matchs2.length) {
var _date = new Date(1970, 0, 1)
for (var i = 0; i < matchs1.length; i++) {
var _int = parseInt(matchs2[i])
var sign = matchs1[i]
switch (sign.charAt(0)) {
case 'y': _date.setFullYear(_int); break
case 'M': _date.setMonth(_int - 1); break
case 'd': _date.setDate(_int); break
case 'h': _date.setHours(_int); break
case 'm': _date.setMinutes(_int); break
case 's': _date.setSeconds(_int); break
}
}
return _date
}
return null
}
return _date
}
return null
},
};
export function isEmpty(val) {
return (
val === undefined ||
val === null ||
val === "undefined" ||
val === "")
}
export function countPartner() {
var estateId = "";
let estateStr = localStorage.getItem("estate") || "";
if (!estateStr) {
} else {
let estateArr = estateStr.split("&");
estateId = estateArr[0];
}
if(estateId !== ""){
let keyStr = "1hjz_open_housing_log_" + estateId
let open_housing = localStorage.getItem(keyStr) || "";
}
if (!open_housing) {
return new Promise((resolve, reject) => {
var params = {
buryingPointType: 0,
housingEstateId: estateId,
timeStr: getTime(Date.now())
};
homeApi.countPartner(params).then(res => {
localStorage.setItem(keyStr, getTime(Date.now()))
resolve();
});
});
}else{
if(open_housing !== getTime(Date.now())){
return new Promise((resolve, reject) => {
var params = {
buryingPointType: 0,
housingEstateId: estateId,
timeStr: getTime(Date.now())
};
homeApi.countPartner(params).then(res => {
localStorage.setItem(keyStr, getTime(Date.now()))
resolve();
});
});
}
}
}
}
export function getTime(time) {
let date = new Date(time);
let year = date.getFullYear();
let month = checkTime(date.getMonth() + 1);
let day = checkTime(date.getDate());
let str = year + "-" + month + "-" + day;
return str;
}
export function checkTime(i) {
if (i < 10) {
i = "0" + i;
}
return i;
}

11
src/main.js

@ -2,6 +2,7 @@
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from "vue";
// import BMap from 'vue-baidu-map';
import {
WechatPlugin,
LoadingPlugin,
@ -14,6 +15,7 @@ import router from "./router";
import "@/assets/iconfont.css";
import "@/assets/styles/main.scss";
import "@/assets/styles/style.css";
import '@/assets/styles/index.scss' // global css
import "@/common/rem.js";
import ElementUI from "element-ui";
import "element-ui/lib/theme-chalk/index.css";
@ -23,7 +25,9 @@ import "@/assets/styles/swiper.css";
//import wx from 'weixin-js-sdk'
//import axios from 'axios'
import "@/models/wxShare.js";
import "@/models/wxLocation.js";
import VueCookies from 'vue-cookies'
import infiniteScroll from 'vue-infinite-scroll'
Vue.config.productionTip = false;
Vue.use(WechatPlugin);
@ -32,7 +36,12 @@ Vue.use(LoadingPlugin);
Vue.use(ToastPlugin);
Vue.use(AlertPlugin);
Vue.use(VueCookies)
Vue.use(ElementUI)
Vue.use(infiniteScroll)
// Vue.use(BMap, {
// // ak 是在百度地图开发者平台申请的密钥 详见 http://lbsyun.baidu.com/apiconsole/key */
// ak: 'm8sGHZTpKuDeDAU5qs4YUWWDP1v6XZsq'
// })
Vue.use(VueAwesomeSwiper);
Vue.mixin({
data() {

30
src/models/choose-community.js

@ -0,0 +1,30 @@
import utilsModel from "./utils-model";
import chooseCommunity from "../api/chooseCommunity";
export default {
getAddressInfo : (params) =>
utilsModel
.config(chooseCommunity.getAddressInfo)
.request({
params : params,
}),
getEstateInfo : (params) =>
utilsModel
.config(chooseCommunity.getEstateInfo)
.request({
params : params,
}),
getEstateList : (params) =>
utilsModel
.config(chooseCommunity.getEstateList)
.request({
params : params,
}),
getGoodsTemlate : (params) =>
utilsModel
.config(chooseCommunity.getGoodsTemlate)
.request({
params : params,
})
}

24
src/models/home-model.js

@ -18,19 +18,27 @@ export default {
version: "2.5.0"
}
}),
getLocation: params =>
utilsModel.config(homeApi.getLocation).request({
params: params,
// headers: {
// "x-forwarded-for": "113.65.207.218"
// }
}),
// getLocation: params =>
// utilsModel.config(homeApi.getLocation).request({
// params: params,
// // headers: {
// // "x-forwarded-for": "113.65.207.218"
// // }
// }),
countExtend: params =>
utilsModel.config(homeApi.countExtend).request({
params: params
}),
countPartner: params =>
utilsModel.config(homeApi.countPartner).request({
params: params
}),
updateUniqueId: params =>
utilsModel.config(homeApi.updateUniqueId).request({
params: params
})
}),
// getEstateInfo: params =>
// utilsModel.config(homeApi.getEstateInfo).request({
// params: params
// }),
};

2
src/models/utils-model.js

@ -102,7 +102,7 @@ const config = function(config, params) {
// console.log(newConfig)
// newConfig.headers.Authorization=params.token
//执行http接口请求
return instance(newConfig).then(successCallback, errorCallback);
return instance(newConfig).then(successCallback).catch(errorCallback);
}
};
};

74
src/models/wxLocation.js

@ -0,0 +1,74 @@
import Vue from "vue";
import wx from "weixin-js-sdk";
import axios from "axios";
import wxShareModel from "../models/wxShare-model.js";
let instance = axios.create();
//引入BMap
import BMap from "BMap";
Vue.prototype.wxLocation = function () {
return new Promise((resolve, reject) => {
wxShareModel.getWXCheck().then(response => {
if (response.code != 0) {
return;
}
var jsApiSignConfig = response.response.jsApiSignConfig;
wx.config({
debug: false, // 开启调试模式,开发时可以开启
appId: jsApiSignConfig.appId, // 必填,公众号的唯一标识 由接口返回
timestamp: jsApiSignConfig.timestamp, // 必填,生成签名的时间戳 由接口返回
nonceStr: jsApiSignConfig.nonceStr, // 必填,生成签名的随机串 由接口返回
signature: jsApiSignConfig.signature, // 必填,签名 由接口返回
jsApiList: [
'checkJsApi', 'openLocation', 'getLocation'
],
});
wx.checkJsApi({
jsApiList: ['getLocation'],
success: function (res) {
if (res.checkResult.getLocation == false) {
alert('你的微信版本太低,不支持微信JS接口,请升级到最新的微信版本!');
return "";
}
}
});
wx.ready(() => {
// 首次进入页面进会弹窗确认地理位置
if (localStorage.getItem("latitude") == null) {
wx.getLocation({
type: "gcj02", // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
success: function (res) {
console.log('res:' + res);
// alert('res.latitude:' + res.latitude + '------res.longitude:' + res.longitude);
// localStorage.setItem("latitude", res.latitude);
// localStorage.setItem("longitude", res.longitude);
$.ajax({
url: 'http://api.map.baidu.com/geocoder/v2/?ak=a79bFu054xIbE23jlynkSXX20F9yGD4G&callback=renderReverse&location=' + res.latitude + ',' + res.longitude + '&output=json&pois=1',
type: "get",
dataType: "jsonp",
jsonp: "callback",
success: function (data) {
// alert('data.result.location.lng:' + data.result.location.lng + '-----data.result.location.lat:' + data.result.location.lat);
localStorage.setItem("latitude", data.result.location.lat);
localStorage.setItem("longitude", data.result.location.lng);
resolve("定位成功")
}
});
},
cancel: function () {
alert("拒绝定位");
resolve("定位失败")
}
});
} else {
resolve("已经有定位")
}
// alert("lat:" + localStorage.getItem("latitude") + ";lng:" + localStorage.getItem("longitude"));
wx.error(function (res) {
resolve("定位失败")
});
});
});
})
}

6
src/models/wxShare-model.js

@ -9,4 +9,10 @@ export default {
.request({
params : params,
}),
getWXCheck : () =>
utilsModel
.config(wxShareApi.getWXCheck)
.request({
}),
}

195
src/models/wxShare.js

@ -5,43 +5,58 @@ import wxShareModel from "../models/wxShare-model.js";
import homeApi from "../models/home-model.js";
//微信分享功能
Vue.prototype.wxShare = function(params) {
var params = params || {};
Vue.prototype.wxShare = function (params) {
var params = params || {};
wxShareModel.getWXCheck().then(response =>{
if (response.code != 0) {
return;
}
var jsApiSignConfig = response.response.jsApiSignConfig;
wx.config({
debug: false, // 开启调试模式,开发时可以开启
appId: jsApiSignConfig.appId, // 必填,公众号的唯一标识 由接口返回
timestamp: jsApiSignConfig.timestamp, // 必填,生成签名的时间戳 由接口返回
nonceStr: jsApiSignConfig.nonceStr, // 必填,生成签名的随机串 由接口返回
signature: jsApiSignConfig.signature, // 必填,签名 由接口返回
jsApiList: [
"onMenuShareAppMessage",
"onMenuShareTimeline",
"onMenuShareQQ",
"onMenuShareWeibo",
"onMenuShareQZone"
]
});
wxShareModel.getShare(params).then(response => {
if (response.code != 0) {
return;
}
var jsApiSignConfig = response.response.jsApiSignConfig;
var shareConfig = response.response.shareConfig;
var couponNo = response.response.couponNo
wx.config({
debug: false, // 开启调试模式,开发时可以开启
appId: jsApiSignConfig.appId, // 必填,公众号的唯一标识 由接口返回
timestamp: jsApiSignConfig.timestamp, // 必填,生成签名的时间戳 由接口返回
nonceStr: jsApiSignConfig.nonceStr, // 必填,生成签名的随机串 由接口返回
signature: jsApiSignConfig.signature, // 必填,签名 由接口返回
jsApiList: [
"onMenuShareAppMessage",
"onMenuShareTimeline",
"onMenuShareQQ",
"onMenuShareWeibo",
"onMenuShareQZone"
]
});
var urlParams = '';
let uuniqueId = this.$cookies.get('1hjz_mall_unique_id')
if(couponNo !== undefined && couponNo !== null && couponNo !== ""){
urlParams = '?batchNo='+ couponNo
if (couponNo !== undefined && couponNo !== null && couponNo !== "") {
urlParams = '?batchNo=' + couponNo
}
if (uuniqueId !== undefined && uuniqueId !== null && uuniqueId !== "") {
if (urlParams.length > 0) {
urlParams += '&uniqueId=' + uuniqueId
} else {
urlParams = '?uniqueId=' + uuniqueId
}
}
if(uuniqueId !== undefined && uuniqueId !== null && uuniqueId !== ""){
if(urlParams.length > 0){
urlParams+='&uniqueId='+ uuniqueId
} else{
urlParams = '?uniqueId='+ uuniqueId
let estateStr = localStorage.getItem("estate") || "";
if(estateStr && estateStr.length > 0){
let estateArr = estateStr.split("&");
let estateId = estateArr[0];
if (estateId !== undefined && estateId !== null && estateId !== "") {
if (urlParams.length > 0) {
urlParams += '&estateId=' + estateId
} else {
urlParams = '?estateId=' + estateId
}
}
}
wx.ready(() => {
//获取“分享给朋友”按钮点击状态及自定义分享内容接口
@ -49,123 +64,67 @@ Vue.prototype.wxShare = function(params) {
// 分享给朋友
title: shareConfig.title, // 分享标题
desc: shareConfig.desc, // 分享描述
link: shareConfig.url+urlParams, // 分享链接 默认以当前链接
link: shareConfig.url + urlParams, // 分享链接 默认以当前链接
imgUrl: shareConfig.img, // 分享图标
success: function(res) {
}
success: function (res) {}
});
//转发到朋友圈
wx.onMenuShareTimeline({
title: shareConfig.title, // 分享标题
desc: shareConfig.desc, // 分享描述
link: shareConfig.url+urlParams, // 分享链接 默认以当前链接
link: shareConfig.url + urlParams, // 分享链接 默认以当前链接
imgUrl: shareConfig.img, // 分享图标
success: function(res) {}
success: function (res) {}
});
//微信分享qq
wx.onMenuShareQQ({
title: shareConfig.title, // 分享标题
desc: shareConfig.desc, // 分享描述
link: shareConfig.url+urlParams, // 分享链接 默认以当前链接
link: shareConfig.url + urlParams, // 分享链接 默认以当前链接
imgUrl: shareConfig.img, // 分享图标
success: function(res) {}
success: function (res) {}
});
//获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口
wx.onMenuShareWeibo({
title: shareConfig.title, // 分享标题
desc: shareConfig.desc, // 分享描述
link: shareConfig.url+urlParams, // 分享链接 默认以当前链接
link: shareConfig.url + urlParams, // 分享链接 默认以当前链接
imgUrl: shareConfig.img, // 分享图标
success: function(res) {}
success: function (res) {}
});
//获取“分享到QQ空间”按钮点击状态及自定义分享内容接口(即将废弃)
wx.onMenuShareQZone({
title: shareConfig.title, // 分享标题
desc: shareConfig.desc, // 分享描述
link: shareConfig.url+urlParams, // 分享链接 默认以当前链接
link: shareConfig.url + urlParams, // 分享链接 默认以当前链接
imgUrl: shareConfig.img, // 分享图标
success: function(res) {}
success: function (res) {}
});
// 首次进入页面进会弹窗确认地理位置
if (localStorage.getItem("latitude") == null) {
wx.getLocation({
type: "gcj02", // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
success: function (res) {
localStorage.setItem("latitude", res.latitude);
localStorage.setItem("longitude", res.longitude);
},
cancel: function () {
alert("拒绝定位");
}
});
} else {
}
// alert("lat:" + localStorage.getItem("latitude") + ";lng:" + localStorage.getItem("longitude"));
wx.error(function (res) {
console.log("--------wx")
// alert("wx-js初始化: " + res);
});
});
});
};
});
//Vue.prototype.wxShares = function(params) {
// var wxconfigApi = 'http://1hjz.3ncto.com.cn/mall/web/share/config';
// axios.get(wxconfigApi,{params:params}).then(function(response) {
//
// var response = response
// console.log('1111',response)
// var jsApiSignConfig = response.data.data.jsApiSignConfig
// var shareConfig = response.data.data.shareConfig
//
// wx.config({
// debug: false, // 开启调试模式,开发时可以开启
// appId: jsApiSignConfig.appId, // 必填,公众号的唯一标识 由接口返回
// timestamp: jsApiSignConfig.timestamp, // 必填,生成签名的时间戳 由接口返回
// nonceStr: jsApiSignConfig.nonceStr, // 必填,生成签名的随机串 由接口返回
// signature: jsApiSignConfig.signature, // 必填,签名 由接口返回
// jsApiList: ['onMenuShareAppMessage','onMenuShareTimeline','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone']
// })
//
// wx.ready(() => {
// //获取“分享给朋友”按钮点击状态及自定义分享内容接口
// wx.onMenuShareAppMessage({ // 分享给朋友
// title: shareConfig.title, // 分享标题
// desc: shareConfig.desc, // 分享描述
// link: shareConfig.url, // 分享链接 默认以当前链接
// imgUrl: shareConfig.img, // 分享图标
// success: function(res){
// }
// })
// //转发到朋友圈
// wx.onMenuShareTimeline({
// title: shareConfig.title, // 分享标题
// desc: shareConfig.desc, // 分享描述
// link: shareConfig.url, // 分享链接 默认以当前链接
// imgUrl: shareConfig.img, // 分享图标
// success: function(res){
// }
// });
// //微信分享qq
// wx.onMenuShareQQ({
// title: shareConfig.title, // 分享标题
// desc: shareConfig.desc, // 分享描述
// link: shareConfig.url, // 分享链接 默认以当前链接
// imgUrl: shareConfig.img, // 分享图标
// success: function(res){
// }
// });
//
// //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口
// wx.onMenuShareWeibo({
// title: shareConfig.title, // 分享标题
// desc: shareConfig.desc, // 分享描述
// link: shareConfig.url, // 分享链接 默认以当前链接
// imgUrl: shareConfig.img, // 分享图标
// success: function(res){
// }
// });
//
// //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口(即将废弃)
// wx.onMenuShareQZone({
// title: shareConfig.title, // 分享标题
// desc: shareConfig.desc, // 分享描述
// link: shareConfig.url, // 分享链接 默认以当前链接
// imgUrl: shareConfig.img, // 分享图标
// success: function(res){
// }
// });
// })
//
//
//
//
// })
// .catch(function(error) {
// console.log(error);
// });
//
//}
}

7
src/router/index.js

@ -11,6 +11,7 @@ const putMoneySuccess = resolve =>
const serviceEvaluationStatus = resolve =>
require(["@/view/service-evaluation-status"], resolve);
const home = resolve => require(["@/view/home"], resolve);
const chooseCommnity = resolve => require(["@/view/choose-community"], resolve);
const poster = resolve => require(["@/view/poster"], resolve);
const demo = resolve => require(["@/view/demo"], resolve);
const goodsClassify = resolve => require(["@/view/goods-classify"], resolve);
@ -56,6 +57,11 @@ let router = new Router({
name: "首页",
component: home
},
{
path: "/choose-community",
name: "选择小区",
component: chooseCommnity
},
{
path: "/poster",
name: "分销海报",
@ -94,6 +100,7 @@ let router = new Router({
path: "/demo",
component: resolve => require(["@/view/demo.vue"], resolve)
}
]
});

20
src/utils/scroll.js

@ -0,0 +1,20 @@
/**
* 本文件用于 keep-alive的页面返回离开前的位置使用
* 未知 Vue-Router scrollBehavior 记录有误所以使用手动记录位置
*/
var myScroll = {
activated() {
console.log("pageNum---pages:"+this.pageNum,this.pages)
if (this.pageNum < this.pages) this.busy = false
this.$nextTick(function() {
const position = this.$route.meta.savedPosition // 返回页面取出来
window.scroll(0, position)
})
},
deactivated() {
this.busy = true
}
}
export default myScroll

485
src/view/choose-community.vue

@ -0,0 +1,485 @@
<template>
<form action="javascript:return true">
<div class="container" style="background:#fff">
<div class="top f-bb-gray">
<img src="../assets/images/icon/arrow-left.png" v-on:click="goBack" />选择小区
</div>
<!--搜索和筛选-->
<div class="f-flex f-flex-justify f-mr16 f-ml15 " style="background: #EDEDED;margin-top:5px;height: 35px;">
<div class="f-flex f-mr16 f-ml15 f-ws-nowrap" @click="show = true">
<div :class="show?'f-font-13 text-blue f-mr3':'f-font-13 f-text-666 f-mr3'">
{{defaultCity}}
</div>
<div :class="show?'triangle_border_top':'triangle_border_down'">
</div>
</div>
<el-input type="search" style="border-left: 1px solid #c1c1c1;" placeholder="请输入小区名称" v-model="communityName" @keyup.enter.native="searchByName" @clear="clear" clearable>
<i slot="prefix" class="el-input__icon el-icon-search"></i>
</el-input>
</div>
<div class="content" style="margin-bottom: 50px;">
<div v-if="nowEstate.length > 0" style="border-bottom: 10px solid #f3f3f3;">
<div class="title">
<span class="f-ml15 f-font-14 f-text-666">当前小区</span>
</div>
<div class="f-flex f-flex-justify f-h60 f-ml15 f-mr15" style="border-bottom: 1px solid #f3f3f3;">
<div>
<div class="f-text-333 f-font-16">{{nowEstate}}</div>
<div class="f-text-666 f-font-12">{{nowAddress}}</div>
</div>
<div class="f-text-666 f-font-12 "></div>
</div>
</div>
<div>
<div class="title">
<span class="f-ml15 f-font-14 f-text-666">附近小区</span>
</div>
<div v-for="item in communityList" :key="item.housingEstateId" v-if="item.housingEstateId !== estateId" class="f-flex f-flex-justify f-h60 f-ml15 f-mr15" style="border-bottom: 1px solid #f3f3f3;" @click="chooseCommunity(item)">
<div>
<div class="f-text-333 f-font-16">{{item.housingEstateName}}</div>
<div class="f-text-666 f-font-12">{{item.prefixAddress}}</div>
</div>
<div class="f-text-666 f-font-12 ">距离{{item.distance}}m</div>
</div>
</div>
<!-- 无限加载 -->
<div :class="loadMoreHide ? 'load-more-hide' : 'load-more-normal'" v-infinite-scroll="fetchCommunityList" infinite-scroll-disabled="busy" infinite-scroll-distance="10">
<span class="load-more-tips f-flex f-flex-center" v-show="!noRecords && loadMoreTips" style="padding-top:4px">没有更多了</span>
</div>
</div>
<popup-picker :show="show" @cancel="cancel" @confirm="confirm" :data-list="addressData" :value="addressValue"></popup-picker>
<!-- Loading -->
<loading :show="showLoading" text="loading"></loading>
</div>
</form>
</template>
<script>
import myScroll from "@/utils/scroll";
import chooseCommunityApi from "../models/choose-community";
import homeApi from "../models/home-model.js";
import { Alert, Toast, Loading } from "vux";
import popupPicker from "../components/popup-picker.vue";
import chooseCommunity from "../api/chooseCommunity";
import { countPartner } from "@/common/util";
import { isEmpty } from "@/common/util";
export default {
components: {
Toast,
Loading,
Alert,
"popup-picker": popupPicker
},
data() {
return {
show: false,
templateNo: this.$route.query.templateNo || "",
defaultCity: "天河区",
districtId: "440106000", //id
provinceId: "",
cityId: "",
estateId: "",
nowEstate: "",
nowAddress: "",
lat: -1,
lng: -1,
addressData: [],
addressValue: [
"440000000&广东省",
"440100000&广州市",
"440106000&天河区&2"
],
communityName: "",
communityList: [],
pageSize: 10,
pageNum: 0,
isRequesting: false,
loadMoreHide: false,
loadMoreTips: false,
loadingShow: false, //
busy: false, //
noRecords: false, //
noRecordsText: "没有当前城市的小区数据",
showLoading: false
};
},
beforeRouteLeave(to, from, next) {
from.meta.keepAlive = false;
next();
},
mixins: [myScroll],
methods: {
getCity() {
let _this = this;
var geolocation = new BMap.Geolocation();
geolocation.getCurrentPosition(function(r) {
if (this.getStatus() == BMAP_STATUS_SUCCESS) {
// if(r.accuracy==null){
// alert('');
// //
// return;
// }else{
const myGeo = new BMap.Geocoder();
myGeo.getLocation(new BMap.Point(r.point.lng, r.point.lat), data => {
if (data.addressComponents) {
const result = data.addressComponents;
const location = {
creditLongitude: r.point.lng, //
creditLatitude: r.point.lat, //
creditProvince: result.province || "", //
creditCity: result.city || "", //
creditArea: result.district || "", //
creditStreet:
(result.street || "") + (result.streetNumber || "") //
};
_this.location = location;
localStorage.setItem("latitude", location.creditLatitude);
localStorage.setItem("longitude", location.creditLongitude);
// alert(
// "-" +
// location.creditProvince +
// ";-" +
// location.creditCity +
// ";-" +
// location.creditArea +
// ";-" +
// location.creditStreet +
// ";lat-" +
// location.creditLatitude +
// ";lng-" +
// location.creditLongitude
// );
}
});
// }
}
});
},
//
goBack() {
// history.go(-1)
let estateStr = localStorage.getItem("estate") || "";
if (!estateStr || estateStr.length == 0) {
this.$vux.toast.text("请选择一个小区", "middle");
return;
}
if (isEmpty(this.templateNo)) {
this.$router.push({
name: "首页"
});
} else {
history.go(-1);
}
},
//
confirm(list) {
console.log("list:" + list);
// let addressArr = list.split(",");
let arr = list[2].split("&") || "";
this.districtId = arr[0];
this.defaultCity = arr[1];
this.addressValue = list.slice();
console.log("arr:" + this.defaultCity);
// localStorage.setItem("cityName", list);
this.show = false;
this.pageNum = 0;
this.busy = false;
this.loadMoreHide = false;
this.loadMoreTips = false;
this.communityList = [];
this.fetchCommunityList();
},
cancel() {
this.show = false;
},
clear() {
console.log("communityName11:" + this.communityName);
//
this.showFlag = false;
this.communityName = "";
this.busy = false;
this.pageNum = 0;
this.loadMoreHide = false;
this.loadMoreTips = false;
this.communityList = [];
this.fetchCommunityList();
},
searchByName(event) {
this.showFlag = false;
if (event.keyCode === 13) {
event.preventDefault(); //
this.pageNum = 0;
this.busy = false;
this.loadMoreHide = false;
this.loadMoreTips = false;
this.communityList = [];
this.fetchCommunityList();
}
},
fetchCommunityList() {
if (this.isRequesting || this.loadMoreHide) {
return;
}
this.isRequesting = true;
//this.busy = true;
var _this = this;
console.log("communityName:" + this.defaultCity);
return new Promise((resolve, reject) => {
var params = {
pageNo: this.pageNum,
pageSize: this.pageSize,
districtId: this.districtId,
estateName: this.communityName,
draw: 0,
lat: this.lat,
lng: this.lng
};
chooseCommunityApi.getEstateList(params).then(res => {
_this.showLoading = false;
_this.isRequesting = false;
if (res.code == 0) {
_this.communityList = _this.communityList.concat(res.dataList);
if (!_this.communityList.length) _this.noRecords = true;
if (_this.pageSize > res.dataList.length) {
_this.busy = true; //
_this.loadMoreHide = true;
_this.loadMoreTips = true;
} else {
_this.busy = false;
_this.pageNum++;
_this.loadMoreHide = false;
_this.loadMoreTips = false;
}
// this.communityList = res.dataList;
} else {
this.$vux.toast.text(res.msg, "middle");
}
resolve();
});
});
},
chooseCommunity(item) {
this.addressValue = [
item.provinceId + "&" + item.provinceName,
item.cityId + "&" + item.cityName,
item.districtId + "&" + item.districtName + "&" + item.merchantNo
];
this.$vux.confirm.show({
title: "确定选择",
content: item.cityName+item.districtName +"【" + item.housingEstateName + "】",
confirmText: "确定",
cancelText: "取消",
onCancel: () => {},
onConfirm: () => {
this.estateId = item.housingEstateId;
if (isEmpty(this.templateNo)) {
localStorage.setItem("cityName", this.addressValue.slice());
localStorage.setItem(
"estate",
item.housingEstateId + "&" + item.housingEstateName
);
this.estateId = item.housingEstateId;
countPartner();
this.$router.push({
name: "首页"
});
} else {
chooseCommunityApi
.getGoodsTemlate({
templateNo: this.templateNo,
housingEstateId: this.estateId ? this.estateId : ""
})
.then(res => {
this.showLoading = false;
if (res.code === 0) {
localStorage.setItem("cityName", this.addressValue.slice());
localStorage.setItem(
"estate",
item.housingEstateId + "&" + item.housingEstateName
);
countPartner();
//
window.location.href =
"/mall/web/vgoods/detail/" + res.response.goodsNo;
} else {
this.$vux.confirm.show({
title: "无服务",
content: item.housingEstateName + "暂无提供此商品服务",
confirmText: "确定",
onConfirm: () => {
localStorage.setItem(
"cityName",
this.addressValue.slice()
);
localStorage.setItem(
"estate",
item.housingEstateId + "&" + item.housingEstateName
);
this.$router.push({
name: "首页"
});
}
});
}
})
.catch(error => {
this.showLoading = false;
});
}
}
});
// this.$router.push({
// name: ""
// });
},
ShareWenXin() {
var merchantNo = this.merchantNo;
this.wxShare({
merchantNo: merchantNo,
source: 0,
url: encodeURIComponent(location.href),
shareUrl: encodeURIComponent("http://" + location.host + "/v2/home")
});
},
countExtend() {
return new Promise((resolve, reject) => {
var params = {
buryingPointType: 0,
salesmanUniqueIdentity: this.uniqueId,
timeStr: this.getTime(Date.now())
};
homeApi.countExtend(params).then(res => {
resolve();
});
});
},
getTime(time) {
let date = new Date(time);
let year = date.getFullYear();
let month = this.checkTime(date.getMonth() + 1);
let day = this.checkTime(date.getDate());
let str = year + "-" + month + "-" + day;
return str;
},
checkTime(i) {
if (i < 10) {
i = "0" + i;
}
return i;
},
getAddressInfo() {
this.getId();
this.showLoading = true;
return new Promise((resolve, reject) => {
chooseCommunityApi
.getAddressInfo({
cityId: this.cityId ? this.cityId : "",
estateId: this.estateId ? this.estateId : "",
lat: this.lat,
lng: this.lng
})
.then(res => {
if (res.response.allAddress && res.response.userAddress) {
this.addressData = res.response.allAddress;
this.flag = true;
this.fetchCommunityList();
resolve();
}
this.showLoading = false;
})
.catch(error => {
this.showLoading = false;
});
});
},
getId() {
let str = localStorage.getItem("cityName") || "";
let estateStr = localStorage.getItem("estate") || "";
this.lat = localStorage.getItem("latitude") || -1;
this.lng = localStorage.getItem("longitude") || -1;
// this.lng = 23.127191
// this.lat = 113.355747
if (!str) {
} else {
let arr = str.split(",");
this.addressValue = arr;
this.provinceId = arr[0].split("&")[0];
this.cityId = arr[1].split("&")[0];
let cityNameArr = arr[2].split("&");
this.districtId = cityNameArr[0];
this.defaultCity = cityNameArr[1];
this.merchantNo = cityNameArr[2];
this.nowAddress =
arr[0].split("&")[1] + arr[1].split("&")[1] + cityNameArr[1];
}
if (!estateStr) {
} else {
let estateArr = estateStr.split("&");
this.estateId = estateArr[0];
this.nowEstate = estateArr[1];
}
let eId = this.$route.query.estateId;
if (eId !== undefined && eId !== null && eId !== "") {
this.estateId = eId;
}
}
},
mounted() {
//
var ua = window.navigator.userAgent.toLowerCase();
//uaMicroMessenger
let _this = this;
if (ua.match(/MicroMessenger/i) == "micromessenger") {
//
this.wxLocation({});
} else {
// TODO api
this.getCity();
}
this.getAddressInfo();
}
};
</script>
<style lang="scss" scoped>
.container {
background-color: #fff;
-webkit-search-cancel-button{
-webkit-appearance: none!important;//×
};
.top {
position: relative;
width: 100%;
height: 0.9rem;
line-height: 0.9rem;
text-align: center;
font-size: 0.36rem;
color: #249e6c;
img {
position: absolute;
width: 0.2rem;
height: 0.35rem;
top: 50%;
left: 0.4rem;
margin-top: -0.17rem;
}
}
.content {
width: 100%;
background: #fff;
-webkit-overflow-scrolling: touch;
.title {
margin-top: 10px;
line-height: 35px;
height: 35px;
width: 100%;
border-bottom: 1px solid #f3f3f3;
}
}
}
</style>

2
src/view/goods-classify.vue

@ -17,7 +17,7 @@
</div>
<div class="right" ref="foodWrapper">
<div>
<div v-if="goodsList.length != 0" v-for="(item,index) in goodsList" :key="index" class="food-list-hook">
<div v-for="(item,index) in goodsList" :key="index" class="food-list-hook">
<p class="title">{{item.combinationName}}</p>
<div class="f-relative f-all-1px" v-for="(goods,k) in item.goodsList" :key="k">
<a style="display:block" :href="'/mall/web/vgoods/detail/' + goods.goodsNo ">

1692
src/view/home.vue
File diff suppressed because it is too large
View File

475
src/view/month-card.vue

@ -1,82 +1,84 @@
<template>
<div class="">
<div class="m-slider">
<img src="../assets/images/slider-img.png" width="100%" height="100%" alt="">
</div>
<div class="">
<div class="m-slider">
<img src="../assets/images/slider-img.png" width="100%" height="100%" alt="">
</div>
<div class="month-card-title f-text-center">
<h4 class="">{{getData.goodsName}}</h4>
<p class="f-mt5">{{getData.shortDesc}}</p>
<p class="f-price f-mt10 f-flex justify-center">
<span class="s-gray f-mr15">市场价 : &nbsp;<span class="line-through">{{getData.originalPrice | numFilter}}</span></span>
<span>券后价 : </span><span class="f-font-23 s-red">{{getData.couponPrice | numFilter}}</span>
</p>
</div>
<div class="month-card-title f-text-center">
<h4 class="">{{getData.goodsName}}</h4>
<p class="f-mt5">{{getData.shortDesc}}</p>
<p class="f-price f-mt10 f-flex justify-center">
<span class="s-gray f-mr15">市场价 : &nbsp;<span class="line-through">{{getData.originalPrice | numFilter}}</span></span>
<span>券后价 : </span><span class="f-font-23 s-red">{{getData.couponPrice | numFilter}}</span>
</p>
</div>
<div class="month-card-area">
<div class="month-card f-flex" style="margin-bottom: -35px;">
<div class="month-card-left" style="width: 76%;">
<div class="f-flex f-mt9">
<div class="f-mb20 f-mr10">
<p v-show="getData.type != 3" class="f-font-15" style="line-height:1;"></p>
<!-- 定额券 -->
<div v-show="getData.type == 1" class="f-bold f-font-45" style="text-shadow: 1px 1px #852B0E;">{{getData.amount | numFilter}}</div>
<!-- 满减券 -->
<div v-show="getData.type == 2" class="f-bold f-font-45" style="text-shadow: 1px 1px #852B0E;">{{getData.amount | numFilter}}</div>
<!-- 折扣 -->
<div v-show="getData.type == 3" class="f-bold f-font-45" style="text-shadow: 1px 1px #852B0E;">{{Number(getData.discount/10)}}</div>
<!-- 定额券 -->
<p v-show="getData.type != 2" class="f-font-12 f-mt5" style="margin-left: 6px;">{{couponType[getData.type]}}</p>
<!-- 满减券 -->
<p v-show="getData.type == 2" class="f-font-12 f-mt5" style="margin-left: 6px;">{{getData.fullAmount | numFilter}}可用</p>
</div>
<div class="f-mb20">
<p class="new-man">{{getData.batchName}}</p>
<p class="limit-buy">({{getData.goodsDesc}})</p>
<p class="end-date">{{getData.invalidTimeDesc}}</p>
</div>
</div>
</div>
<div class="month-card-right justify-center" style="margin-left:10px;">
<div v-show="getData.couponStatus == 0" class="f-mt-15 f-flex">
<img src="../assets/images/arrow-right_03.png" width="7" height="12" alt="" class="f-mr15">
<button class="get-btn" v-on:click="handleGetCoupon">点击领取</button>
</div>
<img v-show="getData.couponStatus > 0" src="../assets/images/get.png" width="60" height="60" alt="" class="f-mt-10">
</div>
</div>
<div class="f-mt10 f-text-center" v-show="getData.couponStatus > 0">
<div class="month-card-area">
<div class="month-card f-flex" style="margin-bottom: -35px;">
<div class="month-card-left" style="width: 76%;">
<div class="f-flex f-mt9">
<div class="f-mb20 f-mr10">
<p v-show="getData.type != 3" class="f-font-15" style="line-height:1;"></p>
<!-- 定额券 -->
<div v-show="getData.type == 1" class="f-bold f-font-45" style="text-shadow: 1px 1px #852B0E;">{{getData.amount | numFilter}}</div>
<!-- 满减券 -->
<div v-show="getData.type == 2" class="f-bold f-font-45" style="text-shadow: 1px 1px #852B0E;">{{getData.amount | numFilter}}</div>
<!-- 折扣 -->
<div v-show="getData.type == 3" class="f-bold f-font-45" style="text-shadow: 1px 1px #852B0E;">{{Number(getData.discount/10)}}</div>
<button style="background-color:#F45252" v-show="getData.couponStatus != 30" v-on:click="handleUseCoupon" class="btn-md bg-gray s-white f-font-18">立即使用</button>
<!-- 定额券 -->
<p v-show="getData.type != 2" class="f-font-12 f-mt5" style="margin-left: 6px;">{{couponType[getData.type]}}</p>
<button v-show="getData.couponStatus == 30" v-on:click="handleUseCoupon" class="btn-md bg-gray s-white f-font-18">已使用</button>
<!-- 满减券 -->
<p v-show="getData.type == 2" class="f-font-12 f-mt5" style="margin-left: 6px;">{{getData.fullAmount | numFilter}}可用</p>
</div>
<div style="padding: 0 10px 20px;">
<p class="s-gray-1 f-font-11 f-mt20" style="line-height: 18px;">使用范围{{getData.authAreaStr}}</p>
<p class="f-mt10 f-font-11 s-orange-2">
使用流程领券下单关注公众号预约服务
</p>
<div class="f-text-center">
<div class="qrcode-img">
<img src="../assets/images/qrcode.png" width='100%' height="100%" alt="">
</div>
<p class="f-font-11 f-mt5 s-black-1">预约服务请关注公众号</p>
</div>
<div class="f-mb20">
<p class="new-man">{{getData.batchName}}</p>
<p class="limit-buy">({{getData.goodsDesc}})</p>
<p class="end-date">{{getData.invalidTimeDesc}}</p>
</div>
</div>
</div>
<div class="month-card-right justify-center" style="margin-left:10px;">
<div v-show="getData.couponStatus == 0" class="f-mt-15 f-flex">
<img src="../assets/images/arrow-right_03.png" width="7" height="12" alt="" class="f-mr15">
<button class="get-btn" v-on:click="handleGetCoupon">点击领取</button>
</div>
<img v-show="getData.couponStatus > 0" src="../assets/images/get.png" width="60" height="60" alt="" class="f-mt-10">
</div>
</div>
<div class="f-mt10 f-text-center" v-show="getData.couponStatus > 0">
<button style="background-color:#F45252" v-show="getData.couponStatus != 30" v-on:click="handleUseCoupon" class="btn-md bg-gray s-white f-font-18">立即使用</button>
<button v-show="getData.couponStatus == 30" v-on:click="handleUseCoupon" class="btn-md bg-gray s-white f-font-18">已使用</button>
</div>
<div style="padding: 0 10px 20px;">
<p class="s-gray-1 f-font-11 f-mt20" style="line-height: 18px;">使用范围{{getData.authAreaStr}}</p>
<p class="f-mt10 f-font-11 s-orange-2">
使用流程领券下单关注公众号预约服务
</p>
<div class="f-text-center">
<div class="qrcode-img">
<img src="../assets/images/qrcode.png" width='100%' height="100%" alt="">
</div>
<p class="f-font-11 f-mt5 s-black-1">预约服务请关注公众号</p>
</div>
</div>
</div>
</div>
</template>
<script>
import couponModel from "../models/coupon-model";
import configs from "../configs";
import { Alert, Toast, Popup, Picker } from "vux";
import Qs from 'qs';
import Qs from "qs";
import homeApi from "../models/home-model.js";
import { isEmpty } from "@/common/util";
import chooseCommunityApi from "../models/choose-community";
var strCookie = document.cookie;
var cookieName = "1hjz_mall_login_access_token=";
@ -84,171 +86,210 @@ var token = strCookie.slice(cookieName.length);
var locationUrl = configs.locationUrl;
export default {
data() {
return {
uniqueId:this.$route.query.uniqueId,
loading: false,
getData: {},
couponType: {
"1": "定额券",
"2": "满减券",
"3": "折扣券"
},
batchNo: this.$route.query.batchNo
data() {
return {
uniqueId: this.$route.query.uniqueId,
loading: false,
getData: {},
couponType: {
"1": "定额券",
"2": "满减券",
"3": "折扣券"
},
batchNo: this.$route.query.batchNo
};
},
components: {
Toast,
Popup,
Picker
},
methods: {
//
handleInit() {
let that = this;
//
couponModel.getCouponInfo(that.batchNo, token).then(function(result) {
// console.log("xx",result.response);
that.loading = false;
if (result.code == 0) {
if (result.response.isLogin) {
that.sourceUser();
}
that.getData = result.response;
} else {
console.log(result.msg);
// alert(result.msg);
}
});
},
countExtend() {
return new Promise((resolve, reject) => {
var params = {
buryingPointType: 0,
salesmanUniqueIdentity: this.uniqueId,
timeStr: this.getTime(Date.now())
};
homeApi.countExtend(params).then(res => {
resolve();
});
});
},
components: {
Toast,
Popup,
Picker
getTime(time) {
let date = new Date(time);
let year = date.getFullYear();
let month = this.checkTime(date.getMonth() + 1);
let day = this.checkTime(date.getDate());
let str = year + "-" + month + "-" + day;
return str;
},
methods: {
//
handleInit() {
let that = this;
//
couponModel
.getCouponInfo(that.batchNo, token)
.then(function(result) {
// console.log("xx",result.response);
that.loading = false;
if (result.code == 0) {
if (result.response.isLogin) {
that.sourceUser();
}
that.getData = result.response;
} else {
console.log(result.msg);
// alert(result.msg);
}
});
},
countExtend() {
return new Promise((resolve, reject) => {
var params = {
buryingPointType: 0,
salesmanUniqueIdentity: this.uniqueId,
timeStr: this.getTime(Date.now())
};
homeApi.countExtend(params).then(res => {
resolve();
});
});
},
getTime(time) {
let date = new Date(time);
let year = date.getFullYear();
let month = this.checkTime(date.getMonth() + 1);
let day = this.checkTime(date.getDate());
let str =
year + "-" + month + "-" + day;
return str;
},
checkTime(i) {
if (i < 10) {
i = "0" + i;
}
return i;
},
// 使
handleUseCoupon() {
window.location.href =
locationUrl + "/mall/web/vgoods/detail/" + this.getData.goodsNo;
},
//
handleGetCoupon() {
let that = this;
this.loading = true;
let params = {
batchNo: that.batchNo
};
//
couponModel.giveCoupon(params, token).then(function(result) {
that.loading = false;
console.log("信息", result);
if (result.code === 0 || result.code === 3) {
that.$vux.toast.text("领取成功!", "middle");
that.handleInit();
} else if (result.code === 666) {
that.$vux.toast.text("您还没登录,请先登录!", "middle");
setTimeout(function() {
window.location.href =
locationUrl +
"/mall/web/user/login?callback=" +
encodeURIComponent(window.location.href);
}, 1000);
} else {
if (
result.msg === "" ||
result.msg === undefined ||
result.msg == null
) {
result.msg = "操作失败,请刷新重试";
}
alert(result.msg);
}
});
},
sourceUser() {
var sourceUserId = this.$route.query.sourceUserId;
if (sourceUserId) {
couponModel.sourceUser(sourceUserId).then(res => {});
}
}
checkTime(i) {
if (i < 10) {
i = "0" + i;
}
return i;
},
filters: {
numFilter(value) {
//
let transformVal = Number(value / 100).toFixed(1);
let realVal = transformVal.substring(0, transformVal.length - 1);
// num.toFixed(3)
return Number(realVal);
}
// 使
handleUseCoupon() {
window.location.href =
locationUrl + "/mall/web/vgoods/detail/" + this.getData.goodsNo;
},
mounted() {
// let uuniqueId = Qs.parse(location.search.substring(1)).uniqueId
var url = location.href.split('?')[0]
if(this.uniqueId === undefined || this.uniqueId === null || this.uniqueId === ""){
this.uniqueId = ''
//
handleGetCoupon() {
let that = this;
this.loading = true;
let params = {
batchNo: that.batchNo
};
//
couponModel.giveCoupon(params, token).then(function(result) {
that.loading = false;
console.log("信息", result);
if (result.code === 0 || result.code === 3) {
that.$vux.toast.text("领取成功!", "middle");
that.handleInit();
} else if (result.code === 666) {
that.$vux.toast.text("您还没登录,请先登录!", "middle");
setTimeout(function() {
window.location.href =
locationUrl +
"/mall/web/user/login?callback=" +
encodeURIComponent(window.location.href);
}, 1000);
} else {
if (
result.msg === "" ||
result.msg === undefined ||
result.msg == null
) {
result.msg = "操作失败,请刷新重试";
}
alert(result.msg);
}
//
this.handleInit();
// console.log('uniqueId:'+this.uniqueId)
return new Promise((resolve, reject) => {
var params = {
salesmanUniqueIdentity: this.uniqueId,
};
homeApi.updateUniqueId(params).then(res => {
this.showLoading = false;
if (res.code == 0) {
this.uniqueId=this.$cookies.get('1hjz_mall_unique_id')
if(this.uniqueId !== undefined && this.uniqueId !== null && this.uniqueId !== ""){
this.countExtend();
}
this.wxShare({
couponNo: this.batchNo,
source: 20,
url: encodeURIComponent(url)
});
} else {
this.$vux.toast.text(res.msg, "middle");
}
resolve();
});
});
});
},
sourceUser() {
var sourceUserId = this.$route.query.sourceUserId;
if (sourceUserId) {
couponModel.sourceUser(sourceUserId).then(res => {});
}
}
// defaultLocalEstate(estateRes) {
// }
},
filters: {
numFilter(value) {
//
let transformVal = Number(value / 100).toFixed(1);
let realVal = transformVal.substring(0, transformVal.length - 1);
// num.toFixed(3)
return Number(realVal);
}
},
mounted() {
// let uuniqueId = Qs.parse(location.search.substring(1)).uniqueId
var url = location.href.split("?")[0];
if (
this.uniqueId === undefined ||
this.uniqueId === null ||
this.uniqueId === ""
) {
this.uniqueId = "";
}
let eId = this.$route.query.estateId;
var that = this;
if (!isEmpty(eId)) {
chooseCommunityApi
.getEstateInfo({
estateId: eId
})
.then(res => {
if (!isEmpty(res.response)) {
var addressValue =
estateRes.provinceId +
"&" +
estateRes.provinceName +
"," +
estateRes.cityId +
"&" +
estateRes.cityName +
"," +
estateRes.districtId +
"&" +
estateRes.districtName +
"&" +
estateRes.merchantNo;
localStorage.setItem("cityName", addressValue);
localStorage.setItem(
"estate",
estateRes.housingEstateId + "&" + estateRes.housingEstateName
);
}
})
.catch(error => {});
}
//
// console.log('batchNo:'+this.batchNo)
this.handleInit();
return new Promise((resolve, reject) => {
var params = {
salesmanUniqueIdentity: this.uniqueId
};
homeApi.updateUniqueId(params).then(res => {
this.showLoading = false;
if (res.code == 0) {
this.uniqueId = this.$cookies.get("1hjz_mall_unique_id");
if (
this.uniqueId !== undefined &&
this.uniqueId !== null &&
this.uniqueId !== ""
) {
this.countExtend();
}
this.wxShare({
couponNo: this.batchNo,
source: 20,
url: encodeURIComponent(url),
shareUrl: encodeURIComponent(url)
});
} else {
this.$vux.toast.text(res.msg, "middle");
}
resolve();
});
});
}
};
</script>
<style>
body {
background-color: #fff3e8;
background-color: #fff3e8;
}
</style>

1258
src/view/order-check.vue
File diff suppressed because it is too large
View File

2
src/view/order-list.vue

@ -10,7 +10,7 @@
<div class="state-item" @click="active=20" :class="{active:active==20}">退款中</div>
<div class="state-item" @click="active=21" :class="{active:active==21}">已退款</div>
</div>
<order-item v-for="item in list" :id="item.orderNo" :pay="item.payPrice/100" :totalPrice="item.totalPrice/100" :name="item.goodsName" :desc="item.shortDesc" :address="item.merchantName" :status="item.status" :img="imghost+item.goodsImgUrl" :label="item.smallLabel"></order-item>
<order-item v-for="item in list" :key="item.orderNo" :id="item.orderNo" :pay="item.payPrice/100" :totalPrice="item.totalPrice/100" :name="item.goodsName" :desc="item.shortDesc" :address="item.merchantName" :status="item.status" :img="imghost+item.goodsImgUrl" :label="item.smallLabel"></order-item>
</div>
</template>
<script>

Loading…
Cancel
Save