Authored by 毕凯

Merge branch 'feature/family' into 'release/6.2'

family



See merge request !971
Showing 68 changed files with 3946 additions and 45 deletions
  1 +'use strict';
  2 +
  3 +const headerModel = require('../../../doraemon/models/header'); // 头部model
  4 +const family = require('../models/family');
  5 +
  6 +exports.familyIndex = (req, res, next) => {
  7 + let uid = req.user.uid;
  8 + let contentCodeOne = '486e6adc7c83001b2e9e83996438fab8';
  9 + let contentCodeTwo = 'eebbcc60607ac443922d8fabe44eb222';
  10 +
  11 + req.ctx(family).familyIndex(uid, contentCodeOne, contentCodeTwo).then(result => {
  12 + res.render('family/index', {
  13 + page: 'family',
  14 + title: 'family',
  15 + width750: true,
  16 + localCss: true,
  17 + familyIndexData: result
  18 + });
  19 + }).catch(next);
  20 +};
  21 +
  22 +exports.integralCharts = (req, res, next) => {
  23 + let uid = req.user.uid;
  24 +
  25 + req.ctx(family).integralCharts(uid).then(result => {
  26 + res.json(result);
  27 + }).catch(next);
  28 +};
  29 +
  30 +exports.familyVip = (req, res, next) => {
  31 + let udid = req.sessionID || 'yoho';
  32 + let uid = req.user.uid;
  33 + let yohoApp = req.yoho.isApp && !req.yoho.isMarsApp;
  34 + let marsApp = req.yoho.isMarsApp;
  35 +
  36 + req.ctx(family).familyVip(udid, uid, yohoApp, marsApp).then(result => {
  37 + res.json(result);
  38 + }).catch(next);
  39 +};
  40 +
  41 +exports.downLoadData = (req, res, next) => {
  42 + let codeArr = req.query.codeArr;
  43 + let yohoApp = req.yoho.isApp && !req.yoho.isMarsApp;
  44 +
  45 + if (!codeArr) {
  46 + return;
  47 + }
  48 +
  49 + req.ctx(family).downLoadData(codeArr, yohoApp).then(result => {
  50 + res.json(result);
  51 + }).catch(next);
  52 +};
  53 +
  54 +// 设置潮流口令
  55 +exports.setTrendWord = (req, res, next) => {
  56 + let uid = req.user.uid;
  57 + let trendWord = req.query.trendWord;
  58 +
  59 + req.ctx(family).setTrendWord(uid, trendWord).then(result => {
  60 + res.json(result);
  61 + }).catch(next);
  62 +};
  63 +
  64 +exports.coinDetail = (req, res) => {
  65 + let responseData = {
  66 + module: 'home',
  67 + page: 'family-coin',
  68 + pageHeader: headerModel.setNav({
  69 + navTitle: '积分明细'
  70 + }),
  71 + title: 'YOHO!积分明细',
  72 + width750: true,
  73 + localCss: true
  74 + };
  75 +
  76 + res.render('family/coin-detail', responseData);
  77 +};
  78 +
  79 +exports.getCoinData = (req, res, next) => {
  80 + let params = {
  81 + uid: req.user.uid,
  82 + source: req.query.source,
  83 + queryType: req.query.queryType,
  84 + beginTime: req.query.beginTime,
  85 + endTime: req.query.endTime,
  86 + page: req.query.page,
  87 + limit: req.query.limit
  88 + };
  89 +
  90 + req.ctx(family).getCoinData(params).then(result => {
  91 + res.json(result);
  92 + }).catch(next);
  93 +};
  94 +
  95 +exports.userInfo = (req, res, next) => {
  96 + let responseData = {
  97 + module: 'home',
  98 + page: 'family-userInfo',
  99 + pageHeader: headerModel.setNav({
  100 + navTitle: '个人信息'
  101 + }),
  102 + title: 'YOHO!个人信息',
  103 + width750: true,
  104 + localCss: true
  105 + };
  106 +
  107 + let params = {
  108 + uid: req.user.uid,
  109 + isApp: req.yoho.isApp
  110 + };
  111 +
  112 + req.ctx(family).userInfo(params).then(result => {
  113 + res.render('family/user-info', Object.assign(responseData, result));
  114 + }).catch(next);
  115 +};
  116 +
  117 +exports.modify = (req, res, next) => {
  118 + let params = {
  119 + uid: req.user.uid,
  120 + nickName: req.query.nickName,
  121 + gender: req.query.gender,
  122 + birthday: req.query.birthday,
  123 + height: req.query.height,
  124 + weight: req.query.weight,
  125 + province: req.query.province,
  126 + city: req.query.city
  127 + };
  128 +
  129 + req.ctx(family).modify(params).then((result) => {
  130 + res.json(result);
  131 + }).catch(next);
  132 +};
  133 +
  134 +exports.getCity = (req, res, next) => {
  135 + let params = {
  136 + uid: req.user.uid,
  137 + id: req.query.id
  138 + };
  139 +
  140 + req.ctx(family).getCity(params).then((result) => {
  141 + res.json(result);
  142 + }).catch(next);
  143 +};
  144 +
  145 +exports.coinMall = (req, res, next) => {
  146 + let responseData = {
  147 + module: 'home',
  148 + page: 'family-coinMall',
  149 + pageHeader: headerModel.setNav({
  150 + navTitle: '积分商城'
  151 + }),
  152 + title: 'YOHO!积分商城',
  153 + width750: true,
  154 + localCss: true
  155 + };
  156 +
  157 + let params = {
  158 + uid: req.user.uid,
  159 + isMarsApp: req.yoho.isMarsApp,
  160 + isNowApp: req.yoho.isNowApp
  161 + };
  162 +
  163 + req.ctx(family).coinMall(params).then(result => {
  164 + res.render('family/coin-mall', Object.assign(responseData, result));
  165 + }).catch(next);
  166 +};
  167 +
  168 +exports.getList = (req, res, next) => {
  169 + let params = {
  170 + uid: req.user.uid,
  171 + type: req.query.type,
  172 + page: req.query.page,
  173 + limit: req.query.limit
  174 + };
  175 +
  176 + req.ctx(family).getList(params).then((result) => {
  177 + res.json(result);
  178 + }).catch(next);
  179 +};
@@ -5,9 +5,10 @@ const tideCommandModel = require('../models/tide-command'); @@ -5,9 +5,10 @@ const tideCommandModel = require('../models/tide-command');
5 5
6 exports.tideCommand = (req, res, next) => { 6 exports.tideCommand = (req, res, next) => {
7 let uid = req.user.uid, 7 let uid = req.user.uid,
8 - contentCode = '29958987ef0c0f830fad03d7e54f6061'; 8 + contentCode = '29958987ef0c0f830fad03d7e54f6061',
  9 + hideTips = req.query.hideTips === 'true' ? true : false;
9 10
10 - req.ctx(tideCommandModel).invitionData(uid, contentCode).then(result => { 11 + req.ctx(tideCommandModel).invitionData(uid, contentCode, hideTips).then(result => {
11 res.render('tide-command', { 12 res.render('tide-command', {
12 page: 'tide-command', 13 page: 'tide-command',
13 pageHeader: headerModel.setNav({ 14 pageHeader: headerModel.setNav({
  1 +'use strict';
  2 +
  3 +const _ = require('lodash');
  4 +const moment = require('moment');
  5 +const camelCase = global.yoho.camelCase;
  6 +const family = global.yoho.FamilyAPI;
  7 +const service = global.yoho.ServiceAPI;
  8 +const resourcesProcess = require(`${global.utils}/resources-process`);
  9 +const helpers = global.yoho.helpers;
  10 +const crypto = global.yoho.crypto;
  11 +
  12 +class familyModel extends global.yoho.BaseModel {
  13 + constructor(ctx) {
  14 + super(ctx);
  15 + }
  16 +
  17 + /**
  18 + * 个人详情数据
  19 + */
  20 + _userData(uid) {
  21 + if (uid) {
  22 + return family.get('user/getUserInfo.json', {
  23 + uid: uid
  24 + }, {
  25 + code: 200
  26 + });
  27 + } else {
  28 + return Promise.resolve({});
  29 + }
  30 + }
  31 +
  32 + /**
  33 + * 潮流口令
  34 + */
  35 + _getCode(uid) {
  36 + if (uid) {
  37 + return family.get('user/getInvitecode', {
  38 + uid: uid
  39 + }, {
  40 + code: 200
  41 + });
  42 + } else {
  43 + return Promise.resolve({});
  44 + }
  45 + }
  46 +
  47 + /**
  48 + * 资源位
  49 + */
  50 + _getTrendPop(contentCode) {
  51 + return service.get('operations/api/v5/resource/get', {
  52 + content_code: contentCode,
  53 + }, {
  54 + code: 200,
  55 + cache: true
  56 + }).then(result => {
  57 + if (result && result.code === 200 && result.data) {
  58 +
  59 + return resourcesProcess(result.data);
  60 + } else {
  61 + return result;
  62 + }
  63 + });
  64 + }
  65 +
  66 + /**
  67 + * 资源位
  68 + */
  69 + _getdownPop(param) {
  70 + return service.get('operations/api/v5/resource/get', {
  71 + content_code: param.code,
  72 + }, {
  73 + code: 200,
  74 + cache: true
  75 + }).then(result => {
  76 + if (result && result.code === 200 && result.data) {
  77 +
  78 + _.forEach(result.data, function(val) {
  79 + val.appName = param.name;
  80 + });
  81 +
  82 + return resourcesProcess(result.data);
  83 + } else {
  84 + return result;
  85 + }
  86 + });
  87 + }
  88 +
  89 + /**
  90 + * 列表排序
  91 + */
  92 + _sourceSort(source) {
  93 + return function(a, b) {
  94 + let value1 = a[source],
  95 + value2 = b[source];
  96 +
  97 + return value1 - value2;
  98 + };
  99 + }
  100 +
  101 + /**
  102 + * 获取APP列表
  103 + */
  104 + _getAppList(uid) {
  105 + return family.get('vip/getUserVipInfo', {
  106 + uid: uid
  107 + }, {
  108 + code: 200
  109 + }).then((result => {
  110 + if (result && result.data && result.code === 200) {
  111 + let loginList = [];
  112 + let noLoginList = [];
  113 + let appList = [];
  114 +
  115 + _.forEach(result.data, function(val, key) {
  116 + if (val) {
  117 + val.nickname = key;
  118 +
  119 + if (val.login === true) {
  120 + loginList.push(val);
  121 + } else {
  122 + noLoginList.push(val);
  123 + }
  124 + }
  125 + });
  126 +
  127 + loginList.sort(this._sourceSort('source'));
  128 + noLoginList.sort(this._sourceSort('source'));
  129 +
  130 + appList = loginList.concat(noLoginList);
  131 +
  132 + return appList;
  133 + }
  134 + }));
  135 + }
  136 +
  137 + /**
  138 + *查询各个体系成长等级信息及等级特权
  139 + */
  140 + _getVipInfo(udid) {
  141 + return family.get('vip/getVipInfo.json', {
  142 + udid: udid
  143 + }, {
  144 + code: 200
  145 + }).then((result) => {
  146 +
  147 + if (result.data && result.data.mars && result.data.mars.vipLevelList.length > 0) {
  148 + _.forEach(result.data.mars.vipLevelList, function(val) {
  149 + val.name = 'Lv.' + val.level;
  150 + });
  151 + }
  152 +
  153 + return result.data;
  154 + });
  155 + }
  156 +
  157 + /**
  158 + *查询当前用户各个体系成长等级信息及等级特权
  159 + */
  160 + _getUserVipInfo(udid, uid) {
  161 + return family.get('vip/getUserVipInfo.json', {
  162 + udid: udid,
  163 + uid: uid
  164 + }, {
  165 + code: 200
  166 + }).then((result) => {
  167 + if (result && result.data) {
  168 + return result.data;
  169 + } else {
  170 + return {};
  171 + }
  172 + });
  173 + }
  174 +
  175 + /**
  176 + *各个app的会员信息
  177 + */
  178 + familyVip(udid, uid, yohoApp, marsApp) {
  179 + return Promise.all([
  180 + this._getVipInfo(udid),
  181 + this._getUserVipInfo(udid, uid)
  182 + ]).then((result) => {
  183 + _.forEach(result[1], function(val, key) {
  184 + _.forEach(result[0], function(data, index) {
  185 + if (index === key) {
  186 + val = _.assign(val, {
  187 + vipLevelLis: data.vipLevelList
  188 + });
  189 + }
  190 + });
  191 +
  192 + if (key === 'yohobuy') {
  193 + val.showLevel = true;
  194 + if (yohoApp) {
  195 + val.link = '//m.yohobuy.com/home/grade?openby:yohobuy={"action":"go.vipInfo"}';
  196 + } else if (marsApp) {
  197 + val.link = '//m.yohobuy.com/home/grade?openby:yohobuy={"action":"go.h5"}';
  198 + } else {
  199 + val.link = '//m.yohobuy.com/home/grade';
  200 + }
  201 + if (val.growthValue <= 0 || val.growthValue === null) {
  202 + val.percent = 0;
  203 + } else if (val.growthValue > 0 && val.growthValue < 800) {
  204 + val.percent = 17;
  205 + } else if (val.growthValue === 800) {
  206 + val.valpercent = 33;
  207 + } else if (val.growthValue > 800 && val.growthValue < 3000) {
  208 + val.percent = 50;
  209 + } else if (val.growthValue === 3000) {
  210 + val.percent = 67;
  211 + } else if (val.growthValue > 3000 && val.growthValue < 7000) {
  212 + val.percent = 83;
  213 + } else {
  214 + val.percent = 100;
  215 + }
  216 + }
  217 +
  218 + if (key === 'mars') {
  219 + if (yohoApp) {
  220 + val.link = 'yohomars://yohomars.com/goapp?openby:mars=""';
  221 + } else if (marsApp) {
  222 + val.link = '//m.yohobuy.com/home/grade?openby:yohobuy={"action":"go.h5"}';
  223 + } else {
  224 + val.link = 'yohomars://yohomars.com/goapp?openby:mars=""';
  225 + }
  226 + if (val.growthValue <= 100) {
  227 + val.percent = 0;
  228 + } else if (val.growthValue > 100 && val.growthValue < 400) {
  229 + val.percent = 10;
  230 + } else if (val.growthValue === 400) {
  231 + val.valpercent = 20;
  232 + } else if (val.growthValue > 400 && val.growthValue < 1000) {
  233 + val.percent = 30;
  234 + } else if (val.growthValue === 1000) {
  235 + val.percent = 40;
  236 + } else if (val.growthValue > 1000 && val.growthValue < 2000) {
  237 + val.percent = 50;
  238 + } else if (val.growthValue === 2000) {
  239 + val.percent = 60;
  240 + } else if (val.growthValue > 2000 && val.growthValue < 5000) {
  241 + val.percent = 70;
  242 + } else if (val.growthValue === 5000) {
  243 + val.percent = 80;
  244 + } else if (val.growthValue > 5000 && val.growthValue < 10000) {
  245 + val.percent = 90;
  246 + } else {
  247 + val.percent = 100;
  248 + }
  249 + }
  250 +
  251 + if (key === 'green') {
  252 + if (val.growthValue <= 0) {
  253 + val.percent = 0;
  254 + } else if (val.growthValue > 0 && val.growthValue < 1000) {
  255 + val.percent = 17;
  256 + } else if (val.growthValue === 1000) {
  257 + val.valpercent = 33;
  258 + } else if (val.growthValue > 1000 && val.growthValue < 3000) {
  259 + val.percent = 50;
  260 + } else if (val.growthValue === 3000) {
  261 + val.percent = 67;
  262 + } else if (val.growthValue > 3000 && val.growthValue < 5000) {
  263 + val.percent = 83;
  264 + } else {
  265 + val.percent = 100;
  266 + }
  267 + }
  268 +
  269 + if (key === 'green') {
  270 + val.birthShow = true;
  271 + if (val.growthValue <= 0) {
  272 + val.percent = 0;
  273 + } else if (val.growthValue > 0 && val.growthValue < 1000) {
  274 + val.percent = 17;
  275 + } else if (val.growthValue === 1000) {
  276 + val.valpercent = 33;
  277 + } else if (val.growthValue > 1000 && val.growthValue < 3000) {
  278 + val.percent = 50;
  279 + } else if (val.growthValue === 3000) {
  280 + val.percent = 67;
  281 + } else if (val.growthValue > 3000 && val.growthValue < 5000) {
  282 + val.percent = 83;
  283 + } else {
  284 + val.percent = 100;
  285 + }
  286 + }
  287 +
  288 + if (key === 'coffee') {
  289 + if (val.growthValue <= 0) {
  290 + val.percent = 0;
  291 + } else if (val.growthValue > 0 && val.growthValue < 800) {
  292 + val.percent = 25;
  293 + } else if (val.growthValue === 800) {
  294 + val.valpercent = 50;
  295 + } else if (val.growthValue > 800 && val.growthValue < 2000) {
  296 + val.percent = 75;
  297 + } else {
  298 + val.percent = 100;
  299 + }
  300 + }
  301 +
  302 + if (key === 'little') {
  303 + if (val.growthValue <= 0) {
  304 + val.percent = 0;
  305 + } else if (val.growthValue > 0 && val.growthValue < 5000) {
  306 + val.percent = 25;
  307 + } else if (val.growthValue === 5000) {
  308 + val.valpercent = 50;
  309 + } else if (val.growthValue > 5000 && val.growthValue < 10000) {
  310 + val.percent = 75;
  311 + } else {
  312 + val.percent = 100;
  313 + }
  314 + }
  315 + });
  316 +
  317 + return result[1];
  318 + });
  319 + }
  320 +
  321 + /**
  322 + * 下载弹窗数据处理
  323 + */
  324 + _downLoadProce(data, yohoApp) {
  325 + let singleData;
  326 +
  327 + _.forEach(data, function(val) {
  328 + singleData = _.assign(singleData, {
  329 + appName: val.appName,
  330 + imgList: val.data
  331 + });
  332 +
  333 + if (yohoApp) {
  334 + if (val.appName === 'green') {
  335 + singleData = _.assign(singleData, {
  336 + winXinCode: 'YO_GREEN'
  337 + });
  338 + } else if (val.appName === 'coffee') {
  339 + singleData = _.assign(singleData, {
  340 + winXinCode: 'YoCoffeeCN'
  341 + });
  342 + } else if (val.appName === 'little') {
  343 + singleData = _.assign(singleData, {
  344 + winXinCode: 'YOLITTLE_CN'
  345 + });
  346 + }
  347 + }
  348 + });
  349 +
  350 + return singleData;
  351 + }
  352 +
  353 + /**
  354 + * 下载弹窗信息
  355 + */
  356 + downLoadData(codeArr, yohoApp) {
  357 +
  358 + return Promise.map(codeArr, (val) => {
  359 + return this._getdownPop(val);
  360 + }).then((result) => {
  361 + let finData = {
  362 + downLoadData: []
  363 + };
  364 +
  365 + _.forEach(result, (val) => {
  366 + finData.downLoadData.push(this._downLoadProce(val, yohoApp));
  367 + });
  368 +
  369 + return finData;
  370 + });
  371 + }
  372 +
  373 + /**
  374 + * 积分乐园数据
  375 + */
  376 + integralCharts(uid) {
  377 + return family.get('user/getUserCoin', {
  378 + uid: uid
  379 + }, {
  380 + code: 200
  381 + }).then((result) => {
  382 + let chartsData = {};
  383 + let list = [];
  384 + let colorList = [];
  385 +
  386 + if (result && result.data) {
  387 + result.data.data.sort(function(a, b) {
  388 + return b.proportion - a.proportion;
  389 + });
  390 +
  391 + chartsData.total = _.get(result.data, 'total', '');
  392 +
  393 + _.forEach(result.data.data, function(data) {
  394 + list.push({
  395 + value: data.num,
  396 + name: data.source,
  397 + percent: parseInt(data.proportion, 10) * 100 + '%',
  398 + color: data.colour,
  399 + plateType: data.type
  400 + });
  401 +
  402 + colorList.push(data.colour);
  403 + });
  404 +
  405 + chartsData.list = list;
  406 + chartsData.colorList = colorList;
  407 + }
  408 + return chartsData;
  409 + });
  410 + }
  411 +
  412 + /**
  413 + * family主页
  414 + */
  415 + familyIndex(uid, contentCodeOne, contentCodeTwo) {
  416 + return Promise.all([
  417 + this._userData(uid),
  418 + this._getCode(uid),
  419 + this._getAppList(uid),
  420 + this._getTrendPop(contentCodeOne),
  421 + this._getTrendPop(contentCodeTwo),
  422 + this.integralCharts(uid)
  423 + ]).then((result) => {
  424 + let familyIndexData = {};
  425 +
  426 + if (result[0] && result[0].data) {
  427 + familyIndexData = _.assign(familyIndexData, {
  428 + head_ico: result[0].data.headIco,
  429 + nickname: result[0].data.nickName,
  430 + gender: parseInt(result[0].data.gender, 10),
  431 + birthday: result[0].data.birthday ? moment(result[0].data.birthday).format('MM-DD') : '',
  432 + province: result[0].data.province,
  433 + city: result[0].data.city
  434 + });
  435 + }
  436 +
  437 + if (result[1] && result[1].data) {
  438 + familyIndexData = _.assign(familyIndexData, result[1].data);
  439 + }
  440 +
  441 + if (result[2]) {
  442 + familyIndexData.appList = result[2];
  443 + }
  444 +
  445 + if (result[3]) {
  446 + familyIndexData.ownContent = result[3];
  447 + }
  448 +
  449 + if (result[4]) {
  450 + familyIndexData.townContent = result[4];
  451 + }
  452 +
  453 + return familyIndexData;
  454 + });
  455 + }
  456 +
  457 + formatDay(day) {
  458 + return moment(day).format('YYYY-MM-DD');
  459 + }
  460 +
  461 + getCoinData(params) {
  462 + return family.get('user/getYohoCoinLog', {
  463 + uid: params.uid,
  464 + source: params.source || -1,
  465 + queryType: params.queryType || 0,
  466 + beginTime: params.beginTime ? this.formatDay(parseInt(params.beginTime, 10)) : '',
  467 + endTime: params.endTime ? this.formatDay(parseInt(params.endTime, 10)) : '',
  468 + page: params.page || 1,
  469 + limit: params.limit || 10
  470 + }, {
  471 + code: 200
  472 + }).then(result => {
  473 + let resu = {
  474 + coinList: []
  475 + };
  476 + let _this = this;
  477 +
  478 + if (_.get(result, 'data.coinlist')) {
  479 + _.forEach(result.data.coinlist, function(val) {
  480 + Object.assign(val, {
  481 + typeName: _this.checkType(val.iconType),
  482 + minus: parseInt(val.num, 10) < 0
  483 + });
  484 + });
  485 + resu.coinList = result.data.coinlist;
  486 + }
  487 +
  488 + return resu;
  489 + });
  490 + }
  491 +
  492 + /**
  493 + * 设置我的潮流口令
  494 + */
  495 + setTrendWord(uid, trendWord) {
  496 + return family.get('user/updateInviteCode', {
  497 + uid: uid,
  498 + trendWord: trendWord
  499 + }).then((result) => {
  500 +
  501 + return result;
  502 + });
  503 + }
  504 +
  505 + userInfo(params) {
  506 + return Promise.all([
  507 + this._userData(params.uid),
  508 + this._getCode(params.uid)
  509 + ]).then(result => {
  510 + let resu = {};
  511 +
  512 + if (_.get(result, '[0].data')) {
  513 + let thisGender = result[0].data.gender;
  514 + let token = _.get(result[0], 'data.uid', null) ?
  515 + crypto.encryption('yoho9646yoho9646', _.get(result, 'data.uid', null) + '') : '';
  516 + let icon = _.get(result[0], 'data.headIco', '');
  517 + let name = _.get(result[0], 'data.nickName', '');
  518 + let vip = 0; // 从family进入二维码,暂时显示0
  519 + let hideTips = true;
  520 +
  521 +
  522 + result[0].data.gender = (thisGender === '1' ? '男' : '女');
  523 + result[0].data.otherGender = (thisGender === '1' ? '女' : '男');
  524 + if (result[0].data.gender === '男') {
  525 + result[0].data.genderId = 1;
  526 + result[0].data.otherGenderId = 2;
  527 + } else {
  528 + result[0].data.genderId = 2;
  529 + result[0].data.otherGenderId = 1;
  530 + }
  531 + if (params.isApp) {
  532 + result[0].data.qrcodeLink = `http://m.yohobuy.com?openby:yohobuy={"action":"go.h5","params":{
  533 + "url":"http://m.yohobuy.com/home/user/qrcode",
  534 + "param": {
  535 + "token":"${token}",
  536 + "icon":"${icon}",
  537 + "uname":"${name}",
  538 + "vip":"${vip}"
  539 + }
  540 + }}`;
  541 + result[0].data.trendLink = `http://m.yohobuy.com?openby:yohobuy={"action":"go.h5","params":{
  542 + "url":"http://m.yohobuy.com/home/tide-command",
  543 + "param": {
  544 + "hideTips":"${hideTips}"
  545 + }
  546 + }}`;
  547 + } else {
  548 + result[0].data.qrcodeLink = helpers.urlFormat('/home/user/qrcode', {
  549 + token: token,
  550 + icon: icon,
  551 + uname: name,
  552 + vip: vip
  553 + });
  554 + result[0].data.trendLink = helpers.urlFormat('/home/tide-command', {
  555 + hideTips: hideTips
  556 + });
  557 + }
  558 + resu = camelCase(result[0].data);
  559 + }
  560 + if (_.get(result, '[1].data')) {
  561 + Object.assign(resu, {
  562 + trendWord: result[1].data.trendWord
  563 + });
  564 + }
  565 + return resu;
  566 + });
  567 + }
  568 +
  569 + modify(params) {
  570 + return family.get('user/updateUserInfo.json', {
  571 + uid: params.uid,
  572 + nickName: params.nickName,
  573 + gender: params.gender,
  574 + birthday: params.birthday,
  575 + height: params.height,
  576 + weight: params.weight,
  577 + province: params.province,
  578 + city: params.city
  579 + }).then(result => {
  580 + return result;
  581 + });
  582 + }
  583 +
  584 + getCity(params) {
  585 + return family.get('area/provinces', {
  586 + uid: params.uid,
  587 + id: params.id
  588 + }, {
  589 + cache: true,
  590 + code: 200
  591 + }).then(result => {
  592 + let resu = {
  593 + cityList: []
  594 + };
  595 +
  596 + if (_.get(result, 'data')) {
  597 + let build = [];
  598 +
  599 + _.forEach(result.data, val => {
  600 + build.push({
  601 + cityId: val.id,
  602 + cityName: val.caption
  603 + });
  604 + });
  605 + resu.cityList = build;
  606 + }
  607 + return resu;
  608 + });
  609 + }
  610 +
  611 + getList(params) {
  612 + return family.get('shop/getShopProducts.json', {
  613 + uid: params.uid,
  614 + type: params.type,
  615 + page: params.page || 1,
  616 + limit: params.limit || 10,
  617 + }, {
  618 + code: 200
  619 + }).then(result => {
  620 + let resu = {
  621 + list: []
  622 + };
  623 +
  624 + if (_.get(result, 'data.list')) {
  625 + resu.list = result.data.list;
  626 + }
  627 + return resu;
  628 + });
  629 + }
  630 +
  631 + coinMall(params) {
  632 + return family.get('user/getUserCoin', {
  633 + uid: params.uid
  634 + }, {
  635 + code: 200
  636 + }).then(result => {
  637 + let resu = {
  638 + coinNum: {},
  639 + isMarsApp: params.isMarsApp,
  640 + isNowApp: params.isNowApp
  641 + };
  642 +
  643 + if (_.get(result, 'data.data')) {
  644 + _.forEach(result.data.data, (val) => {
  645 + let name = this.checkType(parseInt(val.type, 10));
  646 +
  647 + resu.coinNum[name] = {
  648 + num: val.num,
  649 + source: val.source
  650 + };
  651 + });
  652 + }
  653 + return resu;
  654 + });
  655 + }
  656 +
  657 + checkType(params) {
  658 + switch (params) {
  659 + case 1:
  660 + return 'yohobuy';
  661 + case 2:
  662 + return 'mars';
  663 + case 3:
  664 + return 'yohonow';
  665 + case 4:
  666 + return 'store';
  667 + case 5:
  668 + return 'green';
  669 + case 6:
  670 + return 'coffee';
  671 + case 7:
  672 + return 'little';
  673 + default:
  674 + return 'yohobuy';
  675 + }
  676 + }
  677 +}
  678 +
  679 +module.exports = familyModel;
@@ -42,13 +42,15 @@ module.exports = class extends global.yoho.BaseModel { @@ -42,13 +42,15 @@ module.exports = class extends global.yoho.BaseModel {
42 }); 42 });
43 } 43 }
44 44
45 - invitionData(uid, contentCode) { 45 + invitionData(uid, contentCode, hideTips) {
46 return Promise.all([this.invitionText(uid), this.resources(contentCode)]).then((result) => { 46 return Promise.all([this.invitionText(uid), this.resources(contentCode)]).then((result) => {
  47 +
47 let finaData = {}; 48 let finaData = {};
48 49
49 finaData = Object.assign(finaData, result[0]); 50 finaData = Object.assign(finaData, result[0]);
50 finaData.imgSrc = _.get(result[1], 'data[0].src', ''); 51 finaData.imgSrc = _.get(result[1], 'data[0].src', '');
51 finaData.resourcesUrl = _.get(result[1], 'data[0].url', ''); 52 finaData.resourcesUrl = _.get(result[1], 'data[0].url', '');
  53 + finaData.hideTips = hideTips;
52 54
53 return finaData; 55 return finaData;
54 }); 56 });
@@ -33,6 +33,7 @@ const refund = require(`${cRoot}/refund`); @@ -33,6 +33,7 @@ const refund = require(`${cRoot}/refund`);
33 const exchange = require(`${cRoot}/exchange`); 33 const exchange = require(`${cRoot}/exchange`);
34 const tideCommand = require(`${cRoot}/tide-command`); 34 const tideCommand = require(`${cRoot}/tide-command`);
35 const newHome = require(`${cRoot}/new-home`); 35 const newHome = require(`${cRoot}/new-home`);
  36 +const family = require(`${cRoot}/family`);
36 const newQrcode = require(`${cRoot}/newQrcode`); 37 const newQrcode = require(`${cRoot}/newQrcode`);
37 const freeShipping = require(`${cRoot}/free-shipping`); 38 const freeShipping = require(`${cRoot}/free-shipping`);
38 39
@@ -184,6 +185,20 @@ router.get('/return/exchange/refreshDelivery', auth, exchange.refreshDelivery); @@ -184,6 +185,20 @@ router.get('/return/exchange/refreshDelivery', auth, exchange.refreshDelivery);
184 router.get('/tide-command', auth, tideCommand.tideCommand); // 设置潮流口令 185 router.get('/tide-command', auth, tideCommand.tideCommand); // 设置潮流口令
185 186
186 router.get('/', newHome.index); // 新个人中心首页 187 router.get('/', newHome.index); // 新个人中心首页
  188 +
  189 +
  190 +router.get('/family', auth, disableBFCache, family.familyIndex); // family首页
  191 +router.get('/family/vipDetailData', auth, family.familyVip); // 获取VIP信息
  192 +router.get('/family/downLoadData', family.downLoadData); // 下载弹窗
  193 +router.get('/family/coinDetail', auth, family.coinDetail); // 积分详情页
  194 +router.get('/family/coinDetail/getCoinData', auth, family.getCoinData); // 筛选积分详情
  195 +router.get('/family/userInfo', auth, disableBFCache, family.userInfo); // family个人信息页
  196 +router.get('/family/userInfo/getCity', auth, family.getCity); // family个人信息页-获取城市
  197 +router.get('/family/coinMall', auth, family.coinMall); // 积分商城
  198 +router.get('/family/coinMall/getList', auth, family.getList); // 积分商城-获取积分列表
  199 +router.get('/family/modify', auth, family.modify); // family修改个人信息页
  200 +router.get('/family/integralCharts', auth, family.integralCharts); // family积分商城
  201 +router.get('/family/set-trend-word', auth, family.setTrendWord); // family设置潮流口令
187 router.get('/newQrcode', auth, newQrcode.index); // 新二维码页面 202 router.get('/newQrcode', auth, newQrcode.index); // 新二维码页面
188 router.get('/newQrcode/reload', auth, newQrcode.reload); // 刷新二维码页面 203 router.get('/newQrcode/reload', auth, newQrcode.reload); // 刷新二维码页面
189 204
  1 +<div class="yoho-family-page yoho-page">
  2 + <div class="score-detail-c">
  3 + <div class="tab">
  4 + <div id="source" class="tab-item">
  5 + <span class="name">版块</span>
  6 + <span class="iconfont down">&#xe613;</span>
  7 + <span class="iconfont up">&#xe612;</span>
  8 + <ul class="list">
  9 + <li data-source="-1">
  10 + <span class="title">全部</span>
  11 + <span class="tick"></span>
  12 + </li>
  13 + <li data-source="1">
  14 + <span class="title">Yoho!Buy</span>
  15 + <span class="tick"></span>
  16 + </li>
  17 + <li data-source="3">
  18 + <span class="title">Yoho!Now</span>
  19 + <span class="tick"></span>
  20 + </li>
  21 + <li data-source="2">
  22 + <span class="title">Mars</span>
  23 + <span class="tick"></span>
  24 + </li>
  25 + <li data-source="6">
  26 + <span class="title">Yo!Coffee</span>
  27 + <span class="tick"></span>
  28 + </li>
  29 + <li data-source="5">
  30 + <span class="title">Yo!Green</span>
  31 + <span class="tick"></span>
  32 + </li>
  33 + <li data-source="7">
  34 + <span class="title">Yo!Little</span>
  35 + <span class="tick"></span>
  36 + </li>
  37 + </ul>
  38 + </div>
  39 + <div id="queryType" class="tab-item">
  40 + <span class="name">积分明细</span>
  41 + <span class="iconfont down">&#xe613;</span>
  42 + <span class="iconfont up">&#xe612;</span>
  43 + <ul class="list">
  44 + <li data-type="0">
  45 + <span class="title">全部</span>
  46 + <span class="tick"></span>
  47 + </li>
  48 + <li data-type="1">
  49 + <span class="title">收入</span>
  50 + <span class="tick"></span>
  51 + </li>
  52 + <li data-type="2">
  53 + <span class="title">支出</span>
  54 + <span class="tick"></span>
  55 + </li>
  56 + </ul>
  57 + </div>
  58 + <div id="time" class="tab-item">
  59 + <span class="name">最近一年</span>
  60 + <span class="iconfont down">&#xe613;</span>
  61 + <span class="iconfont up">&#xe612;</span>
  62 + <ul class="list">
  63 + <li data-begin="0">
  64 + <span class="title">全部</span>
  65 + <span class="tick"></span></li>
  66 + <li data-begin="7776000000">
  67 + <span class="title">最近三月</span>
  68 + <span class="tick"></span>
  69 + </li>
  70 + <li data-begin="15552000000">
  71 + <span class="title">最近六月</span>
  72 + <span class="tick"></span>
  73 + </li>
  74 + <li data-begin="31104000000">
  75 + <span class="title">最近一年</span>
  76 + <span class="tick"></span>
  77 + </li>
  78 + </ul>
  79 + </div>
  80 + </div>
  81 + <div class="cover-bg"></div>
  82 + <div class="result"></div>
  83 + </div>
  84 +</div>
  1 +<div class="coin-mall-c">
  2 + <div class="coin{{#if isNowApp}} now{{/if}}">
  3 + {{#if isNowApp}}
  4 + <span class="coin-pic yohonow"></span>
  5 + {{else if isMarsApp}}
  6 + <span class="coin-pic mars"></span>
  7 + {{else}}
  8 + <span class="coin-pic yohobuy"></span>
  9 + {{/if}}
  10 + <span>
  11 + {{#if isNowApp}}
  12 + {{coinNum/yohonow/num}}
  13 + {{else if isMarsApp}}
  14 + {{coinNum/mars/num}}
  15 + {{else}}
  16 + {{coinNum/yohobuy/num}}
  17 + {{/if}}
  18 + </span>
  19 + </div>
  20 + <div class="btn-c">
  21 + {{#if isNowApp}}
  22 + <a href='//m.yohobuy.com/service/qaDetail?keyword=有货币&sonId=227&openby:yohobuy={"action":"go.h5","params":{"url":"http://m.yohobuy.com/service/qaDetail","param":{"keyword":"有货币","sonId":"227"}}}'>如何获取Yoho!Coins</a>
  23 + <a href='//m.yohobuy.com/home/family/coinDetail?plateType=3&openby:yohobuy={"action":"go.h5","params":{"url":"http://m.yohobuy.com/home/family/coinDetail","param":{"plateType":"3"}}}'>Yoho!Coins明细</a>
  24 + {{else if isMarsApp}}
  25 + <a href='//m.yohobuy.com/service/qaDetail?keyword=有货币&sonId=227&openby:yohobuy={"action":"go.h5","params":{"url":"http://m.yohobuy.com/service/qaDetail","param":{"keyword":"有货币","sonId":"227"}}}'>如何获取mars points</a>
  26 + <a href='//m.yohobuy.com/home/family/coinDetail?plateType=2&openby:yohobuy={"action":"go.h5","params":{"url":"http://m.yohobuy.com/home/family/coinDetail","param":{"plateType":"2"}}}'>mars points明细</a>
  27 + {{else}}
  28 + <a href='//m.yohobuy.com/service/qaDetail?keyword=有货币&sonId=227&openby:yohobuy={"action":"go.h5","params":{"url":"http://m.yohobuy.com/service/qaDetail","param":{"keyword":"有货币","sonId":"227"}}}'>如何获取有货币</a>
  29 + <a href='//m.yohobuy.com/home/family/coinDetail?plateType=1&openby:yohobuy={"action":"go.h5","params":{"url":"http://m.yohobuy.com/home/family/coinDetail","param":{"plateType":"1"}}}'>有货币明细</a>
  30 + {{/if}}
  31 + </div>
  32 + <div class="tab-fixed">
  33 + <div class="tab">
  34 + <div class="tab-item" id="yohonow">Yoho!Now</div>
  35 + <div class="tab-item" id="mars">mars</div>
  36 + </div>
  37 + </div>
  38 + <div class="tab-c">
  39 + <div class="tab-item-c" id="yohonow-tab"></div>
  40 + <div class="tab-item-c hide" id="mars-tab"></div>
  41 + </div>
  42 +</div>
  1 +<div class="yoho-family-page yoho-page">
  2 +{{# familyIndexData}}
  3 + <div class="family-heade">
  4 + <div class="header-top">
  5 + <span class="back" onclick="javascript:history.go(-1);"></span>
  6 + <span class="headings"></span>
  7 + </div>
  8 + <div class="person-detail">
  9 + <a href='http://m.yohobuy.com/home/family/userInfo?openby:yohobuy={"action":"go.h5","params":{"url":"http://m.yohobuy.com/home/family/userInfo"}}' class="user-avatar" data-avatar="{{image head_ico 80 80}}"></a>
  10 + <div class="basic-info">
  11 + <span class="user-name">{{nickname}}</span>
  12 + <span class="gender {{#isEqualOr gender 1}}boy{{/isEqualOr}}{{#isEqualOr gender 2}}girl{{/isEqualOr}}"></span>
  13 + </div>
  14 + <div class="info">
  15 + <span class="city">{{province}}{{city}}</span>
  16 + <span class="birthday">{{birthday}}</span>
  17 + </div>
  18 + <div class="invition">
  19 + <span class="code trend-code">
  20 + {{#if trendWord}}
  21 + #
  22 + <span class="word-outer">
  23 + <span class="trend-word">{{trendWord}}</span>
  24 + </span>
  25 + #
  26 + {{else}}
  27 + {{inviteCode}}
  28 + {{/if}}
  29 + </span>
  30 + <span class="code-set"></span>
  31 + {{#unless trendWord}}
  32 + <span class="code-tip"></span>
  33 + {{/unless}}
  34 + </div>
  35 + <div class="inviton-set hide">
  36 + <textarea maxlength="15" placeholder="请输入你的潮流口令"></textarea>
  37 + </div>
  38 + </div>
  39 + </div>
  40 + <div class="vip-grade">
  41 + <div class="title">会员等级及权益</div>
  42 + <div class="grade-content">
  43 + {{# appList}}
  44 + <div class="content-item" data-login="{{login}}" data-name="{{nickname}}" data-code="{{code}}">
  45 + <img class="item-tag" src="{{image iconUrl 140 140}}">
  46 + <span class="name">{{sourceName}}</span>
  47 + <span class="level">{{name}}</span>
  48 + </div>
  49 + {{/ appList}}
  50 + </div>
  51 + </div>
  52 + <div class="integral">
  53 + <div class="title">积分乐园</div>
  54 + <div class="integral-content">
  55 + <div class="charts" id="charts" style="width: 8.6rem; height: 8.6rem;"></div>
  56 + </div>
  57 + </div>
  58 +
  59 + {{! 资源位}}
  60 + <div class="rec">
  61 + <div class="resource-content">
  62 + {{# ownContent}}
  63 + <div data-id="{{template_id}}" class="resource-own">
  64 + {{> family-res}}
  65 + </div>
  66 + {{/ ownContent}}
  67 + {{# townContent}}
  68 + <div data-id="{{template_id}}">
  69 + {{> family-res}}
  70 + </div>
  71 + {{/ townContent}}
  72 + </div>
  73 + </div>
  74 + <div class="dia-c popover"></div>
  75 +{{/ familyIndexData}}
  76 +</div>
  1 +<div class="family-user-info">
  2 + <div class="info-list">
  3 + <div class="list-item user-pic">
  4 + <div class="title">头像</div>
  5 + <div class="main">
  6 + <div class="pic user-avatar" data-avatar="{{image headIco 100 100}}"></div>
  7 + </div>
  8 + <div class="arr">
  9 + <span class="iconfont">&#xe604;</span>
  10 + </div>
  11 + </div>
  12 + <div class="list-item">
  13 + <div class="title">昵称</div>
  14 + <div class="main">
  15 + <input class="inp nick-name modify" type="text" value="{{nickName}}" />
  16 + </div>
  17 + <div class="arr">
  18 + <span class="iconfont">&#xe604;</span>
  19 + </div>
  20 + </div>
  21 + <div class="list-item">
  22 + <div class="title">性别</div>
  23 + <div class="main">
  24 + <div class="select-c">
  25 + <select class="inp gender modify">
  26 + <option value="{{genderId}}">{{gender}}&nbsp;&nbsp;&nbsp;</option>
  27 + <option value="{{otherGenderId}}">{{otherGender}}&nbsp;&nbsp;&nbsp;</option>
  28 + </select>
  29 + </div>
  30 + </div>
  31 + <div class="arr">
  32 + <span class="iconfont">&#xe604;</span>
  33 + </div>
  34 + </div>
  35 + <div class="list-item">
  36 + <div class="title">生日</div>
  37 + <div class="main">
  38 + <span class="date-c">
  39 + <input class="inp birthday modify" type="date" value="{{birthday}}" />
  40 + </span>
  41 + </div>
  42 + <div class="arr">
  43 + <span class="iconfont">&#xe604;</span>
  44 + </div>
  45 + </div>
  46 + <div id="chosen-city" class="list-item">
  47 + <div class="title">城市</div>
  48 + <div class="main">
  49 + <span class="inp"><span class="province-text">{{province}}</span>&nbsp;<span class="city-text">{{city}}</span></span>
  50 + </div>
  51 + <div class="arr">
  52 + <span class="iconfont">&#xe604;</span>
  53 + </div>
  54 + </div>
  55 + <a class="list-item" href="{{trendLink}}">
  56 + <div class="title">我的潮流口令</div>
  57 + <div class="main">
  58 + <span class="inp" type="text">#{{trendWord}}#</span>
  59 + </div>
  60 + <div class="arr">
  61 + <span class="iconfont">&#xe604;</span>
  62 + </div>
  63 + </a>
  64 + <a class="list-item" href="{{qrcodeLink}}">
  65 + <div class="title">我的二维码</div>
  66 + <div class="main">
  67 + <div class="ewm"></div>
  68 + </div>
  69 + <div class="arr">
  70 + <span class="iconfont">&#xe604;</span>
  71 + </div>
  72 + </a>
  73 + </div>
  74 + <div class="info-list">
  75 + <div class="list-item">
  76 + <div class="title">身高</div>
  77 + <div class="main">
  78 + <label>cm</label>
  79 + <input class="inp inp-2 height modify" type="number" value="{{height}}" />
  80 + </div>
  81 + <div class="arr">
  82 + <span class="iconfont">&#xe604;</span>
  83 + </div>
  84 + </div>
  85 + <div class="list-item">
  86 + <div class="title">体重</div>
  87 + <div class="main">
  88 + <label>kg</label>
  89 + <input class="inp inp-2 weight modify" type="number" value="{{weight}}" />
  90 + </div>
  91 + <div class="arr">
  92 + <span class="iconfont">&#xe604;</span>
  93 + </div>
  94 + </div>
  95 + </div>
  96 + <div class="info-list hide">
  97 + <div class="list-item">
  98 + <div class="title">账号安全</div>
  99 + <div class="main">
  100 + <input class="inp" type="text" value="修改手机号+密码等" />
  101 + </div>
  102 + <div class="arr">
  103 + <span class="iconfont">&#xe604;</span>
  104 + </div>
  105 + </div>
  106 + </div>
  107 + <div class="foot-tip">
  108 + <div class="pic"></div>
  109 + <p>如果你还使用了我们的其他产品(Yoho!Buy有货、Yoho!Now和 mars)修改个人信息时将同步。</p>
  110 + </div>
  111 + <div class="city-swiper">
  112 + <div class="swiper-header">
  113 + <div class="cancel">取消</div>
  114 + <div class="ok">完成</div>
  115 + </div>
  116 + <div class="swiper-list">
  117 + <div class="swiper-container" id="province-c">
  118 + <div class="swiper-wrapper" id="province"></div>
  119 + </div>
  120 + <div class="swiper-container" id="city-c">
  121 + <div class="swiper-wrapper" id="city"></div>
  122 + </div>
  123 + <div class="swiper-line"></div>
  124 + </div>
  125 + </div>
  126 +</div>
@@ -25,8 +25,9 @@ @@ -25,8 +25,9 @@
25 <span class="code-tip"></span> 25 <span class="code-tip"></span>
26 {{/unless}} 26 {{/unless}}
27 </div> 27 </div>
28 - <div class="iconfont more-icon tap-hightlight">&#xe604;</div> 28 + <!-- <div class="iconfont more-icon tap-hightlight">&#xe604;</div> -->
29 </a> 29 </a>
  30 + <!-- <a class="family-entry" href="//m.yohobuy.com/home/family"></a> -->
30 {{#unless students}} 31 {{#unless students}}
31 {{#if @root.studentSwitch}} 32 {{#if @root.studentSwitch}}
32 <a class="students-entry" href="{{verifyUrl}}">学生认证</a> 33 <a class="students-entry" href="{{verifyUrl}}">学生认证</a>
@@ -27,6 +27,7 @@ @@ -27,6 +27,7 @@
27 </a> 27 </a>
28 <a class="iconfont qrcode" href="/home/newQrcode">&#xe73a;</a> 28 <a class="iconfont qrcode" href="/home/newQrcode">&#xe73a;</a>
29 <div class="gif-part hide"></div> 29 <div class="gif-part hide"></div>
  30 + <!-- <a class="family-entry" href="//m.yohobuy.com/home/family"></a> -->
30 {{/ baseInfo}} 31 {{/ baseInfo}}
31 {{else}} 32 {{else}}
32 <a class="login-btn" href="{{signinUrl}}" data-refer="{{referUrl}}"> 33 <a class="login-btn" href="{{signinUrl}}" data-refer="{{referUrl}}">
@@ -7,5 +7,8 @@ @@ -7,5 +7,8 @@
7 <input id="upload-img" type="file" /> 7 <input id="upload-img" type="file" />
8 </span> 8 </span>
9 </div> 9 </div>
  10 + {{#if isWechat}}
  11 + <div class="submit">提交</div>
  12 + {{/if}}
10 </div> 13 </div>
11 </div> 14 </div>
@@ -8,7 +8,7 @@ @@ -8,7 +8,7 @@
8 8
9 <span class="world-number">15</span> 9 <span class="world-number">15</span>
10 10
11 - <div class="introduce"> 11 + <div class="introduce{{#if hideTips}} hide{{/if}}">
12 <div class="rules"> 12 <div class="rules">
13 {{#if mytrendWordPageDesc}} 13 {{#if mytrendWordPageDesc}}
14 <span class="title">玩转潮流口令,超值福利等你拿</span> 14 <span class="title">玩转潮流口令,超值福利等你拿</span>
  1 +{{#if singleOne}}
  2 +{{#data}}
  3 + <div class="banner-list">
  4 + <a href="{{url}}" id="{{../template_id}}" name="{{../template_intro}}">
  5 + <img src="{{image2 src w=750 h=300 q=60 mode=3}}" alt="">
  6 + </a>
  7 + </div>
  8 +{{/data}}
  9 +{{else}}
  10 +<div class="banner-center banner-center-swiper">
  11 + <ul class="banner-list swiper-wrapper clearfix">
  12 + {{#data.list}}
  13 + <li class="swiper-slide">
  14 + <a href="{{url}}" id="{{../template_id}}' name="{{../template_intro}}">
  15 + <img src="{{image2 src w=750 h=290 q=60 mode=3}}" alt="">
  16 + </a>
  17 + </li>
  18 + {{/data.list}}
  19 + </ul>
  20 + <div class="swiper-pagination" {{#unless singleOne}}style="display:block"{{/unless}}>
  21 + <div class="pagination-inner">
  22 + </div>
  23 + </div>
  24 +</div>
  25 +{{/if}}
@@ -19,7 +19,8 @@ const domains = { @@ -19,7 +19,8 @@ const domains = {
19 imCs: 'http://im.yohobuy.com/api', 19 imCs: 'http://im.yohobuy.com/api',
20 platformApi: 'http://192.168.102.48:8088/', 20 platformApi: 'http://192.168.102.48:8088/',
21 store: 'http://192.168.102.47:8080/portal-gateway/wechat/', 21 store: 'http://192.168.102.47:8080/portal-gateway/wechat/',
22 - extstore: 'http://extstore-test1.yohops.com' 22 + extstore: 'http://extstore-test1.yohops.com',
  23 + family: 'http://192.168.103.73:8096/uic/'
23 }; 24 };
24 25
25 module.exports = { 26 module.exports = {
@@ -133,13 +134,14 @@ if (isProduction) { @@ -133,13 +134,14 @@ if (isProduction) {
133 api: 'http://api.yoho.yohoops.org/', 134 api: 'http://api.yoho.yohoops.org/',
134 service: 'http://api.yoho.yohoops.org/', 135 service: 'http://api.yoho.yohoops.org/',
135 global: 'http://api-global.yohobuy.com', 136 global: 'http://api-global.yohobuy.com',
136 - store: 'http://openstore.yohobuy.com', // 线上域名尚未确定 137 + store: 'http://openstore.yohobuy.com',
137 liveApi: 'http://api.live.yoho.cn/', 138 liveApi: 'http://api.live.yoho.cn/',
138 singleApi: 'http://single.yoho.cn/', 139 singleApi: 'http://single.yoho.cn/',
139 imSocket: 'wss://imsocket.yohobuy.com:443', 140 imSocket: 'wss://imsocket.yohobuy.com:443',
140 imCs: 'https://imhttp.yohobuy.com/api', 141 imCs: 'https://imhttp.yohobuy.com/api',
141 platformApi: 'http://api.platform.yohoops.org', 142 platformApi: 'http://api.platform.yohoops.org',
142 - extstore: 'http://extstore.yohobuy.com' 143 + extstore: 'http://extstore.yohobuy.com',
  144 + family: '' // 线上域名尚未确定
143 }, 145 },
144 memcache: { 146 memcache: {
145 master: ['memcache1.yohoops.org:12111', 'memcache2.yohoops.org:12111', 'memcache3.yohoops.org:12111'], 147 master: ['memcache1.yohoops.org:12111', 'memcache2.yohoops.org:12111', 'memcache3.yohoops.org:12111'],
@@ -210,7 +212,8 @@ if (isProduction) { @@ -210,7 +212,8 @@ if (isProduction) {
210 imSocket: process.env.TEST_IM_SOCKET || 'ws://socket.yohobuy.com:10240', 212 imSocket: process.env.TEST_IM_SOCKET || 'ws://socket.yohobuy.com:10240',
211 imCs: process.env.TEST_IM_CS || 'http://im.yohobuy.com/api', 213 imCs: process.env.TEST_IM_CS || 'http://im.yohobuy.com/api',
212 platformApi: 'http://192.168.102.48:8088/', 214 platformApi: 'http://192.168.102.48:8088/',
213 - extstore: 'http://extstore-test1.yohops.com' 215 + extstore: 'http://extstore-test1.yohops.com',
  216 + family: 'http://192.168.103.73:8096/uic/'
214 }, 217 },
215 memcache: { 218 memcache: {
216 master: ['127.0.0.1:12111'], 219 master: ['127.0.0.1:12111'],
@@ -55,6 +55,7 @@ module.exports = () => { @@ -55,6 +55,7 @@ module.exports = () => {
55 yoho.clientIp = _getClientIp(req); 55 yoho.clientIp = _getClientIp(req);
56 56
57 // 判断请求是否来自app 57 // 判断请求是否来自app
  58 + yoho.isNowApp = /yohonow/i.test(req.get('User-Agent') || '');
58 yoho.isMarsApp = /yohomars/i.test(req.get('User-Agent') || ''); 59 yoho.isMarsApp = /yohomars/i.test(req.get('User-Agent') || '');
59 yoho.isApp = yoho.isMarsApp || 60 yoho.isApp = yoho.isMarsApp ||
60 req.cookies.app_version || 61 req.cookies.app_version ||
@@ -74,7 +74,7 @@ @@ -74,7 +74,7 @@
74 <link rel="apple-touch-startup-image" sizes="640x920" href="http://static.yohobuy.com/m/v1/img/startup/startup-retina.png" media="screen and (max-device-width: 480px) and (-webkit-min-device-pixel-ratio: 2)"> 74 <link rel="apple-touch-startup-image" sizes="640x920" href="http://static.yohobuy.com/m/v1/img/startup/startup-retina.png" media="screen and (max-device-width: 480px) and (-webkit-min-device-pixel-ratio: 2)">
75 <link rel="apple-touch-startup-image" sizes="320x460" href="http://static.yohobuy.com/m/v1/img/startup/startup.png" media="screen and (max-device-width: 320)"> 75 <link rel="apple-touch-startup-image" sizes="320x460" href="http://static.yohobuy.com/m/v1/img/startup/startup.png" media="screen and (max-device-width: 320)">
76 </head> 76 </head>
77 - <body class="{{pageStyle}}{{#if isWechat}} wechat-body{{/if}}{{#if width750}} width750{{/if}}{{#if isPassportPage}} passport-body{{/if}}{{#if isStarIndexPage}} star-index-bg{{/if}}{{#if isStarDetailPage}} star-class-body{{/if}}{{#if isInstallmentPage}} installment-body{{/if}}{{#if @root.isMarsApp}} is-mars-app{{/if}}"> 77 + <body class="{{pageStyle}}{{#if isWechat}} wechat-body{{/if}}{{#if width750}} width750{{/if}}{{#if isPassportPage}} passport-body{{/if}}{{#if isStarIndexPage}} star-index-bg{{/if}}{{#if isStarDetailPage}} star-class-body{{/if}}{{#if isInstallmentPage}} installment-body{{/if}}{{#if @root.isMarsApp}} is-mars-app{{/if}}{{#if @root.isNowApp}} is-now-app{{/if}}">
78 <div class="main-wrap" id="main-wrap" {{#if appPath}}data-apppath='{{{appPath}}}'{{/if}}> 78 <div class="main-wrap" id="main-wrap" {{#if appPath}}data-apppath='{{{appPath}}}'{{/if}}>
79 {{#if systemUpdate}} 79 {{#if systemUpdate}}
80 {{> updata}} 80 {{> updata}}
This diff could not be displayed because it is too large.
@@ -83,6 +83,7 @@ @@ -83,6 +83,7 @@
83 "babel-polyfill": "^6.26.0", 83 "babel-polyfill": "^6.26.0",
84 "babel-preset-env": "^1.6.0", 84 "babel-preset-env": "^1.6.0",
85 "css-loader": "^0.28.7", 85 "css-loader": "^0.28.7",
  86 + "echarts": "^3.7.1",
86 "eslint": "^4.7.0", 87 "eslint": "^4.7.0",
87 "eslint-config-yoho": "^1.0.9", 88 "eslint-config-yoho": "^1.0.9",
88 "eslint-loader": "^1.9.0", 89 "eslint-loader": "^1.9.0",
  1 +{{#cityList}}
  2 +<div id="{{cityId}}" class="swiper-slide">{{cityName}}</div>
  3 +{{/cityList}}
  1 +<div class="act-list">
  2 + {{# list}}
  3 + <div class="act-item">
  4 + <div class="pic">
  5 + {{#if headimg}}
  6 + <img class="lazy" data-original="{{image headimg mode=2 w=750 h=300 q=60}}" />
  7 + {{else}}
  8 + <img class="lazy" data-original="{{image2 headPic mode=2 w=750 h=320 q=60}}" />
  9 + {{/if}}
  10 + <div class="bg"></div>
  11 + <div class="title">有效期:10.11~10.21</div>
  12 + {{#if level}}
  13 + <div class="level">Lv.{{level}}可兑换</div>
  14 + {{/if}}
  15 + </div>
  16 + <div class="info">
  17 + <div class="left">
  18 + <div class="name eps">{{name}}</div>
  19 + <div class="num">
  20 + <span class="coin-pic-s"></span>
  21 + <span>{{#if points}}{{points}}{{/if}}{{#if point}}{{point}}{{/if}}</span>
  22 + <span class="old-price">{{discountPoints}}</span>
  23 + <span class="discount">Lv.3会员9折优惠</span>
  24 + </div>
  25 + <div class="remain">仅剩{{#if stock}}{{stock}}{{/if}}{{#if num}}{{num}}{{/if}}</div>
  26 + </div>
  27 + <div class="right">
  28 + <a class="go-btn yohonow" href="yohoefashion4In1://yoho.cn/">兑换</a>
  29 + <a class="go-btn mars" href="yohomars://yohomars.com/goapp?openby:mars=">兑换</a>
  30 + </div>
  31 + </div>
  32 + </div>
  33 + {{/ list}}
  34 +</div>
  1 +{{# coinList}}
  2 +<div class="result-item">
  3 + <div class="top">
  4 + <div class="pic {{typeName}}"></div>
  5 + <span class="title eps">{{message}}</span>
  6 + <span class="num{{#if minus}} minus{{/if}}">{{num}}</span>
  7 + </div>
  8 + <div class="bottom">{{date}}</div>
  9 +</div>
  10 +{{/ coinList}}
  1 +<div class="down-load-detail hide popover">
  2 + <div class="down-close"></div>
  3 + <div class="back"></div>
  4 + <div class="detail-content">
  5 + {{# downLoadData}}
  6 + <div class="{{appName}} hide">
  7 + {{#imgList}}
  8 + <img src="{{image src 640 1049}}">
  9 + {{/imgList}}
  10 +
  11 + {{#if winXinCode}}
  12 + <a class="code-copy" href='//m.yohobuy.com/?openby:yohobuy={"action":"go.copy","params":{"text":"{{winXinCode}}","message":"复制成功"}}'>复制</a>
  13 + {{/if}}
  14 + </div>
  15 + {{/ downLoadData}}
  16 + </div>
  17 +</div>
  1 +<a class="integral-total" href="{{totalHref}}">
  2 + <span class="total">{{total}}</span>
  3 + <span class="name">积分总计</span>
  4 +</a>
  5 +<div class="mark">
  6 + {{# list}}
  7 + <div class="mark-item">
  8 + <span class="item-name">{{name}}</span>
  9 + <span class="item-color" style="background-color: {{color}}"></span>
  10 + <span class="item-val">{{value}}</span>
  11 + <span class="item-percent">{{percent}}</span>
  12 + </div>
  13 + {{/list}}
  14 + <div class="instruction">
  15 + 注:
  16 + <span>YOHO!Family 所有产品积分可通用</span>
  17 + </div>
  18 +</div>
  1 +<div class="vip-detail">
  2 + <div class="close"></div>
  3 + <div class="back"></div>
  4 + <div class="detail-content">
  5 + <div class="banner">
  6 + </div>
  7 + <div class="main">
  8 + <div class="user-info clearfix{{#if noUid}} hide{{/if}}">
  9 + <div class="base clearfix">
  10 + <div class="pic"{{#if headIco}} style="background-image:url({{image headIco 125 125}})"{{/if}}>
  11 + <div class="level-pic {{#if showLevel}}vip-{{level}}{{/if}}"></div>
  12 + </div>
  13 + <div class="intro">
  14 + <div class="name"><span></span>您好!</div>
  15 + <div class="level">
  16 + <span class="now">我的成长值:<span class="val">{{growthValue}}</span></span>
  17 + {{#if valueToNextLevel}}
  18 + <span class="next">下次升级还需:<span class="val">{{valueToNextLevel}}</span></span>
  19 + {{/if}}
  20 + </div>
  21 + </div>
  22 + </div>
  23 + <div class="level-process clearfix">
  24 + <div class="line-c">
  25 + <div class="line" style="width:{{percent}}%"></div>
  26 + <div class="point">
  27 + {{# vipLevelLis}}
  28 + <div class="point-item">
  29 + <div class="level-text">
  30 + <p>{{name}}</p>
  31 + <p>{{growthValue}}</p>
  32 + </div>
  33 + </div>
  34 + {{/ vipLevelLis}}
  35 + </div>
  36 + </div>
  37 + </div>
  38 + </div>
  39 +
  40 + <div class="privilege-list">
  41 + <div class="privilege-title">
  42 + <b></b>
  43 + 当前可享受特权
  44 + <!-- <a class="more" href='{{link}}'>更多</a> -->
  45 + </div>
  46 + {{# privilegeList}}
  47 + <a class="privilege-item">
  48 + <img class="icon" {{#if pic}}src="{{pic}}"{{/if}} {{#if icon}}src="{{icon}}{{/if}}">
  49 + <p>
  50 + {{#if title}}{{title}}{{/if}}
  51 + {{#if name}}{{name}}{{/if}}
  52 + <span>{{#if description}}{{description}}{{/if}}{{#if desc}}{{desc}}{{/if}}</span>
  53 + </p>
  54 + </a>
  55 + {{/ privilegeList}}
  56 + <div class="transverse">
  57 + {{# privileges}}
  58 + <div class="level-item">
  59 + <img class="item-ico" src="{{image icon 125 125}}">
  60 + <span class="le-name">{{name}}</span>
  61 + <span class="state">{{status}}</span>
  62 + </div>
  63 + {{/ privileges}}
  64 + </div>
  65 + </div>
  66 +
  67 + {{#if birthShow}}
  68 + <a href="" class="birthday"><b></b>生日礼,会员当月专享生日礼</a>
  69 + {{/if}}
  70 + </div>
  71 + </div>
  72 +</div>
@@ -58,7 +58,12 @@ $('.set-world').click(function() { @@ -58,7 +58,12 @@ $('.set-world').click(function() {
58 58
59 point(1, $('.trend-world-area').val()); 59 point(1, $('.trend-world-area').val());
60 60
61 - $('.trend-code').html($('.trend-world-area').val()); 61 + if ($('.yoho-page').hasClass('my-page')) {
  62 + $('.trend-code').html('# ' + $('.trend-world-area').val() + ' #');
  63 + } else {
  64 + $('.trend-code').html($('.trend-world-area').val());
  65 + }
  66 +
62 $('.copy.button').eq(0).attr('href', copyUrl); 67 $('.copy.button').eq(0).attr('href', copyUrl);
63 68
64 setTimeout(function() { 69 setTimeout(function() {
  1 +import 'home/family-coin.page.css';
  2 +import $ from 'yoho-jquery';
  3 +import Page from 'yoho-page';
  4 +import tip from 'plugin/tip';
  5 +import resultRender from 'home/coin-list.hbs';
  6 +
  7 +class ScoreDetail extends Page {
  8 + constructor() {
  9 + super();
  10 +
  11 + this.selector = {
  12 + $coverBg: $('.cover-bg'),
  13 + $tabItem: $('.tab-item'),
  14 + $scoreDetailC: $('.score-detail-c'),
  15 + $chosen: $('.tab-item .list').find('li'),
  16 + $defaultChosen: $('.tab-item .list').find('li:first'),
  17 + $defaultChosenTime: $('#time .list').find('li:last'),
  18 + $result: $('.result'),
  19 + $source: $('#source').find('.name'),
  20 + $queryType: $('#queryType').find('.name'),
  21 + $time: $('#time').find('.name')
  22 + };
  23 +
  24 + this.view = {
  25 + resultRender
  26 + };
  27 +
  28 + this.source = window.queryString.plateType || -1;
  29 + this.queryType = 0;
  30 + this.endTime = Date.parse(new Date());
  31 + this.beginTime = parseInt(this.endTime, 10) - parseInt(31104000000, 10); // 默认显示一年内
  32 + this.page = 1;
  33 + this.loading = false;
  34 + this.end = false;
  35 +
  36 + this.init();
  37 + }
  38 +
  39 + init() {
  40 + this.setHeight();
  41 + this.bindEvents();
  42 + this.chosenData();
  43 + this.scroll();
  44 + this.defaultTab();
  45 + }
  46 +
  47 + defaultTab() {
  48 + this.selector.$defaultChosen.addClass('chosen');
  49 + this.selector.$defaultChosenTime.addClass('chosen').siblings('li').removeClass('chosen');
  50 + if (window.queryString.plateType) {
  51 + let $defaultSource = $('#source').find(`li[data-source=${window.queryString.plateType}]`);
  52 +
  53 + $defaultSource.addClass('chosen').siblings('li').removeClass('chosen');
  54 + this.selector.$source.text($defaultSource.find('.title').text());
  55 + }
  56 + }
  57 +
  58 + scroll() {
  59 + $(window).scroll(() => {
  60 + window.requestAnimationFrame(this.scrollHandler.bind(this));
  61 + });
  62 + }
  63 +
  64 + scrollHandler() {
  65 + if (($(window).scrollTop() + $(window).height() >= $(document).height() * 0.8)) {
  66 + this.doMore();
  67 + }
  68 + }
  69 +
  70 + doMore() {
  71 + if (!this.end && !this.loading) {
  72 + this.page++;
  73 + this.chosenData();
  74 + }
  75 + }
  76 +
  77 + bindEvents() {
  78 + this.selector.$tabItem.on('click', this.tab.bind(this));
  79 + this.selector.$coverBg.on('click', this.coverBg.bind(this));
  80 + this.selector.$chosen.on('click', this.chosen.bind(this));
  81 + }
  82 +
  83 + chosen(e) {
  84 + let $this = $(e.currentTarget);
  85 + let $parensId = $this.parents('.tab-item').attr('id');
  86 +
  87 + this.selector.$result.empty();
  88 + switch ($parensId) {
  89 + case 'source':
  90 + this.source = $this.data('source');
  91 + this.selector.$source.text($this.find('.title').text());
  92 + break;
  93 + case 'queryType':
  94 + this.queryType = $this.data('type');
  95 + this.selector.$queryType.text($this.find('.title').text());
  96 + break;
  97 + case 'time':
  98 + if ($this.data('begin')) {
  99 + this.beginTime = $this.data('begin');
  100 + this.endTime = Date.parse(new Date());
  101 + this.beginTime = parseInt(this.endTime, 10) - parseInt(this.beginTime, 10);
  102 + } else {
  103 + this.beginTime = '';
  104 + this.endTime = '';
  105 + }
  106 + this.selector.$time.text($this.find('.title').text());
  107 + break;
  108 + default:
  109 + tip.show('请稍后再试~~');
  110 + }
  111 + this.end = false;
  112 + this.page = 1;
  113 + this.chosenData();
  114 + $this.addClass('chosen').siblings('li').removeClass('chosen');
  115 + return false;
  116 + }
  117 +
  118 + setHeight() {
  119 + let wHeight = $(window).height();
  120 +
  121 + this.selector.$coverBg.css('min-height', `${wHeight}px`);
  122 + }
  123 +
  124 + tab(e) {
  125 + let $this = $(e.currentTarget);
  126 +
  127 + // $this.find('li:first').addClass('chosen');
  128 + // $this.find('li:first').siblings('li').removeClass('chosen');
  129 + if ($this.hasClass('active')) {
  130 + $this.removeClass('active');
  131 + this.selector.$scoreDetailC.removeClass('active');
  132 + } else {
  133 + $this.addClass('active');
  134 + $this.siblings('.tab-item').removeClass('active');
  135 + this.selector.$scoreDetailC.addClass('active');
  136 + }
  137 + }
  138 +
  139 + coverBg() {
  140 + this.selector.$scoreDetailC.removeClass('active');
  141 + this.selector.$tabItem.removeClass('active');
  142 + }
  143 +
  144 + chosenData() {
  145 + this.loading = true;
  146 + this.ajax({
  147 + url: '/home/family/coinDetail/getCoinData',
  148 + data: {
  149 + source: this.source,
  150 + queryType: this.queryType,
  151 + beginTime: this.beginTime,
  152 + endTime: this.endTime,
  153 + page: this.page
  154 + }
  155 + }).then(result => {
  156 + if (result && result.coinList.length > 0) {
  157 + this.selector.$result.append(this.view.resultRender(result));
  158 + this.loading = false;
  159 + } else {
  160 + this.end = true;
  161 + tip.show('没有更多数据了~~~');
  162 + }
  163 + this.selector.$tabItem.removeClass('active');
  164 + this.selector.$scoreDetailC.removeClass('active');
  165 + }).catch(error => {
  166 + console.error(error);
  167 + });
  168 + }
  169 +}
  170 +
  171 +$(() => {
  172 + new ScoreDetail();
  173 +});
  1 +import 'home/family-coinMall.page.css';
  2 +import $ from 'yoho-jquery';
  3 +import Page from 'yoho-page';
  4 +import tip from 'plugin/tip';
  5 +import tabRender from 'home/coin-get-list.hbs';
  6 +import lazyLoad from 'yoho-jquery-lazyload';
  7 +
  8 +class IconMall extends Page {
  9 + constructor() {
  10 + super();
  11 +
  12 + this.selector = {
  13 + $tabItem: $('.tab .tab-item'),
  14 + $defaultTabItem: $('.tab .tab-item:first'),
  15 + $coinMallC: $('.coin-mall-c'),
  16 + $tabFixed: $('.tab-fixed'),
  17 + $yohonowTab: $('#yohonow-tab'),
  18 + $marsTab: $('#mars-tab')
  19 + };
  20 +
  21 + this.view = {
  22 + tabRender
  23 + };
  24 +
  25 + this.page = 1;
  26 + this.limit = 10;
  27 + this.type = 'now';
  28 + this.loading = false;
  29 + this.end = false;
  30 + this.fixTop = this.selector.$tabFixed.offset().top;
  31 +
  32 + this.init();
  33 + }
  34 +
  35 + init() {
  36 + this.bindEvents();
  37 + this.defaultChosen();
  38 + this.scroll();
  39 + this.getList();
  40 + }
  41 +
  42 + scrollHandler() {
  43 + if (($(window).scrollTop() + $(window).height() >= $(document).height() * 0.8)) {
  44 + this.doMore();
  45 + }
  46 + }
  47 +
  48 + doMore() {
  49 + if (!this.end && !this.loading) {
  50 + this.page++;
  51 + this.getList();
  52 + }
  53 + }
  54 +
  55 + getList() {
  56 + this.loading = true;
  57 + this.ajax({
  58 + url: '/home/family/coinMall/getList',
  59 + data: {
  60 + type: this.type,
  61 + page: this.page
  62 + }
  63 + }).then(result => {
  64 + if (result && result.list.length > 0) {
  65 + let $result = $(this.view.tabRender(result));
  66 +
  67 + if (this.type === 'now') {
  68 + this.selector.$yohonowTab.append($result);
  69 + }
  70 + if (this.type === 'mars') {
  71 + this.selector.$marsTab.append($result);
  72 + }
  73 + this.loading = false;
  74 + lazyLoad($result.find('img.lazy'));
  75 + } else {
  76 + this.end = true;
  77 + tip.show('没有更多数据了~~~');
  78 + }
  79 + }).catch(error => {
  80 + console.error(error);
  81 + });
  82 + }
  83 +
  84 + scroll() {
  85 + $(window).scroll(() => {
  86 + let $scrollTop = $(window).scrollTop();
  87 +
  88 + if ($scrollTop >= this.fixTop) {
  89 + this.selector.$tabFixed.find('.tab').addClass('fixed');
  90 + } else {
  91 + this.selector.$tabFixed.find('.tab').removeClass('fixed');
  92 + }
  93 +
  94 + $(window).scroll(() => {
  95 + window.requestAnimationFrame(this.scrollHandler.bind(this));
  96 + });
  97 + });
  98 + }
  99 +
  100 + bindEvents() {
  101 + this.selector.$tabItem.on('click', this.tabItem.bind(this));
  102 + }
  103 +
  104 + defaultChosen() {
  105 + let defaultId = this.selector.$defaultTabItem.attr('id');
  106 +
  107 + this.selector.$defaultTabItem.addClass('active');
  108 + this.selector.$coinMallC.attr('id', defaultId);
  109 + }
  110 +
  111 + tabItem(e) {
  112 + let $this = $(e.currentTarget);
  113 + let $thisId = $this.attr('id');
  114 +
  115 + this.selector.$yohonowTab.empty();
  116 + this.selector.$marsTab.empty();
  117 + $(`#${$thisId}-tab`).show().siblings('.tab-item-c').hide();
  118 + this.selector.$coinMallC.removeAttr('id');
  119 + this.selector.$coinMallC.attr('id', $thisId);
  120 + $this.addClass('active').siblings('div').removeClass('active');
  121 + if ($this.attr('id') === 'yohonow') {
  122 + this.type = 'now';
  123 + }
  124 + if ($this.attr('id') === 'mars') {
  125 + this.type = 'mars';
  126 + }
  127 + this.page = 1;
  128 + this.getList();
  129 + }
  130 +}
  131 +
  132 +$(() => {
  133 + new IconMall();
  134 +});
  1 +import 'home/family-userInfo.page.css';
  2 +import 'home/family/city-swiper.css';
  3 +import CitySwiper from 'plugin/city-swiper';
  4 +import $ from 'yoho-jquery';
  5 +import Page from 'yoho-page';
  6 +import tip from 'plugin/tip';
  7 +import cityRender from 'home/chosen-city.hbs';
  8 +import yoho from 'yoho-app';
  9 +
  10 +class UserInfo extends Page {
  11 + constructor() {
  12 + super();
  13 +
  14 + this.selector = {
  15 + $chosenCity: $('#chosen-city'),
  16 + $citySwiper: $('.city-swiper'),
  17 + $modifyInp: $('.inp.modify'),
  18 + $nickName: $('.inp.nick-name'),
  19 + $gender: $('.inp.gender'),
  20 + $birthday: $('.inp.birthday'),
  21 + $height: $('.inp.height'),
  22 + $weight: $('.inp.weight'),
  23 + $userAvatar: $('.user-avatar'),
  24 + $province: $('#province'),
  25 + $city: $('#city'),
  26 + $cancelBtn: $('.swiper-header .cancel'),
  27 + $okBtn: $('.swiper-header .ok'),
  28 + $provinceText: $('.province-text'),
  29 + $cityText: $('.city-text'),
  30 + $userPic: $('.user-pic'),
  31 + $noDate: $('.inp.modify[type!=date]'),
  32 + };
  33 +
  34 + this.view = {
  35 + cityRender
  36 + };
  37 +
  38 + this.CityId = 0;
  39 + this.province = this.selector.$provinceText.text();
  40 + this.city = this.selector.$cityText.text();
  41 + this.init();
  42 + }
  43 +
  44 + init() {
  45 + this.bindEvents();
  46 +
  47 + // city-swiper的回调函数
  48 + this.on('citySwiperCb', (event, data) => { // data是返回选中的slide
  49 + let $data = $(data);
  50 + let $parent = $data.parents('.swiper-wrapper');
  51 +
  52 + if (($parent.attr('id') === 'province')) { // 当滑动省份列表时出发城市列表
  53 + this.CityId = $data.attr('id');
  54 + this.getCity();
  55 + }
  56 + });
  57 + this.defaultPic();
  58 + this.getCity();
  59 + }
  60 +
  61 + bindEvents() {
  62 + this.selector.$chosenCity.on('click', this.chosenCity.bind(this));
  63 + this.selector.$cancelBtn.on('click', this.cancelFun.bind(this));
  64 + this.selector.$okBtn.on('click', this.okFun.bind(this));
  65 + this.selector.$chosenCity.on('DOMNodeInserted', this.modifyInp.bind(this));
  66 + this.selector.$userPic.on('click', this.userPic.bind(this));
  67 + this.selector.$modifyInp.on('click', this.closeCitySwiper.bind(this));
  68 + if (yoho.isApp) {
  69 + this.selector.$modifyInp.on('change', this.modifyInp.bind(this));
  70 + } else {
  71 + this.selector.$noDate.on('change', this.modifyInp.bind(this));
  72 + this.selector.$birthday.on('blur', this.modifyInp.bind(this));
  73 + }
  74 + }
  75 +
  76 + closeCitySwiper(e) {
  77 + let $this = $(e.currentTarget);
  78 +
  79 + if ($this.attr('id') !== 'chosen-city') {
  80 + this.selector.$citySwiper.hide();
  81 + }
  82 + }
  83 +
  84 + userPic() {
  85 + if (yoho.isApp) {
  86 + yoho.ready(() => {
  87 + yoho.invokeMethod('go.setAvatar', {}, (data) => {
  88 + if (data) {
  89 + let reg = /(\w*){mode}(.*){width}(.*){height}(.*)/g;
  90 +
  91 + data = data.replace(reg, '$12$2100$3100$4');
  92 + this.selector.$userAvatar.css('background-image', `url(${data})`);
  93 + }
  94 + });
  95 + });
  96 + }
  97 + }
  98 +
  99 + cancelFun() {
  100 + this.selector.$citySwiper.hide();
  101 + }
  102 +
  103 + okFun() {
  104 + let $provinceActive = $('#province .swiper-slide-active');
  105 + let $cityActive = $('#city .swiper-slide-active');
  106 + let $chosenCityText = '';
  107 +
  108 + this.province = $provinceActive.text();
  109 + this.city = $cityActive.text();
  110 + $chosenCityText = `<span class="province-text">
  111 + ${this.province}</span>&nbsp;<span class="city-text">${this.city}</span>`;
  112 + this.selector.$chosenCity.find('.inp').html($chosenCityText);
  113 + this.selector.$citySwiper.hide();
  114 + }
  115 +
  116 + defaultPic() {
  117 + let myImage = new Image(),
  118 + avatar;
  119 +
  120 + avatar = this.selector.$userAvatar.data('avatar');
  121 + myImage.src = avatar;
  122 + myImage.onload = () => {
  123 + this.selector.$userAvatar.css('background-image', 'url(' + avatar + ')');
  124 + };
  125 + }
  126 +
  127 + modifyInp() {
  128 + this.ajax({
  129 + url: '/home/family/modify',
  130 + data: {
  131 + nickName: this.selector.$nickName.val(),
  132 + gender: this.selector.$gender.val(),
  133 + birthday: this.selector.$birthday.val(),
  134 + height: this.selector.$height.val(),
  135 + weight: this.selector.$weight.val(),
  136 + province: this.province,
  137 + city: this.city,
  138 + },
  139 + }).then(result => {
  140 + if (result && result.code === 200) {
  141 + location.href = location.href;
  142 + } else {
  143 + tip.show(result.message);
  144 + }
  145 + }).catch(error => {
  146 + tip.show(error);
  147 + });
  148 + }
  149 +
  150 + chosenCity() {
  151 + this.getCity();
  152 + this.selector.$citySwiper.show();
  153 + }
  154 +
  155 + getCity() {
  156 + this.ajax({
  157 + url: '/home/family/userInfo/getCity',
  158 + data: {
  159 + id: this.CityId
  160 + }
  161 + }).then(result => {
  162 + if (this.CityId === 0) {
  163 + this.selector.$province.append(this.view.cityRender(result));
  164 + new CitySwiper({
  165 + lineNum: 5, // 每列行数
  166 + centeredSlides: true, // 剧中显示
  167 + hidePartingLine: false // 隐藏两条分割线
  168 + });
  169 + } else {
  170 + this.selector.$city.empty();
  171 + this.selector.$city.append(this.view.cityRender(result));
  172 + }
  173 + }).catch(error => {
  174 + console.error(error);
  175 + });
  176 + }
  177 +}
  178 +
  179 +$(() => {
  180 + new UserInfo();
  181 +});
  1 +import 'home/family.page.css';
  2 +import $ from 'yoho-jquery';
  3 +import Page from 'yoho-page';
  4 +import tip from 'plugin/tip';
  5 +import yoho from 'yoho-app';
  6 +import integral from 'home/integral-paradise.hbs';
  7 +import vipDetailInfo from 'home/vip-detail.hbs';
  8 +import downLoadInfo from 'home/down-load-detail.hbs';
  9 +
  10 +const Swiper = require('yoho-swiper2');
  11 +const echarts = require('echarts/lib/echarts');
  12 +
  13 +require('echarts/lib/chart/pie');
  14 +
  15 +class FamilyIndex extends Page {
  16 + constructor() {
  17 + super();
  18 +
  19 + this.selector = {
  20 + $diaC: $('.dia-c'),
  21 + $userAvatar: $('.user-avatar'),
  22 + $codeSet: $('.code-set'),
  23 + $invition: $('.invition'),
  24 + $invitonSet: $('.inviton-set'),
  25 + $textarea: $('textarea'),
  26 + integralCh: echarts.init(document.getElementById('charts')),
  27 + chartWidth: $('.charts').width(),
  28 + $integralContent: $('.integral-content'),
  29 + $contentItem: $('.content-item'),
  30 + $close: $('.close'),
  31 + $userName: $('.user-name'),
  32 + $trendWord: $('.trend-word'),
  33 + $wordOuter: $('.word-outer'),
  34 + $bannerCenterSwiper: $('.banner-center-swiper'),
  35 + $back: $('.back'),
  36 + $vipMore: $('more'),
  37 + $trendCode: $('.trend-code'),
  38 + $popover: $('.popover')
  39 + };
  40 +
  41 + this.view = {
  42 + integral,
  43 + vipDetailInfo,
  44 + downLoadInfo
  45 + };
  46 +
  47 + this.vipInfo;
  48 +
  49 + this.init();
  50 + }
  51 +
  52 + init() {
  53 + this.headIco();
  54 + this.integralCharts();
  55 + this.bindEvents();
  56 + this.viewVipInfo();
  57 + this.initTrend();
  58 + this.trendWordMarquee();
  59 + this.resources();
  60 + this.downLoadInfo();
  61 + }
  62 +
  63 + bindEvents() {
  64 + this.selector.$codeSet.on('click', this.setTrendPop.bind(this));
  65 + this.selector.$textarea.on('blur', this.saveTrendWord.bind(this));
  66 + this.selector.integralCh.on('click', this.jump.bind(this));
  67 + this.selector.$contentItem.on('click', this.showInfo.bind(this));
  68 + this.selector.$diaC.on('click', this.selector.$close, this.hideVipInfo.bind(this));
  69 + this.selector.$back.on('click', this.goBack.bind(this));
  70 + this.selector.$popover.on('mousewheel touchmove', this.banSliding.bind(this));
  71 + }
  72 +
  73 + // 头像
  74 + headIco() {
  75 + let myImage = new Image(),
  76 + avatar;
  77 +
  78 + avatar = this.selector.$userAvatar.data('avatar');
  79 + myImage.src = avatar;
  80 + myImage.onload = () => {
  81 + this.selector.$userAvatar.css('background-image', 'url(' + avatar + ')');
  82 + };
  83 + }
  84 +
  85 + // 潮流口令滚动
  86 + trendWordMarquee() {
  87 + let diff = $('.word-outer').scrollLeft() - $('.trend-word').eq(0).width();
  88 +
  89 + $('.word-outer').scrollLeft($('.word-outer').scrollLeft() + 1);
  90 +
  91 + if (diff > 0) {
  92 + $('.word-outer').scrollLeft(Math.abs(diff));
  93 + }
  94 + }
  95 +
  96 + // 潮流口令初始化判断
  97 + initTrend() {
  98 + if (this.selector.$trendWord.eq(0).width() > parseInt(this.selector.$wordOuter.css('max-width'), 10)) {
  99 +
  100 + this.selector.$trendWord.width(this.selector.$trendWord.width() + 40);
  101 +
  102 + this.selector.$wordOuter.append('<span class="trend-word">' + this.selector.$trendWord.html() + '</span>').css({ // eslint-disable-line
  103 + width: 2 * this.selector.$trendWord.width()
  104 + });
  105 +
  106 + this.selector.$trendWord = $('.trend-word');
  107 +
  108 + this.selector.$trendWord.addClass('rem-lin');
  109 +
  110 + setInterval(this.trendWordMarquee, 40);
  111 + } else {
  112 + this.selector.$trendWord = $('.trend-word');
  113 +
  114 + if (this.selector.$trendWord.length > 1) {
  115 + this.selector.$trendWord.eq(1).remove();
  116 + }
  117 +
  118 + this.selector.$trendWord.removeClass('rem-lin');
  119 + }
  120 + }
  121 +
  122 + // 积分乐园图表
  123 + integralCharts() {
  124 + this.ajax({
  125 + type: 'GET',
  126 + url: location.protocol + '//m.yohobuy.com/home/family/integralCharts'
  127 + }).then(result => {
  128 + if (result) {
  129 + result.totalHref = location.protocol + '//m.yohobuy.com/home/family/coinDetail?openby:yohobuy={"action":"go.h5","params":{"url":"' + location.protocol + '//m.yohobuy.com/home/family/coinDetail"}}', // eslint-disable-line
  130 +
  131 + this.selector.$integralContent.append(this.view.integral(result));
  132 +
  133 + this.selector.integralCh.setOption({
  134 + calculable: true,
  135 + color: result.colorList,
  136 + series: [
  137 + {
  138 + type: 'pie',
  139 + radius: [this.selector.chartWidth * 3 / 10, this.selector.chartWidth * 11 / 25],
  140 + roseType: 'radius',
  141 + center: ['50%', '50%'],
  142 + label: {
  143 + normal: false
  144 + },
  145 + data: result.list
  146 + }
  147 + ]
  148 + });
  149 + }
  150 + }).catch(() => {
  151 + tip.show('服务异常,请稍后重试');
  152 + });
  153 + }
  154 +
  155 + // 资源位初始化
  156 + resources() {
  157 + if (this.selector.$bannerCenterSwiper.find('li').length > 0) {
  158 + new Swiper('.banner-center-swiper', {
  159 + pagination: '.swiper-pagination',
  160 + lazyLoading: true,
  161 + lazyLoadingInPrevNext: true,
  162 + paginationClickable: true,
  163 + autoplay: 3000
  164 + });
  165 + }
  166 + }
  167 +
  168 + // 查看VIP信息
  169 + viewVipInfo() {
  170 + this.ajax({
  171 + type: 'GET',
  172 + url: location.protocol + '//m.yohobuy.com/home/family/vipDetailData'
  173 + }).then(result => {
  174 + this.vipInfo = result;
  175 + }).catch(() => {
  176 + tip.show('服务异常,请稍后重试');
  177 + });
  178 + }
  179 +
  180 + // 下载弹窗初始页面渲染
  181 + downLoadInfo() {
  182 + let codeArr = [];
  183 +
  184 + $('.content-item').each(function() {
  185 + codeArr.push({
  186 + name: $(this).data('name'),
  187 + code: $(this).data('code')
  188 + });
  189 + });
  190 +
  191 + this.ajax({
  192 + type: 'GET',
  193 + url: location.protocol + '//m.yohobuy.com/home/family/downLoadData',
  194 + data: {
  195 + codeArr: codeArr
  196 + }
  197 + }).then(result => {
  198 + $('.yoho-family-page').append(this.view.downLoadInfo(result));
  199 +
  200 + this.selector.$downLoadDetail = $('.down-load-detail');
  201 + this.selector.$downClose = $('.down-close');
  202 + this.selector.$downClose.on('click', this.downClose.bind(this));
  203 + this.selector.$popover = $('.popover');
  204 + this.selector.$popover.on('mousewheel touchmove', this.banSliding.bind(this));
  205 + });
  206 + }
  207 +
  208 + // 设置潮流口令
  209 + setTrendPop() {
  210 + this.selector.$invition.hide();
  211 + this.selector.$invitonSet.show();
  212 + this.selector.$textarea.focus();
  213 + }
  214 +
  215 + // 提交口令
  216 + saveTrendWord() {
  217 + let trendWord = this.selector.$textarea.val();
  218 +
  219 + if (trendWord === '') {
  220 + this.selector.$invition.show();
  221 + this.selector.$invitonSet.hide();
  222 + return;
  223 + }
  224 +
  225 + this.ajax({
  226 + type: 'GET',
  227 + url: location.protocol + '//m.yohobuy.com/home/family/set-trend-word',
  228 + data: {
  229 + trendWord: trendWord
  230 + }
  231 + }).then(result => {
  232 + tip.show(result.message);
  233 +
  234 + if (result.code === 200) {
  235 + this.selector.$invition.show();
  236 + this.selector.$invitonSet.hide();
  237 + if (this.selector.$invition.find('.trend-word') > 0) {
  238 + this.selector.$invition.find('.trend-word').html(trendWord);
  239 + } else {
  240 + this.selector.$trendCode.html('# <span class="word-outer"><span class="trend-word">' +
  241 + trendWord + '</span></span> #');
  242 + }
  243 + this.selector.$trendWord.css({
  244 + width: 'auto'
  245 + });
  246 + this.selector.$wordOuter.css({
  247 + width: 'auto'
  248 + });
  249 + this.initTrend();
  250 + } else {
  251 + this.selector.$textarea.focus();
  252 + }
  253 + }).catch(() => {
  254 + tip.show('服务异常,请稍后重试');
  255 + });
  256 + }
  257 +
  258 + // 积分图表点击跳转
  259 + jump(params) {
  260 + yoho.goH5(`${location.protocol}//m.yohobuy.com/home/family/coinDetail?plateType=${params.data.plateType}`);
  261 + }
  262 +
  263 + // 点击APP图标显示信息
  264 + showInfo(e) {
  265 + let $this = $(e.currentTarget);
  266 + let appType = $this.data('name').toLowerCase();
  267 + let isLogin = $this.data('login');
  268 +
  269 + if (isLogin) {
  270 + if (this.vipInfo[appType]) {
  271 + this.selector.$diaC.append(this.view.vipDetailInfo(this.vipInfo[appType]));
  272 + } else {
  273 + this.viewVipInfo();
  274 +
  275 + this.selector.$diaC.append(this.view.vipDetailInfo(this.vipInfo[appType]));
  276 + }
  277 +
  278 + $('.vip-detail').addClass(appType);
  279 +
  280 + if (this.selector.$userAvatar.data('avatar')) {
  281 + $('.base .pic').css('background-image', 'url(' + this.selector.$userAvatar.data('avatar') + ')');
  282 + }
  283 +
  284 + if (this.selector.$userName.text() !== '') {
  285 + $('.intro .name span').text($('.user-name').text() + ',');
  286 + }
  287 + } else {
  288 + this.selector.$downLoadDetail.removeClass('hide');
  289 +
  290 + this.selector.$downLoadDetail.find('.detail-content .' + appType).removeClass('hide');
  291 + this.selector.$downLoadDetail.find('.detail-content .' + appType).siblings().addClass('hide');
  292 + }
  293 + }
  294 +
  295 + // 点击关闭会员信息弹框
  296 + hideVipInfo() {
  297 + $('.vip-detail').remove();
  298 + $('body,.main').css({
  299 + 'overflow-y': 'auto'
  300 + });
  301 + }
  302 +
  303 + // 返回上一页
  304 + goBack() {
  305 + if (yoho.isApp) {
  306 + yoho.invokeMethod('go.back');
  307 + }
  308 + }
  309 +
  310 + // 关闭下载弹窗
  311 + downClose() {
  312 + this.selector.$downLoadDetail.addClass('hide');
  313 + $('body,.main').css({
  314 + 'overflow-y': 'auto'
  315 + });
  316 + }
  317 +
  318 + // 弹窗出现禁止滑动
  319 + banSliding() {
  320 + $('body,.main').css({
  321 + 'overflow-y': 'hidden'
  322 + });
  323 + }
  324 +}
  325 +
  326 +$(() => {
  327 + new FamilyIndex();
  328 +});
@@ -53,54 +53,60 @@ lazyLoad(); @@ -53,54 +53,60 @@ lazyLoad();
53 53
54 headerNavHammer = new Hammer(document.getElementById('yoho-header')); 54 headerNavHammer = new Hammer(document.getElementById('yoho-header'));
55 55
56 -headerNavHammer.on('tap', function(e) { 56 +function submit() {
57 let suggestText = $('#suggest-textarea').val(), 57 let suggestText = $('#suggest-textarea').val(),
58 textReg = /\S+/; 58 textReg = /\S+/;
59 59
  60 + if (!textReg.test(suggestText)) {
  61 + diaLog.showDialog({
  62 + autoHide: true,
  63 + dialogText: '意见不能为空'
  64 + });
60 65
61 - if ($(e.target).hasClass('nav-btn')) { 66 + return;
  67 + }
62 68
63 - if (!textReg.test(suggestText)) { 69 + $.ajax({
  70 + method: 'post',
  71 + url: '/home/savesuggest',
  72 + data: {
  73 + content: suggestText,
  74 + image: imgStr
  75 + }
  76 + }).then(function(data) {
  77 + if (data.code === 200) {
64 diaLog.showDialog({ 78 diaLog.showDialog({
65 autoHide: true, 79 autoHide: true,
66 - dialogText: '意见不能为空' 80 + dialogText: '提交成功'
67 }); 81 });
68 -  
69 - return;  
70 - }  
71 -  
72 - $.ajax({  
73 - method: 'post',  
74 - url: '/home/savesuggest',  
75 - data: {  
76 - content: suggestText,  
77 - image: imgStr  
78 - }  
79 - }).then(function(data) {  
80 - if (data.code === 200) {  
81 - diaLog.showDialog({  
82 - autoHide: true,  
83 - dialogText: '提交成功'  
84 - });  
85 - setTimeout(function() {  
86 - location.pathname = 'home/suggest';  
87 - }, 2000);  
88 - } else {  
89 - diaLog.showDialog({  
90 - autoHide: true,  
91 - dialogText: '提交失败~'  
92 - });  
93 - }  
94 - }).fail(function() {  
95 - 82 + setTimeout(function() {
  83 + location.pathname = 'home/suggest';
  84 + }, 2000);
  85 + } else {
96 diaLog.showDialog({ 86 diaLog.showDialog({
97 autoHide: true, 87 autoHide: true,
98 - dialogText: '网络错误~' 88 + dialogText: '提交失败~'
99 }); 89 });
  90 + }
  91 + }).fail(function() {
  92 +
  93 + diaLog.showDialog({
  94 + autoHide: true,
  95 + dialogText: '网络错误~'
100 }); 96 });
  97 + });
  98 +}
  99 +
  100 +headerNavHammer.on('tap', function(e) {
  101 + if ($(e.target).hasClass('nav-btn')) {
  102 + submit();
101 } 103 }
102 }); 104 });
103 105
  106 +$('.submit').on('click', function() {
  107 + submit();
  108 +});
  109 +
104 if (document.getElementById('img-form') !== null) { 110 if (document.getElementById('img-form') !== null) {
105 formHammer = new Hammer(document.getElementById('img-form')); 111 formHammer = new Hammer(document.getElementById('img-form'));
106 112
  1 +import Swiper from 'yoho-swiper';
  2 +import $ from 'yoho-jquery';
  3 +import Page from 'yoho-page';
  4 +
  5 +class CitySwiper extends Page {
  6 + constructor(data) {
  7 + super();
  8 + this.selector = {
  9 + $swiperC: $('.city-swiper'),
  10 + $swiper: $('.city-swiper .swiper-list').find('.swiper-container'),
  11 + $slide: $('.city-swiper .swiper-list').find('.swiper-slide'),
  12 + $swiperLine: $('.city-swiper .swiper-line'),
  13 + $swiperList: $('.city-swiper .swiper-list')
  14 + };
  15 + this.provinceSwiper = '';
  16 + this.citySwiper = '';
  17 + this.init(data);
  18 + }
  19 +
  20 + init(data) {
  21 + let swiperParams = this.swiperParams(data);
  22 +
  23 + this.setStyle(data);
  24 + this.provinceSwiper = new Swiper('.city-swiper #province-c', swiperParams);
  25 + this.citySwiper = new Swiper('.city-swiper #city-c', swiperParams);
  26 + }
  27 +
  28 + setStyle(data) {
  29 + let lineHeight = this.selector.$swiperList.height() / data.lineNum;
  30 + let lineTop = lineHeight / 2;
  31 +
  32 + if (data.hidePartingLine) {
  33 + this.selector.$swiperLine.hide();
  34 + }
  35 + this.selector.$swiperLine.css('height', `${lineHeight}px`);
  36 + this.selector.$swiperLine.css('margin-top', `-${lineTop}px`);
  37 + }
  38 +
  39 + swiperParams(data) {
  40 + let $thisSwiper = '';
  41 + let newParams = {
  42 + direction: 'vertical',
  43 + slidesPerView: data.lineNum || 1,
  44 + centeredSlides: data.centeredSlides,
  45 + loop: data.true,
  46 + observer: true,
  47 + observeParents: true,
  48 + slideToClickedSlide: true,
  49 + onInit: (swiper) => {
  50 + $thisSwiper = swiper.activeIndex;
  51 + $thisSwiper = $(swiper.slides[`${$thisSwiper}`]);
  52 + this.emit('citySwiperCb', $thisSwiper);
  53 + },
  54 + onSlideChangeEnd: (swiper) => {
  55 + if ($(swiper.container[0]).index() === 0) {
  56 + this.citySwiper.slideTo(0, 1000, false); // 重选省份时,城市设置为第一个
  57 + }
  58 + $thisSwiper = swiper.activeIndex;
  59 + $thisSwiper = $(swiper.slides[`${$thisSwiper}`]);
  60 + this.emit('citySwiperCb', $thisSwiper);
  61 + }
  62 + };
  63 +
  64 + return newParams;
  65 + }
  66 +}
  67 +
  68 +module.exports = CitySwiper;
@@ -37,6 +37,7 @@ yoho = { @@ -37,6 +37,7 @@ yoho = {
37 /** 37 /**
38 * 判断是否是 APP 38 * 判断是否是 APP
39 */ 39 */
  40 + isNowApp: /yohonow/i.test(navigator.userAgent || ''),
40 isMarsApp: /YohoMars/i.test(navigator.userAgent || ''), 41 isMarsApp: /YohoMars/i.test(navigator.userAgent || ''),
41 isApp: /YohoMars/i.test(navigator.userAgent || '') || 42 isApp: /YohoMars/i.test(navigator.userAgent || '') ||
42 /YohoBuy/i.test(navigator.userAgent || '') || 43 /YohoBuy/i.test(navigator.userAgent || '') ||
@@ -103,7 +103,7 @@ @@ -103,7 +103,7 @@
103 line-height: 46px; 103 line-height: 46px;
104 overflow: hidden; 104 overflow: hidden;
105 105
106 - .trend-code { 106 + .code {
107 display: inline-block; 107 display: inline-block;
108 vertical-align: top; 108 vertical-align: top;
109 } 109 }
@@ -136,6 +136,18 @@ @@ -136,6 +136,18 @@
136 } 136 }
137 } 137 }
138 138
  139 + .family-entry {
  140 + width: 136px;
  141 + height: 136px;
  142 + position: absolute;
  143 + bottom: 0;
  144 + right: 0;
  145 + display: block;
  146 + background-size: 100%;
  147 + background-repeat: no-repeat;
  148 + background-image: resolve("home/index/family-entry.gif");
  149 + }
  150 +
139 .login-btn { 151 .login-btn {
140 display: block; 152 display: block;
141 position: absolute; 153 position: absolute;
@@ -176,6 +176,18 @@ @@ -176,6 +176,18 @@
176 outline: none; 176 outline: none;
177 resize: none; 177 resize: none;
178 } 178 }
  179 +
  180 + .submit {
  181 + width: 350px;
  182 + height: 70px;
  183 + margin: 0 auto;
  184 + background: #000;
  185 + color: #fff;
  186 + text-align: center;
  187 + line-height: 70px;
  188 + margin-top: 180px;
  189 + border-radius: 10px;
  190 + }
179 } 191 }
180 192
181 .img-form { 193 .img-form {
  1 +body,
  2 +html {
  3 + background-color: #f0f0f0;
  4 +}
  5 +
  6 +.score-detail-c {
  7 + .eps {
  8 + white-space: nowrap;
  9 + overflow: hidden;
  10 + text-overflow: ellipsis;
  11 + }
  12 +
  13 + .cover-bg {
  14 + display: none;
  15 + width: 100%;
  16 + height: 100%;
  17 + position: absolute;
  18 + top: 0;
  19 + left: 0;
  20 + right: 0;
  21 + bottom: 0;
  22 + background-color: #000;
  23 + opacity: 0.4;
  24 + }
  25 +
  26 + &.active {
  27 + .cover-bg {
  28 + display: block;
  29 + }
  30 + }
  31 +
  32 + .tab {
  33 + height: 86px;
  34 + border-bottom: solid 1px #e0e0e0;
  35 + padding: 18px 0;
  36 + background-color: #fff;
  37 + position: relative;
  38 + z-index: 1;
  39 +
  40 + .tab-item {
  41 + width: 250px;
  42 + height: 50px;
  43 + line-height: 50px;
  44 + float: left;
  45 + text-align: center;
  46 + font-size: 30px;
  47 + color: #1a1a1a;
  48 + border-right: solid 1px #e0e0e0;
  49 +
  50 + .down {
  51 + display: inline-block;
  52 + }
  53 +
  54 + .up {
  55 + display: none;
  56 + }
  57 +
  58 + .iconfont {
  59 + font-size: 12px;
  60 + }
  61 +
  62 + &:last-child {
  63 + border-right: 0;
  64 + }
  65 +
  66 + .list {
  67 + display: none;
  68 + width: 750px;
  69 + text-align: left;
  70 + position: absolute;
  71 + padding: 0 30px;
  72 + background-color: #fff;
  73 + top: 86px;
  74 + left: 0;
  75 +
  76 + li {
  77 + line-height: 90px;
  78 + border-bottom: solid 1px #e0e0e0;
  79 + color: #b0b0b0;
  80 + position: relative;
  81 + }
  82 +
  83 + li.chosen {
  84 + color: #000;
  85 + }
  86 +
  87 + .tick {
  88 + width: 30px;
  89 + height: 22px;
  90 + background: url("/home/family/chosen.png");
  91 + position: absolute;
  92 + top: 34px;
  93 + right: 30px;
  94 + display: none;
  95 + }
  96 +
  97 + li:last-child {
  98 + border-bottom: 0;
  99 + }
  100 + }
  101 +
  102 + li.chosen {
  103 + .tick {
  104 + display: block;
  105 + }
  106 + }
  107 +
  108 + &.active {
  109 + .list {
  110 + display: block;
  111 + }
  112 +
  113 + .down {
  114 + display: none;
  115 + }
  116 +
  117 + .up {
  118 + display: inline-block;
  119 + }
  120 + }
  121 + }
  122 + }
  123 +
  124 + .result {
  125 + padding: 0 34px;
  126 + background-color: #fff;
  127 +
  128 + .result-item {
  129 + height: 125px;
  130 + border-bottom: solid 1px #e0e0e0;
  131 + padding: 20px 0 10px;
  132 +
  133 + .top {
  134 + font-size: 28px;
  135 + float: left;
  136 + line-height: 45px;
  137 + width: 100%;
  138 +
  139 + .pic {
  140 + width: 40px;
  141 + height: 40px;
  142 + border-radius: 5px;
  143 + overflow: hidden;
  144 + float: left;
  145 + margin-right: 10px;
  146 + background-size: 100% 100%;
  147 + }
  148 +
  149 + .pic.coffee {
  150 + background-image: resolve("home/family/ico-coffee.png");
  151 + }
  152 +
  153 + .pic.green {
  154 + background-image: resolve("home/family/ico-green.png");
  155 + }
  156 +
  157 + .pic.little {
  158 + background-image: resolve("home/family/ico-little.png");
  159 + }
  160 +
  161 + .pic.mars {
  162 + background-image: resolve("home/family/ico-mars.png");
  163 + }
  164 +
  165 + .pic.yohobuy {
  166 + background-image: resolve("home/family/ico-yohobuy.png");
  167 + }
  168 +
  169 + .pic.store {
  170 + background-image: resolve("home/family/ico-yohobuy.png");
  171 + }
  172 +
  173 + .pic.yohonow {
  174 + background-image: resolve("home/family/ico-yohonow.png");
  175 + }
  176 +
  177 + .title {
  178 + float: left;
  179 + width: 500px;
  180 + }
  181 +
  182 + .num {
  183 + float: right;
  184 + color: #b0b0b0;
  185 + }
  186 +
  187 + .num.minus {
  188 + color: #43b98a;
  189 + }
  190 + }
  191 +
  192 + .bottom {
  193 + width: 100%;
  194 + line-height: 50px;
  195 + float: left;
  196 + color: #b0b0b0;
  197 + font-size: 24px;
  198 + }
  199 +
  200 + &:last-child {
  201 + border-bottom: 0;
  202 + }
  203 + }
  204 + }
  205 +}
  1 +body,
  2 +html {
  3 + background-color: #f0f0f0;
  4 +}
  5 +
  6 +.coin-mall-c {
  7 + img {
  8 + width: 100%;
  9 + }
  10 +
  11 + .eps {
  12 + white-space: nowrap;
  13 + overflow: hidden;
  14 + text-overflow: ellipsis;
  15 + }
  16 +
  17 + .coin-pic {
  18 + width: 60px;
  19 + height: 60px;
  20 + display: inline-block;
  21 + margin-right: 20px;
  22 + background-size: 100% 100%;
  23 + }
  24 +
  25 + .coin-pic.yohobuy {
  26 + display: none;
  27 + }
  28 +
  29 + .coin-pic.yohonow {
  30 + background-image: resolve("home/family/yoho.png") !important;
  31 + }
  32 +
  33 + .coin-pic.mars {
  34 + background-image: resolve("home/family/mars-s.png") !important;
  35 + }
  36 +
  37 + .coin-pic-s {
  38 + width: 34px;
  39 + height: 34px;
  40 + background: resolve("home/family/yoho-s.png");
  41 + display: inline-block;
  42 + margin-right: 5px;
  43 + background-size: 100% 100%;
  44 + }
  45 +
  46 + .tab-fixed {
  47 + width: 750px;
  48 + height: 100px;
  49 + position: relative;
  50 + clear: both;
  51 + }
  52 +
  53 + .tab {
  54 + background-color: #fff;
  55 + float: left;
  56 +
  57 + .tab-item {
  58 + width: 375px;
  59 + float: left;
  60 + line-height: 100px;
  61 + font-size: 30px;
  62 + color: #b0b0b0;
  63 + text-align: center;
  64 + }
  65 +
  66 + .tab-item.active {
  67 + color: #000;
  68 + }
  69 +
  70 + &.fixed {
  71 + position: fixed;
  72 + top: 0;
  73 + left: 0;
  74 + z-index: 1;
  75 + }
  76 + }
  77 +
  78 + .coin {
  79 + background-color: #fff;
  80 + font-size: 50px;
  81 + text-align: center;
  82 + color: #000;
  83 + line-height: 160px;
  84 + height: 160px;
  85 + clear: both;
  86 + display: flex;
  87 + justify-content: center;
  88 + align-items: center;
  89 + }
  90 +
  91 + .coin.now {
  92 + color: #fece02;
  93 + }
  94 +
  95 + .btn-c {
  96 + background-color: #fff;
  97 + padding: 0 44px 60px;
  98 + float: left;
  99 + margin-bottom: 20px;
  100 +
  101 + a {
  102 + display: block;
  103 + width: 270px;
  104 + height: 58px;
  105 + background-color: #1a1a1a;
  106 + color: #fff;
  107 + line-height: 58px;
  108 + text-align: center;
  109 + font-size: 26px;
  110 + float: left;
  111 + margin: 0 30px;
  112 + }
  113 + }
  114 +
  115 + .act-list {
  116 + clear: both;
  117 +
  118 + .act-item {
  119 + margin-bottom: 20px;
  120 +
  121 + .pic {
  122 + position: relative;
  123 +
  124 + .bg {
  125 + width: 270px;
  126 + height: 50px;
  127 + line-height: 50px;
  128 + background-color: #000;
  129 + position: absolute;
  130 + top: 0;
  131 + right: 0;
  132 + opacity: 0.5;
  133 + display: none;
  134 + }
  135 +
  136 + .title {
  137 + font-size: 26px;
  138 + width: 270px;
  139 + height: 50px;
  140 + line-height: 50px;
  141 + color: #fff;
  142 + position: absolute;
  143 + top: 0;
  144 + right: 0;
  145 + text-align: center;
  146 + display: none;
  147 + }
  148 +
  149 + .level {
  150 + width: 160px;
  151 + height: 46px;
  152 + line-height: 46px;
  153 + text-align: center;
  154 + background-color: #000;
  155 + color: #fff;
  156 + font-size: 26px;
  157 + position: absolute;
  158 + top: 0;
  159 + right: 0;
  160 + display: none;
  161 + }
  162 + }
  163 +
  164 + .info {
  165 + padding: 20px 30px;
  166 + height: 170px;
  167 + background-color: #fff;
  168 +
  169 + .left {
  170 + width: 560px;
  171 + float: left;
  172 + }
  173 +
  174 + .name {
  175 + font-size: 30px;
  176 + line-height: 50px;
  177 + }
  178 +
  179 + .num {
  180 + font-size: 30px;
  181 + line-height: 50px;
  182 + color: #fece02;
  183 + display: flex;
  184 + align-items: center;
  185 + }
  186 +
  187 + .old-price {
  188 + color: #b0b0b0;
  189 + font-size: 24px;
  190 + text-decoration: line-through;
  191 + margin-left: 8px;
  192 + display: none;
  193 + }
  194 +
  195 + .discount {
  196 + font-size: 22px;
  197 + color: #89b374;
  198 + border: solid 1px #89b374;
  199 + line-height: 35px;
  200 + padding: 0 10px;
  201 + margin-left: 10px;
  202 + display: none;
  203 + }
  204 +
  205 + .remain {
  206 + color: #b0b0b0;
  207 + font-size: 20px;
  208 + line-height: 30px;
  209 + }
  210 +
  211 + .right {
  212 + width: 130px;
  213 + float: right;
  214 + }
  215 +
  216 + .go-btn {
  217 + width: 130px;
  218 + height: 58px;
  219 + line-height: 58px;
  220 + text-align: center;
  221 + color: #fff;
  222 + font-size: 28px;
  223 + background-color: #000;
  224 + display: block;
  225 + margin-top: 25px;
  226 + }
  227 + }
  228 + }
  229 + }
  230 +}
  231 +
  232 +#mars {
  233 + .go-btn.yohonow {
  234 + display: none;
  235 + }
  236 +
  237 + .coin-pic-s {
  238 + background-image: resolve("home/family/mars-s.png") !important;
  239 + }
  240 +
  241 + .act-item {
  242 + .pic {
  243 + .level {
  244 + display: block !important;
  245 + border-radius: 23px 0 0 23px;
  246 + }
  247 + }
  248 +
  249 + .info {
  250 + .num {
  251 + color: #000 !important;
  252 + }
  253 +
  254 + .old-price {
  255 + display: block !important;
  256 + }
  257 +
  258 + .discount {
  259 + display: block !important;
  260 + }
  261 + }
  262 + }
  263 +}
  264 +
  265 +#yohonow {
  266 + .go-btn.mars {
  267 + display: none;
  268 + }
  269 +
  270 + .act-item {
  271 + .pic {
  272 + .bg {
  273 + display: block !important;
  274 + }
  275 +
  276 + .title {
  277 + display: block !important;
  278 + }
  279 + }
  280 + }
  281 +}
  282 +
  283 +.is-now-app {
  284 + #mars-tab {
  285 + .go-btn {
  286 + background-color: #ccc;
  287 + color: #fff;
  288 + }
  289 + }
  290 +}
  291 +
  292 +.is-mars-app {
  293 + #yohonow-tab {
  294 + .go-btn {
  295 + background-color: #ccc;
  296 + color: #fff;
  297 + }
  298 + }
  299 +}
  1 +html,
  2 +body {
  3 + background-color: #f0f0f0;
  4 +}
  5 +
  6 +input,
  7 +select {
  8 + border: 0;
  9 + background: 0;
  10 + appearance: none;
  11 + -moz-appearance: none;
  12 + -webkit-appearance: none;
  13 +}
  14 +
  15 +input::-webkit-clear-button {
  16 + width: 0;
  17 +}
  18 +
  19 +input::-webkit-calendar-picker-indicator {
  20 + width: 0;
  21 +}
  22 +
  23 +.family-user-info {
  24 + .info-list {
  25 + padding-left: 30px;
  26 + background-color: #fff;
  27 + margin-bottom: 20px;
  28 +
  29 + .list-item {
  30 + display: block;
  31 + height: 90px;
  32 + line-height: 90px;
  33 + padding-right: 30px;
  34 + border-bottom: solid 1px #e0e0e0;
  35 +
  36 + .title {
  37 + width: 220px;
  38 + float: left;
  39 + font-size: 30px;
  40 + }
  41 +
  42 + .main {
  43 + width: 450px;
  44 + float: left;
  45 + min-height: 90px;
  46 + padding: 10px 0;
  47 + padding-right: 20px;
  48 + position: relative;
  49 +
  50 + .ewm {
  51 + width: 43px;
  52 + height: 43px;
  53 + background-image: resolve("home/family/person-ewm.png");
  54 + float: right;
  55 + margin-top: 12px;
  56 + background-size: 100% 100%;
  57 + }
  58 + }
  59 +
  60 + .arr {
  61 + width: 20px;
  62 + float: left;
  63 + color: #b0b0b0;
  64 + }
  65 +
  66 + select.inp {
  67 + width: auto;
  68 + direction: rtl;
  69 + }
  70 +
  71 + .inp {
  72 + width: 430px;
  73 + height: 70px;
  74 + line-height: 70px;
  75 + font-size: 30px;
  76 + color: #b0b0b0;
  77 + text-align: right;
  78 + float: right;
  79 + padding: 0;
  80 + }
  81 +
  82 + .inp-2 {
  83 + float: right;
  84 + width: 400px;
  85 + padding-right: 3%;
  86 + }
  87 +
  88 + label {
  89 + width: 30px;
  90 + float: right;
  91 + line-height: 70px;
  92 + font-size: 30px;
  93 + color: #b0b0b0;
  94 + }
  95 +
  96 + .date-c {
  97 + position: absolute;
  98 + top: 10px;
  99 + right: -20px;
  100 + width: 300px;
  101 + white-space: nowrap;
  102 + overflow: hidden;
  103 + direction: rtl;
  104 + }
  105 +
  106 + .select-c {
  107 + position: absolute;
  108 + top: 10px;
  109 + right: 20px;
  110 + width: 70px;
  111 + white-space: nowrap;
  112 + overflow: hidden;
  113 + direction: rtl;
  114 + }
  115 +
  116 + .pic {
  117 + float: right;
  118 + width: 100px;
  119 + height: 100px;
  120 + border-radius: 50%;
  121 + overflow: hidden;
  122 + background-size: contain;
  123 + background-position: center center;
  124 + background-image: resolve("home/index/user-avatar.png");
  125 + }
  126 +
  127 + &.user-pic {
  128 + height: 140px;
  129 + line-height: 140px;
  130 +
  131 + .main {
  132 + padding: 20px 0;
  133 + padding-right: 20px;
  134 + }
  135 + }
  136 + }
  137 +
  138 + .list-item:last-child {
  139 + border-bottom: 0;
  140 + }
  141 + }
  142 +
  143 + .foot-tip {
  144 + background-color: #f0f0f0 !important;
  145 + margin-top: 80px;
  146 +
  147 + .pic {
  148 + background-image: resolve("home/family/foot.png");
  149 + width: 140px;
  150 + height: 80px;
  151 + background-size: 100% 100%;
  152 + margin: 0 auto 15px;
  153 + }
  154 +
  155 + width: 750px;
  156 + padding: 30px;
  157 + font-size: 24px;
  158 + color: #b0b0b0;
  159 + line-height: 38px;
  160 + }
  161 +}
  1 +@import "layout/swiper";
  2 +@import "family/down-load";
  3 +
  4 +.yoho-family-page {
  5 + background-color: #f0f0f0;
  6 + margin-bottom: 40px;
  7 +
  8 + .family-heade {
  9 + background: linear-gradient(#46ba8e, #67c7c0);
  10 + padding-bottom: 50px;
  11 +
  12 + .header-top {
  13 + height: 126px;
  14 + line-height: 96px;
  15 + color: #fff;
  16 + padding: 34px 30px 0;
  17 +
  18 + .back {
  19 + width: 40px;
  20 + height: 40px;
  21 + background-image: resolve("home/family/back.png");
  22 + background-size: 50% 100%;
  23 + background-repeat: no-repeat;
  24 + display: block;
  25 + float: left;
  26 + margin-top: 10px;
  27 + }
  28 +
  29 + .headings {
  30 + display: inline-block;
  31 + height: 50px;
  32 + width: 87px;
  33 + background-image: resolve("home/family/yoho-family.png");
  34 + background-size: 100% 100%;
  35 + background-repeat: no-repeat;
  36 + margin-left: 280px;
  37 + }
  38 + }
  39 +
  40 + .person-detail {
  41 + padding-left: 40px;
  42 + color: #fff;
  43 + vertical-align: bottom;
  44 + height: 160px;
  45 +
  46 + .user-avatar {
  47 + float: left;
  48 + position: relative;
  49 + width: 160px;
  50 + height: 160px;
  51 + border-radius: 50%;
  52 + background-image: resolve("home/index/user-avatar.png");
  53 + background-size: 100%;
  54 + overflow: hidden;
  55 + margin-right: 30px;
  56 + }
  57 +
  58 + .basic-info {
  59 + line-height: 55px;
  60 + }
  61 +
  62 + .user-name {
  63 + padding-right: 14px;
  64 + font-size: 48px;
  65 + height: 55px;
  66 + font-weight: bold;
  67 + line-height: 55px;
  68 + }
  69 +
  70 + .gender {
  71 + background-size: 100% 100%;
  72 + display: inline-block;
  73 + width: 29px;
  74 + height: 38px;
  75 + }
  76 +
  77 + .boy {
  78 + background-image: resolve("home/family/boy.png");
  79 + }
  80 +
  81 + .girl {
  82 + background-image: resolve("home/family/girl.png");
  83 + }
  84 +
  85 + .info {
  86 + font-size: 24px;
  87 + margin-left: 160px;
  88 + text-align: left;
  89 + }
  90 +
  91 + .birthday {
  92 + margin-left: 15px;
  93 + }
  94 +
  95 + .invition {
  96 + margin-top: 15px;
  97 + font-size: 30px;
  98 + }
  99 +
  100 + .inviton-set {
  101 + width: 495px;
  102 + height: 48px;
  103 + margin-top: 15px;
  104 + background-image: resolve("home/family/write-bg.png");
  105 + background-size: 100%;
  106 + background-repeat: no-repeat;
  107 + margin-left: 190px;
  108 + }
  109 +
  110 + textarea {
  111 + width: 460px;
  112 + height: 40px;
  113 + border: none;
  114 + resize: none;
  115 + margin-left: 30px;
  116 + line-height: 40px;
  117 + color: #807e7e;
  118 + font-size: 18px;
  119 + }
  120 +
  121 + .trend-code {
  122 + display: inline-block;
  123 + vertical-align: top;
  124 + line-height: 40px;
  125 +
  126 + .word-outer {
  127 + display: inline-block;
  128 + overflow: hidden;
  129 + vertical-align: top;
  130 + height: 40px;
  131 + max-width: 156px;
  132 + white-space: nowrap;
  133 + }
  134 +
  135 + .trend-word {
  136 + display: inline-block;
  137 + overflow: hidden;
  138 + vertical-align: top;
  139 + height: 40px;
  140 + position: relative;
  141 + white-space: nowrap;
  142 + }
  143 +
  144 + .rem-lin {
  145 + margin-right: -8px;
  146 + }
  147 + }
  148 +
  149 + .code-set {
  150 + background-image: resolve("home/index/code-set.png");
  151 + background-repeat: no-repeat;
  152 + background-size: 100% 93%;
  153 + display: inline-block;
  154 + width: 40px;
  155 + height: 44px;
  156 + margin-left: 5px;
  157 + }
  158 +
  159 + .code-tip {
  160 + background-image: resolve("home/family/tag.png");
  161 + background-repeat: no-repeat;
  162 + background-size: 100%;
  163 + width: 125px;
  164 + height: 36px;
  165 + display: inline-block;
  166 + margin-left: 13px;
  167 + }
  168 + }
  169 + }
  170 +
  171 + .title {
  172 + font-size: 34px;
  173 + line-height: 100px;
  174 + height: 100px;
  175 + display: inline-block;
  176 + color: #1a1a1a;
  177 + padding-left: 30px;
  178 + width: 100%;
  179 + background-color: #fff;
  180 + }
  181 +
  182 + .vip-grade {
  183 + background-color: #fff;
  184 +
  185 + .grade-content {
  186 + width: 100%;
  187 + overflow: hidden;
  188 + }
  189 +
  190 + .content-item {
  191 + width: 250px;
  192 + margin-bottom: 50px;
  193 + float: left;
  194 + text-align: center;
  195 + height: 240px;
  196 +
  197 + .item-tag {
  198 + width: 140px;
  199 + height: 140px;
  200 + margin-bottom: 12px;
  201 + border-radius: 20px;
  202 + overflow: hidden;
  203 + }
  204 +
  205 + .name {
  206 + font-size: 28px;
  207 + color: #43b938;
  208 + display: block;
  209 + line-height: 46px;
  210 + }
  211 +
  212 + .level {
  213 + font-size: 24px;
  214 + color: #b0b0b0;
  215 + display: block;
  216 + }
  217 + }
  218 + }
  219 +
  220 + .integral {
  221 + margin: 30px 0;
  222 +
  223 + .integral-content {
  224 + background-color: #fff;
  225 + padding-left: 30px;
  226 + padding-bottom: 40px;
  227 + overflow: hidden;
  228 + position: relative;
  229 +
  230 + .charts {
  231 + float: left;
  232 + }
  233 + }
  234 +
  235 + .integral-total {
  236 + width: 180px;
  237 + position: relative;
  238 + top: 110px;
  239 + left: -264px;
  240 + text-align: center;
  241 + overflow: hidden;
  242 + border-radius: 39px;
  243 + display: block;
  244 +
  245 + .total {
  246 + font-size: 55px;
  247 + color: #43b989;
  248 + }
  249 +
  250 + .name {
  251 + font-size: 24px;
  252 + display: inline-block;
  253 + width: 100%;
  254 + }
  255 + }
  256 +
  257 + .mark {
  258 + width: 350px;
  259 + position: absolute;
  260 + right: 30px;
  261 + font-size: 24px;
  262 + top: 20px;
  263 + }
  264 +
  265 + .mark-item {
  266 + color: #000;
  267 + display: inline-block;
  268 + line-height: 40px;
  269 + width: 100%;
  270 +
  271 + .item-name {
  272 + margin-right: 14px;
  273 + text-align: right;
  274 + width: 120px;
  275 + display: inline-block;
  276 + }
  277 +
  278 + .item-color {
  279 + display: inline-block;
  280 + width: 20px;
  281 + height: 20px;
  282 + border-radius: 10px;
  283 + margin-right: 14px;
  284 + }
  285 +
  286 + .item-percent {
  287 + float: right;
  288 + color: #b0b0b0;
  289 + width: 50px;
  290 + }
  291 + }
  292 +
  293 + .instruction {
  294 + color: #b0b0b0;
  295 + display: inline-block;
  296 + width: 100%;
  297 + line-height: 32px;
  298 + margin-top: 10px;
  299 +
  300 + span {
  301 + width: 84%;
  302 + float: right;
  303 + }
  304 + }
  305 + }
  306 +
  307 + .resource-content {
  308 + overflow: hidden;
  309 +
  310 + .resource-own {
  311 + margin-bottom: 20px;
  312 + }
  313 + }
  314 +
  315 + .vip-detail {
  316 + position: fixed;
  317 + top: 0;
  318 + width: 100%;
  319 + height: 100%;
  320 + z-index: 5;
  321 +
  322 + .close {
  323 + height: 50px;
  324 + width: 50px;
  325 + background-image: resolve("home/family/close.png");
  326 + background-size: 100%;
  327 + background-repeat: no-repeat;
  328 + position: relative;
  329 + top: 150px;
  330 + right: -668px;
  331 + z-index: 6;
  332 + }
  333 +
  334 + .back {
  335 + width: 100%;
  336 + height: 100%;
  337 + position: fixed;
  338 + left: 0;
  339 + right: 0;
  340 + top: 0;
  341 + bottom: 0;
  342 + background: #000;
  343 + opacity: 0.5;
  344 + }
  345 +
  346 + .detail-content {
  347 + width: 630px;
  348 + height: auto;
  349 + background-color: #fff;
  350 + position: fixed;
  351 + top: 0;
  352 + left: 50%;
  353 + margin-top: 180px;
  354 + margin-left: -315px;
  355 + border-bottom-left-radius: 10px;
  356 + border-bottom-right-radius: 10px;
  357 + }
  358 +
  359 + .banner {
  360 + width: 100%;
  361 + height: 200px;
  362 + }
  363 +
  364 + .user-info {
  365 + padding: 34px 40px 115px;
  366 + background-color: #fff;
  367 + border-bottom: solid 1px #e5e5e5;
  368 +
  369 + .base {
  370 + .intro {
  371 + padding: 0 0 15px 30px;
  372 + float: left;
  373 + width: 400px;
  374 + }
  375 +
  376 + .name {
  377 + color: #000;
  378 + font-size: 30px;
  379 + line-height: 60px;
  380 + }
  381 +
  382 + .level {
  383 + font-size: 24px;
  384 + line-height: 32px;
  385 + color: #000;
  386 + }
  387 +
  388 + .now {
  389 + float: left;
  390 + }
  391 +
  392 + .next {
  393 + float: left;
  394 + }
  395 + }
  396 +
  397 + .pic {
  398 + width: 120px;
  399 + height: 120px;
  400 + float: left;
  401 + background-size: 100% 100%;
  402 + background-position: center;
  403 + border-radius: 50%;
  404 + border: 1px solid #eee;
  405 + position: relative;
  406 + background-image: resolve("home/index/user-avatar.png");
  407 +
  408 + .level-pic {
  409 + width: 82px;
  410 + height: 36px;
  411 + background-size: 100% 100%;
  412 + position: absolute;
  413 + bottom: -18px;
  414 + left: 50%;
  415 + margin-left: -41px;
  416 + }
  417 +
  418 + .vip-3 {
  419 + background-image: url("/home/grade-new/vip-3.png");
  420 + }
  421 +
  422 + .vip-2 {
  423 + background-image: url("/home/grade-new/vip-2.png");
  424 + }
  425 +
  426 + .vip-1 {
  427 + background-image: url("/home/grade-new/vip-1.png");
  428 + }
  429 + }
  430 +
  431 + .level-process {
  432 + padding: 0 10px;
  433 +
  434 + .line-c {
  435 + width: 530px;
  436 + height: 4px;
  437 + background-color: #f0f0f0;
  438 + margin: 50px auto 0;
  439 + position: relative;
  440 + }
  441 +
  442 + .line {
  443 + width: 470px;
  444 + height: 100%;
  445 + max-width: 100%;
  446 + background-color: #444;
  447 + }
  448 +
  449 + .point {
  450 + width: 490px;
  451 + position: absolute;
  452 + top: -9px;
  453 + left: -2px;
  454 + }
  455 +
  456 + .point-item {
  457 + width: 23px;
  458 + height: 23px;
  459 + background-image: resolve("home/family/point.png");
  460 + background-size: 100%;
  461 + background-repeat: no-repeat;
  462 + float: left;
  463 + position: relative;
  464 + }
  465 +
  466 + .point-item:last-child {
  467 + margin-right: 0;
  468 + }
  469 +
  470 + .level-text {
  471 + width: 120px;
  472 + position: absolute;
  473 + top: 29px;
  474 + left: 50%;
  475 + margin-left: -60px;
  476 + font-size: 24px;
  477 + text-align: center;
  478 + line-height: 40px;
  479 + }
  480 + }
  481 + }
  482 +
  483 + .privilege-list {
  484 + .privilege-title {
  485 + height: 70px;
  486 + line-height: 70px;
  487 + font-size: 24px;
  488 + border-bottom: 1px solid #e5e5e5;
  489 + display: inline-block;
  490 + width: 100%;
  491 + color: #000;
  492 + padding-left: 40px;
  493 +
  494 + b {
  495 + display: block;
  496 + width: 10px;
  497 + height: 10px;
  498 + background-color: #000;
  499 + float: left;
  500 + margin-top: 30px;
  501 + margin-right: 10px;
  502 + }
  503 +
  504 + .more {
  505 + float: right;
  506 + margin-right: 47px;
  507 + }
  508 + }
  509 +
  510 + .icon {
  511 + float: left;
  512 + display: block;
  513 + width: 1.75rem;
  514 + height: 1.75rem;
  515 + }
  516 +
  517 + .transverse {
  518 + overflow-x: scroll;
  519 + overflow-y: hidden;
  520 + white-space: nowrap;
  521 + width: 100%;
  522 + }
  523 +
  524 + .privilege-item {
  525 + clear: both;
  526 + float: left;
  527 + padding: 25px 0;
  528 + border-bottom: solid 1px #e5e5e5;
  529 + position: relative;
  530 + margin-left: 40px;
  531 +
  532 + &:last-child {
  533 + border-bottom: none;
  534 + }
  535 +
  536 + .iconfont {
  537 + float: right;
  538 + line-height: 70px;
  539 + position: absolute;
  540 + top: 50%;
  541 + transform: translate(-50%, -50%);
  542 + right: -10px;
  543 + }
  544 + }
  545 +
  546 + .privilege-item:last-child {
  547 + border-bottom: none;
  548 + }
  549 +
  550 + p {
  551 + font-size: 28px;
  552 + margin-left: 30px;
  553 + min-height: 70px;
  554 + width: 480px;
  555 + float: left;
  556 + }
  557 +
  558 + span {
  559 + display: block;
  560 + color: #b0b0b0;
  561 + font-size: 22px;
  562 + }
  563 +
  564 + .level-item {
  565 + width: 175px;
  566 + text-align: center;
  567 + display: inline-block;
  568 + margin-bottom: 50px;
  569 + margin-right: 40px;
  570 + vertical-align: top;
  571 +
  572 + .item-ico {
  573 + width: 125px;
  574 + height: 125px;
  575 + border-radius: 50%;
  576 + overflow: hidden;
  577 + margin-top: 30px;
  578 + margin-bottom: 20px;
  579 + }
  580 +
  581 + .le-name {
  582 + font-size: 28px;
  583 + line-height: 36px;
  584 + color: #000;
  585 + white-space: normal;
  586 + }
  587 +
  588 + .state {
  589 + font-size: 24px;
  590 + color: #b0b0b0;
  591 + margin-top: 10px;
  592 + }
  593 + }
  594 + }
  595 +
  596 + .birthday {
  597 + margin-left: 40px;
  598 + font-size: 24px;
  599 + color: #1a1a1a;
  600 + margin-bottom: 30px;
  601 + display: inherit;
  602 +
  603 + b {
  604 + display: block;
  605 + width: 10px;
  606 + height: 10px;
  607 + background-color: #000;
  608 + float: left;
  609 + margin-top: 11px;
  610 + margin-right: 10px;
  611 + }
  612 + }
  613 + }
  614 +
  615 + .yohobuy {
  616 + .banner {
  617 + background-image: resolve("home/family/vip-detail/yohobuy.jpg");
  618 + background-repeat: no-repeat;
  619 + background-size: 100%;
  620 + }
  621 +
  622 + .user-info {
  623 + .level-process {
  624 + padding: 0 30px;
  625 +
  626 + .line-c {
  627 + width: 490px;
  628 + }
  629 +
  630 + .point-item {
  631 + margin-right: 132px;
  632 + }
  633 + }
  634 + }
  635 + }
  636 +
  637 + .mars {
  638 + .banner {
  639 + background-image: resolve("home/family/vip-detail/mars.jpg");
  640 + background-repeat: no-repeat;
  641 + background-size: 100%;
  642 + }
  643 +
  644 + .user-info {
  645 + .level-process {
  646 + .line-c {
  647 + width: 530px;
  648 + }
  649 +
  650 + .point {
  651 + width: 540px;
  652 + }
  653 +
  654 + .point-item {
  655 + margin-right: 80px;
  656 + }
  657 + }
  658 + }
  659 + }
  660 +
  661 + .coffee {
  662 + .banner {
  663 + background-image: resolve("home/family/vip-detail/yocoffee.jpg");
  664 + background-repeat: no-repeat;
  665 + background-size: 100%;
  666 + }
  667 +
  668 + .user-info {
  669 + .level-process {
  670 + .line-c {
  671 + width: 530px;
  672 + }
  673 +
  674 + .point {
  675 + width: 540px;
  676 + }
  677 +
  678 + .point-item {
  679 + margin-right: 232px;
  680 + }
  681 + }
  682 + }
  683 + }
  684 +
  685 + .green {
  686 + .banner {
  687 + background-image: resolve("home/family/vip-detail/yogreen.jpg");
  688 + background-repeat: no-repeat;
  689 + background-size: 100%;
  690 + }
  691 +
  692 + .user-info {
  693 + .level-process {
  694 + .line-c {
  695 + width: 520px;
  696 + }
  697 +
  698 + .point {
  699 + width: 540px;
  700 + }
  701 +
  702 + .point-item {
  703 + margin-right: 146px;
  704 + }
  705 + }
  706 + }
  707 + }
  708 +
  709 + .little {
  710 + .banner {
  711 + background-image: resolve("home/family/vip-detail/yolittle.jpg");
  712 + background-repeat: no-repeat;
  713 + background-size: 100%;
  714 + }
  715 +
  716 + .user-info {
  717 + .level-process {
  718 + .line-c {
  719 + width: 530px;
  720 + }
  721 +
  722 + .point {
  723 + width: 540px;
  724 + }
  725 +
  726 + .point-item {
  727 + margin-right: 232px;
  728 + }
  729 + }
  730 + }
  731 + }
  732 +}
  1 +.down-load-detail {
  2 + position: fixed;
  3 + top: 0;
  4 + width: 100%;
  5 + height: 100%;
  6 + z-index: 5;
  7 +
  8 + .down-close {
  9 + height: 50px;
  10 + width: 50px;
  11 + background-image: resolve("home/family/close.png");
  12 + background-size: 100%;
  13 + background-repeat: no-repeat;
  14 + position: relative;
  15 + top: 80px;
  16 + right: -668px;
  17 + z-index: 6;
  18 + }
  19 +
  20 + .back {
  21 + width: 100%;
  22 + height: 100%;
  23 + position: fixed;
  24 + left: 0;
  25 + right: 0;
  26 + top: 0;
  27 + bottom: 0;
  28 + background: #000;
  29 + opacity: 0.5;
  30 + }
  31 +
  32 + .detail-content {
  33 + height: auto;
  34 + margin-top: 109px;
  35 + position: fixed;
  36 + top: 0;
  37 + left: 50%;
  38 + border-radius: 10px;
  39 + }
  40 +
  41 + .yohobuy,
  42 + .now,
  43 + .mars {
  44 + width: 630px;
  45 + margin-left: -315px;
  46 + }
  47 +
  48 + .coffee,
  49 + .little,
  50 + .green {
  51 + width: 670px;
  52 + margin-left: -340px;
  53 +
  54 + .code-copy {
  55 + width: 64px;
  56 + height: 38px;
  57 + display: inline-block;
  58 + position: relative;
  59 + line-height: 38px;
  60 + text-align: center;
  61 + border: 1px solid;
  62 + color: #fff;
  63 + background-color: #444;
  64 + border-radius: 5px;
  65 + font-size: 24px;
  66 + }
  67 + }
  68 +
  69 + .green {
  70 + .code-copy {
  71 + top: -684px;
  72 + left: 356px;
  73 + }
  74 + }
  75 +
  76 + .little {
  77 + .code-copy {
  78 + top: -656px;
  79 + left: 380px;
  80 + }
  81 + }
  82 +
  83 + .coffee {
  84 + .code-copy {
  85 + top: -684px;
  86 + left: 364px;
  87 + }
  88 + }
  89 +
  90 + .hide {
  91 + display: none;
  92 + }
  93 +}
  1 +.city-swiper {
  2 + display: none;
  3 + width: 750px;
  4 + height: 430px;
  5 + position: fixed;
  6 + bottom: 0;
  7 + left: 0;
  8 + background-color: #d2d5da;
  9 + border-top: solid 1px #939598;
  10 +
  11 + .swiper-header {
  12 + height: 70px;
  13 + background-color: #f0f0f1;
  14 +
  15 + div {
  16 + line-height: 70px;
  17 + color: #3478f6;
  18 + font-size: 30px;
  19 + padding: 0 20px;
  20 + }
  21 +
  22 + .cancel {
  23 + float: left;
  24 + }
  25 +
  26 + .ok {
  27 + float: right;
  28 + }
  29 + }
  30 +
  31 + .swiper-list {
  32 + height: 360px;
  33 + width: 750px;
  34 + overflow: hidden;
  35 + position: relative;
  36 + }
  37 +
  38 + .swiper-container {
  39 + width: 50%;
  40 + height: 360px;
  41 + float: left;
  42 + }
  43 +
  44 + .swiper-slide {
  45 + text-align: center;
  46 + transform: rotateX(45deg);
  47 + -webkit-transform: rotateX(45deg);
  48 + color: #aeb0b5;
  49 + font-size: 30px;
  50 + display: -webkit-flex;
  51 + display: flex;
  52 + -webkit-box-align: center;
  53 + -webkit-align-items: center;
  54 + align-items: center;
  55 + -webkit-justify-content: center;
  56 + justify-content: center;
  57 + }
  58 +
  59 + .swiper-slide-prev {
  60 + transform: rotateX(30deg);
  61 + -webkit-transform: rotateX(30deg);
  62 + color: #888a8e;
  63 + }
  64 +
  65 + .swiper-slide-next {
  66 + transform: rotateX(30deg);
  67 + -webkit-transform: rotateX(30deg);
  68 + color: #888a8e;
  69 + }
  70 +
  71 + .swiper-slide-active {
  72 + transform: rotateX(0);
  73 + -webkit-transform: rotateX(0);
  74 + color: #2a2a2b;
  75 + }
  76 +
  77 + .swiper-line {
  78 + position: absolute;
  79 + top: 50%;
  80 + left: 0;
  81 + width: 750px;
  82 + border-top: solid 1px #a8abae;
  83 + border-bottom: solid 1px #a8abae;
  84 + z-index: -1;
  85 + }
  86 +}
@@ -148,6 +148,18 @@ @@ -148,6 +148,18 @@
148 color: #fff; 148 color: #fff;
149 display: block; 149 display: block;
150 } 150 }
  151 +
  152 + .family-entry {
  153 + width: 136px;
  154 + height: 136px;
  155 + position: absolute;
  156 + bottom: 0;
  157 + right: 0;
  158 + display: block;
  159 + background-size: 100%;
  160 + background-repeat: no-repeat;
  161 + background-image: resolve("home/index/family-entry.gif");
  162 + }
151 } 163 }
152 164
153 .notice-c { 165 .notice-c {