+ // add to parents
+ var parent = bufArray[0] || results;
+ if (parent.nodes === undefined) {
+ parent.nodes = [];
+ }
+ parent.nodes.push(node);
+ } else {
+ bufArray.unshift(node);
+ }
+ },
+ end: function (tag) {
+ //debug(tag);
+ // merge into parent tag
+ var node = bufArray.shift();
+ if (node.tag !== tag) console.error('invalid state: mismatch end tag');
+
+ if (bufArray.length === 0) {
+ results.nodes.push(node);
+ } else {
+ var parent = bufArray[0];
+ if (parent.nodes === undefined) {
+ parent.nodes = [];
+ }
+ parent.nodes.push(node);
+ }
+ },
+ chars: function (text) {
+ //debug(text);
+ var node = {
+ node: 'text',
+ text: text,
+ textArray:transEmojiStr(text)
+ };
+
+ if (bufArray.length === 0) {
+ results.nodes.push(node);
+ } else {
+ var parent = bufArray[0];
+ if (parent.nodes === undefined) {
+ parent.nodes = [];
+ }
+ parent.nodes.push(node);
+ }
+ },
+ comment: function (text) {
+ //debug(text);
+ var node = {
+ node: 'comment',
+ text: text,
+ };
+ var parent = bufArray[0];
+ if (parent.nodes === undefined) {
+ parent.nodes = [];
+ }
+ parent.nodes.push(node);
+ },
+ });
+ return results;
+};
+
+function transEmojiStr(str){
+ // var eReg = new RegExp("["+__reg+' '+"]");
+// str = str.replace(/\[([^\[\]]+)\]/g,':$1:')
+
+ var emojiObjs = [];
+ //如果正则表达式为空
+ if(__emojisReg.length == 0 || !__emojis){
+ var emojiObj = {}
+ emojiObj.node = "text";
+ emojiObj.text = str;
+ array = [emojiObj];
+ return array;
+ }
+ //这个地方需要调整
+ str = str.replace(/\[([^\[\]]+)\]/g,':$1:')
+ var eReg = new RegExp("[:]");
+ var array = str.split(eReg);
+ for(var i = 0; i < array.length; i++){
+ var ele = array[i];
+ var emojiObj = {};
+ if(__emojis[ele]){
+ emojiObj.node = "element";
+ emojiObj.tag = "emoji";
+ emojiObj.text = __emojis[ele];
+ emojiObj.baseSrc= __emojisBaseSrc;
+ }else{
+ emojiObj.node = "text";
+ emojiObj.text = ele;
+ }
+ emojiObjs.push(emojiObj);
+ }
+
+ return emojiObjs;
+}
+
+function emojisInit(reg='',baseSrc="/wxParse/emojis/",emojis){
+ __emojisReg = reg;
+ __emojisBaseSrc=baseSrc;
+ __emojis=emojis;
+}
+
+module.exports = {
+ html2json: html2json,
+ emojisInit:emojisInit
+};
+
diff --git a/wx-mini-program/lib/wxParse/htmlparser.js b/wx-mini-program/lib/wxParse/htmlparser.js
new file mode 100644
index 0000000..7406b45
--- /dev/null
+++ b/wx-mini-program/lib/wxParse/htmlparser.js
@@ -0,0 +1,182 @@
+/**
+ * author: Di (微信小程序开发工程师)
+ * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
+ * 垂直微信小程序开发交流社区
+ *
+ * github地址: https://github.com/icindy/wxParse
+ *
+ * for: 微信小程序富文本解析
+ * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
+ */
+// Regular Expressions for parsing tags and attributes
+var startTag = /^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/,
+ endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/,
+ attr = /([a-zA-Z_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g;
+
+// Empty Elements - HTML 5
+var empty = makeMap("area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr");
+
+// Block Elements - HTML 5
+var block = makeMap("a,address,code,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video");
+
+// Inline Elements - HTML 5
+var inline = makeMap("abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var");
+
+// Elements that you can, intentionally, leave open
+// (and which close themselves)
+var closeSelf = makeMap("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr");
+
+// Attributes that have their values filled in disabled="disabled"
+var fillAttrs = makeMap("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected");
+
+// Special Elements (can contain anything)
+var special = makeMap("wxxxcode-style,script,style,view,scroll-view,block");
+
+function HTMLParser(html, handler) {
+ var index, chars, match, stack = [], last = html;
+ stack.last = function () {
+ return this[this.length - 1];
+ };
+
+ while (html) {
+ chars = true;
+
+ // Make sure we're not in a script or style element
+ if (!stack.last() || !special[stack.last()]) {
+
+ // Comment
+ if (html.indexOf("");
+
+ if (index >= 0) {
+ if (handler.comment)
+ handler.comment(html.substring(4, index));
+ html = html.substring(index + 3);
+ chars = false;
+ }
+
+ // end tag
+ } else if (html.indexOf("") == 0) {
+ match = html.match(endTag);
+
+ if (match) {
+ html = html.substring(match[0].length);
+ match[0].replace(endTag, parseEndTag);
+ chars = false;
+ }
+
+ // start tag
+ } else if (html.indexOf("<") == 0) {
+ match = html.match(startTag);
+
+ if (match) {
+ html = html.substring(match[0].length);
+ match[0].replace(startTag, parseStartTag);
+ chars = false;
+ }
+ }
+
+ if (chars) {
+ index = html.indexOf("<");
+
+ var text = index < 0 ? html : html.substring(0, index);
+ html = index < 0 ? "" : html.substring(index);
+
+ if (handler.chars)
+ handler.chars(text);
+ }
+
+ } else {
+
+ html = html.replace(new RegExp("([\\s\\S]*?)<\/" + stack.last() + "[^>]*>"), function (all, text) {
+ text = text.replace(/|/g, "$1$2");
+ if (handler.chars)
+ handler.chars(text);
+
+ return "";
+ });
+
+
+ parseEndTag("", stack.last());
+ }
+
+ if (html == last)
+ throw "Parse Error: " + html;
+ last = html;
+ }
+
+ // Clean up any remaining tags
+ parseEndTag();
+
+ function parseStartTag(tag, tagName, rest, unary) {
+ tagName = tagName.toLowerCase();
+
+ if (block[tagName]) {
+ while (stack.last() && inline[stack.last()]) {
+ parseEndTag("", stack.last());
+ }
+ }
+
+ if (closeSelf[tagName] && stack.last() == tagName) {
+ parseEndTag("", tagName);
+ }
+
+ unary = empty[tagName] || !!unary;
+
+ if (!unary)
+ stack.push(tagName);
+
+ if (handler.start) {
+ var attrs = [];
+
+ rest.replace(attr, function (match, name) {
+ var value = arguments[2] ? arguments[2] :
+ arguments[3] ? arguments[3] :
+ arguments[4] ? arguments[4] :
+ fillAttrs[name] ? name : "";
+
+ attrs.push({
+ name: name,
+ value: value,
+ escaped: value.replace(/(^|[^\\])"/g, '$1\\\"') //"
+ });
+ });
+
+ if (handler.start) {
+ handler.start(tagName, attrs, unary);
+ }
+
+ }
+ }
+
+ function parseEndTag(tag, tagName) {
+ // If no tag name is provided, clean shop
+ if (!tagName)
+ var pos = 0;
+
+ // Find the closest opened tag of the same type
+ else
+ for (var pos = stack.length - 1; pos >= 0; pos--)
+ if (stack[pos] == tagName)
+ break;
+
+ if (pos >= 0) {
+ // Close all the open elements, up the stack
+ for (var i = stack.length - 1; i >= pos; i--)
+ if (handler.end)
+ handler.end(stack[i]);
+
+ // Remove the open elements from the stack
+ stack.length = pos;
+ }
+ }
+};
+
+function makeMap(str) {
+ var obj = {}, items = str.split(",");
+ for (var i = 0; i < items.length; i++)
+ obj[items[i]] = true;
+ return obj;
+}
+
+module.exports = HTMLParser;
diff --git a/wx-mini-program/lib/wxParse/showdown.js b/wx-mini-program/lib/wxParse/showdown.js
new file mode 100644
index 0000000..a1f830f
--- /dev/null
+++ b/wx-mini-program/lib/wxParse/showdown.js
@@ -0,0 +1,2529 @@
+/**
+ * author: Di (微信小程序开发工程师)
+ * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
+ * 垂直微信小程序开发交流社区
+ *
+ * github地址: https://github.com/icindy/wxParse
+ *
+ * for: 微信小程序富文本解析
+ * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
+ */
+
+function getDefaultOpts(simple) {
+ 'use strict';
+
+ var defaultOptions = {
+ omitExtraWLInCodeBlocks: {
+ defaultValue: false,
+ describe: 'Omit the default extra whiteline added to code blocks',
+ type: 'boolean'
+ },
+ noHeaderId: {
+ defaultValue: false,
+ describe: 'Turn on/off generated header id',
+ type: 'boolean'
+ },
+ prefixHeaderId: {
+ defaultValue: false,
+ describe: 'Specify a prefix to generated header ids',
+ type: 'string'
+ },
+ headerLevelStart: {
+ defaultValue: false,
+ describe: 'The header blocks level start',
+ type: 'integer'
+ },
+ parseImgDimensions: {
+ defaultValue: false,
+ describe: 'Turn on/off image dimension parsing',
+ type: 'boolean'
+ },
+ simplifiedAutoLink: {
+ defaultValue: false,
+ describe: 'Turn on/off GFM autolink style',
+ type: 'boolean'
+ },
+ literalMidWordUnderscores: {
+ defaultValue: false,
+ describe: 'Parse midword underscores as literal underscores',
+ type: 'boolean'
+ },
+ strikethrough: {
+ defaultValue: false,
+ describe: 'Turn on/off strikethrough support',
+ type: 'boolean'
+ },
+ tables: {
+ defaultValue: false,
+ describe: 'Turn on/off tables support',
+ type: 'boolean'
+ },
+ tablesHeaderId: {
+ defaultValue: false,
+ describe: 'Add an id to table headers',
+ type: 'boolean'
+ },
+ ghCodeBlocks: {
+ defaultValue: true,
+ describe: 'Turn on/off GFM fenced code blocks support',
+ type: 'boolean'
+ },
+ tasklists: {
+ defaultValue: false,
+ describe: 'Turn on/off GFM tasklist support',
+ type: 'boolean'
+ },
+ smoothLivePreview: {
+ defaultValue: false,
+ describe: 'Prevents weird effects in live previews due to incomplete input',
+ type: 'boolean'
+ },
+ smartIndentationFix: {
+ defaultValue: false,
+ description: 'Tries to smartly fix identation in es6 strings',
+ type: 'boolean'
+ }
+ };
+ if (simple === false) {
+ return JSON.parse(JSON.stringify(defaultOptions));
+ }
+ var ret = {};
+ for (var opt in defaultOptions) {
+ if (defaultOptions.hasOwnProperty(opt)) {
+ ret[opt] = defaultOptions[opt].defaultValue;
+ }
+ }
+ return ret;
+}
+
+/**
+ * Created by Tivie on 06-01-2015.
+ */
+
+// Private properties
+var showdown = {},
+ parsers = {},
+ extensions = {},
+ globalOptions = getDefaultOpts(true),
+ flavor = {
+ github: {
+ omitExtraWLInCodeBlocks: true,
+ prefixHeaderId: 'user-content-',
+ simplifiedAutoLink: true,
+ literalMidWordUnderscores: true,
+ strikethrough: true,
+ tables: true,
+ tablesHeaderId: true,
+ ghCodeBlocks: true,
+ tasklists: true
+ },
+ vanilla: getDefaultOpts(true)
+ };
+
+/**
+ * helper namespace
+ * @type {{}}
+ */
+showdown.helper = {};
+
+/**
+ * TODO LEGACY SUPPORT CODE
+ * @type {{}}
+ */
+showdown.extensions = {};
+
+/**
+ * Set a global option
+ * @static
+ * @param {string} key
+ * @param {*} value
+ * @returns {showdown}
+ */
+showdown.setOption = function (key, value) {
+ 'use strict';
+ globalOptions[key] = value;
+ return this;
+};
+
+/**
+ * Get a global option
+ * @static
+ * @param {string} key
+ * @returns {*}
+ */
+showdown.getOption = function (key) {
+ 'use strict';
+ return globalOptions[key];
+};
+
+/**
+ * Get the global options
+ * @static
+ * @returns {{}}
+ */
+showdown.getOptions = function () {
+ 'use strict';
+ return globalOptions;
+};
+
+/**
+ * Reset global options to the default values
+ * @static
+ */
+showdown.resetOptions = function () {
+ 'use strict';
+ globalOptions = getDefaultOpts(true);
+};
+
+/**
+ * Set the flavor showdown should use as default
+ * @param {string} name
+ */
+showdown.setFlavor = function (name) {
+ 'use strict';
+ if (flavor.hasOwnProperty(name)) {
+ var preset = flavor[name];
+ for (var option in preset) {
+ if (preset.hasOwnProperty(option)) {
+ globalOptions[option] = preset[option];
+ }
+ }
+ }
+};
+
+/**
+ * Get the default options
+ * @static
+ * @param {boolean} [simple=true]
+ * @returns {{}}
+ */
+showdown.getDefaultOptions = function (simple) {
+ 'use strict';
+ return getDefaultOpts(simple);
+};
+
+/**
+ * Get or set a subParser
+ *
+ * subParser(name) - Get a registered subParser
+ * subParser(name, func) - Register a subParser
+ * @static
+ * @param {string} name
+ * @param {function} [func]
+ * @returns {*}
+ */
+showdown.subParser = function (name, func) {
+ 'use strict';
+ if (showdown.helper.isString(name)) {
+ if (typeof func !== 'undefined') {
+ parsers[name] = func;
+ } else {
+ if (parsers.hasOwnProperty(name)) {
+ return parsers[name];
+ } else {
+ throw Error('SubParser named ' + name + ' not registered!');
+ }
+ }
+ }
+};
+
+/**
+ * Gets or registers an extension
+ * @static
+ * @param {string} name
+ * @param {object|function=} ext
+ * @returns {*}
+ */
+showdown.extension = function (name, ext) {
+ 'use strict';
+
+ if (!showdown.helper.isString(name)) {
+ throw Error('Extension \'name\' must be a string');
+ }
+
+ name = showdown.helper.stdExtName(name);
+
+ // Getter
+ if (showdown.helper.isUndefined(ext)) {
+ if (!extensions.hasOwnProperty(name)) {
+ throw Error('Extension named ' + name + ' is not registered!');
+ }
+ return extensions[name];
+
+ // Setter
+ } else {
+ // Expand extension if it's wrapped in a function
+ if (typeof ext === 'function') {
+ ext = ext();
+ }
+
+ // Ensure extension is an array
+ if (!showdown.helper.isArray(ext)) {
+ ext = [ext];
+ }
+
+ var validExtension = validate(ext, name);
+
+ if (validExtension.valid) {
+ extensions[name] = ext;
+ } else {
+ throw Error(validExtension.error);
+ }
+ }
+};
+
+/**
+ * Gets all extensions registered
+ * @returns {{}}
+ */
+showdown.getAllExtensions = function () {
+ 'use strict';
+ return extensions;
+};
+
+/**
+ * Remove an extension
+ * @param {string} name
+ */
+showdown.removeExtension = function (name) {
+ 'use strict';
+ delete extensions[name];
+};
+
+/**
+ * Removes all extensions
+ */
+showdown.resetExtensions = function () {
+ 'use strict';
+ extensions = {};
+};
+
+/**
+ * Validate extension
+ * @param {array} extension
+ * @param {string} name
+ * @returns {{valid: boolean, error: string}}
+ */
+function validate(extension, name) {
+ 'use strict';
+
+ var errMsg = (name) ? 'Error in ' + name + ' extension->' : 'Error in unnamed extension',
+ ret = {
+ valid: true,
+ error: ''
+ };
+
+ if (!showdown.helper.isArray(extension)) {
+ extension = [extension];
+ }
+
+ for (var i = 0; i < extension.length; ++i) {
+ var baseMsg = errMsg + ' sub-extension ' + i + ': ',
+ ext = extension[i];
+ if (typeof ext !== 'object') {
+ ret.valid = false;
+ ret.error = baseMsg + 'must be an object, but ' + typeof ext + ' given';
+ return ret;
+ }
+
+ if (!showdown.helper.isString(ext.type)) {
+ ret.valid = false;
+ ret.error = baseMsg + 'property "type" must be a string, but ' + typeof ext.type + ' given';
+ return ret;
+ }
+
+ var type = ext.type = ext.type.toLowerCase();
+
+ // normalize extension type
+ if (type === 'language') {
+ type = ext.type = 'lang';
+ }
+
+ if (type === 'html') {
+ type = ext.type = 'output';
+ }
+
+ if (type !== 'lang' && type !== 'output' && type !== 'listener') {
+ ret.valid = false;
+ ret.error = baseMsg + 'type ' + type + ' is not recognized. Valid values: "lang/language", "output/html" or "listener"';
+ return ret;
+ }
+
+ if (type === 'listener') {
+ if (showdown.helper.isUndefined(ext.listeners)) {
+ ret.valid = false;
+ ret.error = baseMsg + '. Extensions of type "listener" must have a property called "listeners"';
+ return ret;
+ }
+ } else {
+ if (showdown.helper.isUndefined(ext.filter) && showdown.helper.isUndefined(ext.regex)) {
+ ret.valid = false;
+ ret.error = baseMsg + type + ' extensions must define either a "regex" property or a "filter" method';
+ return ret;
+ }
+ }
+
+ if (ext.listeners) {
+ if (typeof ext.listeners !== 'object') {
+ ret.valid = false;
+ ret.error = baseMsg + '"listeners" property must be an object but ' + typeof ext.listeners + ' given';
+ return ret;
+ }
+ for (var ln in ext.listeners) {
+ if (ext.listeners.hasOwnProperty(ln)) {
+ if (typeof ext.listeners[ln] !== 'function') {
+ ret.valid = false;
+ ret.error = baseMsg + '"listeners" property must be an hash of [event name]: [callback]. listeners.' + ln +
+ ' must be a function but ' + typeof ext.listeners[ln] + ' given';
+ return ret;
+ }
+ }
+ }
+ }
+
+ if (ext.filter) {
+ if (typeof ext.filter !== 'function') {
+ ret.valid = false;
+ ret.error = baseMsg + '"filter" must be a function, but ' + typeof ext.filter + ' given';
+ return ret;
+ }
+ } else if (ext.regex) {
+ if (showdown.helper.isString(ext.regex)) {
+ ext.regex = new RegExp(ext.regex, 'g');
+ }
+ if (!ext.regex instanceof RegExp) {
+ ret.valid = false;
+ ret.error = baseMsg + '"regex" property must either be a string or a RegExp object, but ' + typeof ext.regex + ' given';
+ return ret;
+ }
+ if (showdown.helper.isUndefined(ext.replace)) {
+ ret.valid = false;
+ ret.error = baseMsg + '"regex" extensions must implement a replace string or function';
+ return ret;
+ }
+ }
+ }
+ return ret;
+}
+
+/**
+ * Validate extension
+ * @param {object} ext
+ * @returns {boolean}
+ */
+showdown.validateExtension = function (ext) {
+ 'use strict';
+
+ var validateExtension = validate(ext, null);
+ if (!validateExtension.valid) {
+ console.warn(validateExtension.error);
+ return false;
+ }
+ return true;
+};
+
+/**
+ * showdownjs helper functions
+ */
+
+if (!showdown.hasOwnProperty('helper')) {
+ showdown.helper = {};
+}
+
+/**
+ * Check if var is string
+ * @static
+ * @param {string} a
+ * @returns {boolean}
+ */
+showdown.helper.isString = function isString(a) {
+ 'use strict';
+ return (typeof a === 'string' || a instanceof String);
+};
+
+/**
+ * Check if var is a function
+ * @static
+ * @param {string} a
+ * @returns {boolean}
+ */
+showdown.helper.isFunction = function isFunction(a) {
+ 'use strict';
+ var getType = {};
+ return a && getType.toString.call(a) === '[object Function]';
+};
+
+/**
+ * ForEach helper function
+ * @static
+ * @param {*} obj
+ * @param {function} callback
+ */
+showdown.helper.forEach = function forEach(obj, callback) {
+ 'use strict';
+ if (typeof obj.forEach === 'function') {
+ obj.forEach(callback);
+ } else {
+ for (var i = 0; i < obj.length; i++) {
+ callback(obj[i], i, obj);
+ }
+ }
+};
+
+/**
+ * isArray helper function
+ * @static
+ * @param {*} a
+ * @returns {boolean}
+ */
+showdown.helper.isArray = function isArray(a) {
+ 'use strict';
+ return a.constructor === Array;
+};
+
+/**
+ * Check if value is undefined
+ * @static
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
+ */
+showdown.helper.isUndefined = function isUndefined(value) {
+ 'use strict';
+ return typeof value === 'undefined';
+};
+
+/**
+ * Standardidize extension name
+ * @static
+ * @param {string} s extension name
+ * @returns {string}
+ */
+showdown.helper.stdExtName = function (s) {
+ 'use strict';
+ return s.replace(/[_-]||\s/g, '').toLowerCase();
+};
+
+function escapeCharactersCallback(wholeMatch, m1) {
+ 'use strict';
+ var charCodeToEscape = m1.charCodeAt(0);
+ return '~E' + charCodeToEscape + 'E';
+}
+
+/**
+ * Callback used to escape characters when passing through String.replace
+ * @static
+ * @param {string} wholeMatch
+ * @param {string} m1
+ * @returns {string}
+ */
+showdown.helper.escapeCharactersCallback = escapeCharactersCallback;
+
+/**
+ * Escape characters in a string
+ * @static
+ * @param {string} text
+ * @param {string} charsToEscape
+ * @param {boolean} afterBackslash
+ * @returns {XML|string|void|*}
+ */
+showdown.helper.escapeCharacters = function escapeCharacters(text, charsToEscape, afterBackslash) {
+ 'use strict';
+ // First we have to escape the escape characters so that
+ // we can build a character class out of them
+ var regexString = '([' + charsToEscape.replace(/([\[\]\\])/g, '\\$1') + '])';
+
+ if (afterBackslash) {
+ regexString = '\\\\' + regexString;
+ }
+
+ var regex = new RegExp(regexString, 'g');
+ text = text.replace(regex, escapeCharactersCallback);
+
+ return text;
+};
+
+var rgxFindMatchPos = function (str, left, right, flags) {
+ 'use strict';
+ var f = flags || '',
+ g = f.indexOf('g') > -1,
+ x = new RegExp(left + '|' + right, 'g' + f.replace(/g/g, '')),
+ l = new RegExp(left, f.replace(/g/g, '')),
+ pos = [],
+ t, s, m, start, end;
+
+ do {
+ t = 0;
+ while ((m = x.exec(str))) {
+ if (l.test(m[0])) {
+ if (!(t++)) {
+ s = x.lastIndex;
+ start = s - m[0].length;
+ }
+ } else if (t) {
+ if (!--t) {
+ end = m.index + m[0].length;
+ var obj = {
+ left: {start: start, end: s},
+ match: {start: s, end: m.index},
+ right: {start: m.index, end: end},
+ wholeMatch: {start: start, end: end}
+ };
+ pos.push(obj);
+ if (!g) {
+ return pos;
+ }
+ }
+ }
+ }
+ } while (t && (x.lastIndex = s));
+
+ return pos;
+};
+
+/**
+ * matchRecursiveRegExp
+ *
+ * (c) 2007 Steven Levithan tags around block-level tags. + text = showdown.subParser('hashHTMLBlocks')(text, options, globals); + text = showdown.subParser('paragraphs')(text, options, globals); + + text = globals.converter._dispatch('blockGamut.after', text, options, globals); + + return text; +}); + +showdown.subParser('blockQuotes', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('blockQuotes.before', text, options, globals); + /* + text = text.replace(/ + ( // Wrap whole match in $1 + ( + ^[ \t]*>[ \t]? // '>' at the start of a line + .+\n // rest of the first line + (.+\n)* // subsequent consecutive lines + \n* // blanks + )+ + ) + /gm, function(){...}); + */ + + text = text.replace(/((^[ \t]{0,3}>[ \t]?.+\n(.+\n)*\n*)+)/gm, function (wholeMatch, m1) { + var bq = m1; + + // attacklab: hack around Konqueror 3.5.4 bug: + // "----------bug".replace(/^-/g,"") == "bug" + bq = bq.replace(/^[ \t]*>[ \t]?/gm, '~0'); // trim one level of quoting + + // attacklab: clean up hack + bq = bq.replace(/~0/g, ''); + + bq = bq.replace(/^[ \t]+$/gm, ''); // trim whitespace-only lines + bq = showdown.subParser('githubCodeBlocks')(bq, options, globals); + bq = showdown.subParser('blockGamut')(bq, options, globals); // recurse + + bq = bq.replace(/(^|\n)/g, '$1 '); + // These leading spaces screw with
content, so we need to fix that:
+ bq = bq.replace(/(\s*[^\r]+?<\/pre>)/gm, function (wholeMatch, m1) {
+ var pre = m1;
+ // attacklab: hack around Konqueror 3.5.4 bug:
+ pre = pre.replace(/^ /mg, '~0');
+ pre = pre.replace(/~0/g, '');
+ return pre;
+ });
+
+ return showdown.subParser('hashBlock')('\n' + bq + '\n
', options, globals);
+ });
+
+ text = globals.converter._dispatch('blockQuotes.after', text, options, globals);
+ return text;
+});
+
+/**
+ * Process Markdown `` blocks.
+ */
+showdown.subParser('codeBlocks', function (text, options, globals) {
+ 'use strict';
+
+ text = globals.converter._dispatch('codeBlocks.before', text, options, globals);
+ /*
+ text = text.replace(text,
+ /(?:\n\n|^)
+ ( // $1 = the code block -- one or more lines, starting with a space/tab
+ (?:
+ (?:[ ]{4}|\t) // Lines must start with a tab or a tab-width of spaces - attacklab: g_tab_width
+ .*\n+
+ )+
+ )
+ (\n*[ ]{0,3}[^ \t\n]|(?=~0)) // attacklab: g_tab_width
+ /g,function(){...});
+ */
+
+ // attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug
+ text += '~0';
+
+ var pattern = /(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/g;
+ text = text.replace(pattern, function (wholeMatch, m1, m2) {
+ var codeblock = m1,
+ nextChar = m2,
+ end = '\n';
+
+ codeblock = showdown.subParser('outdent')(codeblock);
+ codeblock = showdown.subParser('encodeCode')(codeblock);
+ codeblock = showdown.subParser('detab')(codeblock);
+ codeblock = codeblock.replace(/^\n+/g, ''); // trim leading newlines
+ codeblock = codeblock.replace(/\n+$/g, ''); // trim trailing newlines
+
+ if (options.omitExtraWLInCodeBlocks) {
+ end = '';
+ }
+
+ codeblock = '' + codeblock + end + '
';
+
+ return showdown.subParser('hashBlock')(codeblock, options, globals) + nextChar;
+ });
+
+ // attacklab: strip sentinel
+ text = text.replace(/~0/, '');
+
+ text = globals.converter._dispatch('codeBlocks.after', text, options, globals);
+ return text;
+});
+
+/**
+ *
+ * * Backtick quotes are used for spans.
+ *
+ * * You can use multiple backticks as the delimiters if you want to
+ * include literal backticks in the code span. So, this input:
+ *
+ * Just type ``foo `bar` baz`` at the prompt.
+ *
+ * Will translate to:
+ *
+ * Just type foo `bar` baz at the prompt.
+ *
+ * There's no arbitrary limit to the number of backticks you
+ * can use as delimters. If you need three consecutive backticks
+ * in your code, use four for delimiters, etc.
+ *
+ * * You can use spaces to get literal backticks at the edges:
+ *
+ * ... type `` `bar` `` ...
+ *
+ * Turns to:
+ *
+ * ... type `bar` ...
+ */
+showdown.subParser('codeSpans', function (text, options, globals) {
+ 'use strict';
+
+ text = globals.converter._dispatch('codeSpans.before', text, options, globals);
+
+ /*
+ text = text.replace(/
+ (^|[^\\]) // Character before opening ` can't be a backslash
+ (`+) // $2 = Opening run of `
+ ( // $3 = The code block
+ [^\r]*?
+ [^`] // attacklab: work around lack of lookbehind
+ )
+ \2 // Matching closer
+ (?!`)
+ /gm, function(){...});
+ */
+
+ if (typeof(text) === 'undefined') {
+ text = '';
+ }
+ text = text.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm,
+ function (wholeMatch, m1, m2, m3) {
+ var c = m3;
+ c = c.replace(/^([ \t]*)/g, ''); // leading whitespace
+ c = c.replace(/[ \t]*$/g, ''); // trailing whitespace
+ c = showdown.subParser('encodeCode')(c);
+ return m1 + '' + c + '';
+ }
+ );
+
+ text = globals.converter._dispatch('codeSpans.after', text, options, globals);
+ return text;
+});
+
+/**
+ * Convert all tabs to spaces
+ */
+showdown.subParser('detab', function (text) {
+ 'use strict';
+
+ // expand first n-1 tabs
+ text = text.replace(/\t(?=\t)/g, ' '); // g_tab_width
+
+ // replace the nth with two sentinels
+ text = text.replace(/\t/g, '~A~B');
+
+ // use the sentinel to anchor our regex so it doesn't explode
+ text = text.replace(/~B(.+?)~A/g, function (wholeMatch, m1) {
+ var leadingText = m1,
+ numSpaces = 4 - leadingText.length % 4; // g_tab_width
+
+ // there *must* be a better way to do this:
+ for (var i = 0; i < numSpaces; i++) {
+ leadingText += ' ';
+ }
+
+ return leadingText;
+ });
+
+ // clean up sentinels
+ text = text.replace(/~A/g, ' '); // g_tab_width
+ text = text.replace(/~B/g, '');
+
+ return text;
+
+});
+
+/**
+ * Smart processing for ampersands and angle brackets that need to be encoded.
+ */
+showdown.subParser('encodeAmpsAndAngles', function (text) {
+ 'use strict';
+ // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin:
+ // http://bumppo.net/projects/amputator/
+ text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g, '&');
+
+ // Encode naked <'s
+ text = text.replace(/<(?![a-z\/?\$!])/gi, '<');
+
+ return text;
+});
+
+/**
+ * Returns the string, with after processing the following backslash escape sequences.
+ *
+ * attacklab: The polite way to do this is with the new escapeCharacters() function:
+ *
+ * text = escapeCharacters(text,"\\",true);
+ * text = escapeCharacters(text,"`*_{}[]()>#+-.!",true);
+ *
+ * ...but we're sidestepping its use of the (slow) RegExp constructor
+ * as an optimization for Firefox. This function gets called a LOT.
+ */
+showdown.subParser('encodeBackslashEscapes', function (text) {
+ 'use strict';
+ text = text.replace(/\\(\\)/g, showdown.helper.escapeCharactersCallback);
+ text = text.replace(/\\([`*_{}\[\]()>#+-.!])/g, showdown.helper.escapeCharactersCallback);
+ return text;
+});
+
+/**
+ * Encode/escape certain characters inside Markdown code runs.
+ * The point is that in code, these characters are literals,
+ * and lose their special Markdown meanings.
+ */
+showdown.subParser('encodeCode', function (text) {
+ 'use strict';
+
+ // Encode all ampersands; HTML entities are not
+ // entities within a Markdown code span.
+ text = text.replace(/&/g, '&');
+
+ // Do the angle bracket song and dance:
+ text = text.replace(//g, '>');
+
+ // Now, escape characters that are magic in Markdown:
+ text = showdown.helper.escapeCharacters(text, '*_{}[]\\', false);
+
+ // jj the line above breaks this:
+ //---
+ //* Item
+ // 1. Subitem
+ // special char: *
+ // ---
+
+ return text;
+});
+
+/**
+ * Input: an email address, e.g. "foo@example.com"
+ *
+ * Output: the email address as a mailto link, with each character
+ * of the address encoded as either a decimal or hex entity, in
+ * the hopes of foiling most address harvesting spam bots. E.g.:
+ *
+ * foo
+ * @example.com
+ *
+ * Based on a filter by Matthew Wickline, posted to the BBEdit-Talk
+ * mailing list:
+ *
+ */
+showdown.subParser('encodeEmailAddress', function (addr) {
+ 'use strict';
+
+ var encode = [
+ function (ch) {
+ return '' + ch.charCodeAt(0) + ';';
+ },
+ function (ch) {
+ return '' + ch.charCodeAt(0).toString(16) + ';';
+ },
+ function (ch) {
+ return ch;
+ }
+ ];
+
+ addr = 'mailto:' + addr;
+
+ addr = addr.replace(/./g, function (ch) {
+ if (ch === '@') {
+ // this *must* be encoded. I insist.
+ ch = encode[Math.floor(Math.random() * 2)](ch);
+ } else if (ch !== ':') {
+ // leave ':' alone (to spot mailto: later)
+ var r = Math.random();
+ // roughly 10% raw, 45% hex, 45% dec
+ ch = (
+ r > 0.9 ? encode[2](ch) : r > 0.45 ? encode[1](ch) : encode[0](ch)
+ );
+ }
+ return ch;
+ });
+
+ addr = '' + addr + '';
+ addr = addr.replace(/">.+:/g, '">'); // strip the mailto: from the visible part
+
+ return addr;
+});
+
+/**
+ * Within tags -- meaning between < and > -- encode [\ ` * _] so they
+ * don't conflict with their use in Markdown for code, italics and strong.
+ */
+showdown.subParser('escapeSpecialCharsWithinTagAttributes', function (text) {
+ 'use strict';
+
+ // Build a regex to find HTML tags and comments. See Friedl's
+ // "Mastering Regular Expressions", 2nd Ed., pp. 200-201.
+ var regex = /(<[a-z\/!$]("[^"]*"|'[^']*'|[^'">])*>|)/gi;
+
+ text = text.replace(regex, function (wholeMatch) {
+ var tag = wholeMatch.replace(/(.)<\/?code>(?=.)/g, '$1`');
+ tag = showdown.helper.escapeCharacters(tag, '\\`*_', false);
+ return tag;
+ });
+
+ return text;
+});
+
+/**
+ * Handle github codeblocks prior to running HashHTML so that
+ * HTML contained within the codeblock gets escaped properly
+ * Example:
+ * ```ruby
+ * def hello_world(x)
+ * puts "Hello, #{x}"
+ * end
+ * ```
+ */
+showdown.subParser('githubCodeBlocks', function (text, options, globals) {
+ 'use strict';
+
+ // early exit if option is not enabled
+ if (!options.ghCodeBlocks) {
+ return text;
+ }
+
+ text = globals.converter._dispatch('githubCodeBlocks.before', text, options, globals);
+
+ text += '~0';
+
+ text = text.replace(/(?:^|\n)```(.*)\n([\s\S]*?)\n```/g, function (wholeMatch, language, codeblock) {
+ var end = (options.omitExtraWLInCodeBlocks) ? '' : '\n';
+
+ // First parse the github code block
+ codeblock = showdown.subParser('encodeCode')(codeblock);
+ codeblock = showdown.subParser('detab')(codeblock);
+ codeblock = codeblock.replace(/^\n+/g, ''); // trim leading newlines
+ codeblock = codeblock.replace(/\n+$/g, ''); // trim trailing whitespace
+
+ codeblock = '' + codeblock + end + '
';
+
+ codeblock = showdown.subParser('hashBlock')(codeblock, options, globals);
+
+ // Since GHCodeblocks can be false positives, we need to
+ // store the primitive text and the parsed text in a global var,
+ // and then return a token
+ return '\n\n~G' + (globals.ghCodeBlocks.push({text: wholeMatch, codeblock: codeblock}) - 1) + 'G\n\n';
+ });
+
+ // attacklab: strip sentinel
+ text = text.replace(/~0/, '');
+
+ return globals.converter._dispatch('githubCodeBlocks.after', text, options, globals);
+});
+
+showdown.subParser('hashBlock', function (text, options, globals) {
+ 'use strict';
+ text = text.replace(/(^\n+|\n+$)/g, '');
+ return '\n\n~K' + (globals.gHtmlBlocks.push(text) - 1) + 'K\n\n';
+});
+
+showdown.subParser('hashElement', function (text, options, globals) {
+ 'use strict';
+
+ return function (wholeMatch, m1) {
+ var blockText = m1;
+
+ // Undo double lines
+ blockText = blockText.replace(/\n\n/g, '\n');
+ blockText = blockText.replace(/^\n/, '');
+
+ // strip trailing blank lines
+ blockText = blockText.replace(/\n+$/g, '');
+
+ // Replace the element text with a marker ("~KxK" where x is its key)
+ blockText = '\n\n~K' + (globals.gHtmlBlocks.push(blockText) - 1) + 'K\n\n';
+
+ return blockText;
+ };
+});
+
+showdown.subParser('hashHTMLBlocks', function (text, options, globals) {
+ 'use strict';
+
+ var blockTags = [
+ 'pre',
+ 'div',
+ 'h1',
+ 'h2',
+ 'h3',
+ 'h4',
+ 'h5',
+ 'h6',
+ 'blockquote',
+ 'table',
+ 'dl',
+ 'ol',
+ 'ul',
+ 'script',
+ 'noscript',
+ 'form',
+ 'fieldset',
+ 'iframe',
+ 'math',
+ 'style',
+ 'section',
+ 'header',
+ 'footer',
+ 'nav',
+ 'article',
+ 'aside',
+ 'address',
+ 'audio',
+ 'canvas',
+ 'figure',
+ 'hgroup',
+ 'output',
+ 'video',
+ 'p'
+ ],
+ repFunc = function (wholeMatch, match, left, right) {
+ var txt = wholeMatch;
+ // check if this html element is marked as markdown
+ // if so, it's contents should be parsed as markdown
+ if (left.search(/\bmarkdown\b/) !== -1) {
+ txt = left + globals.converter.makeHtml(match) + right;
+ }
+ return '\n\n~K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\n\n';
+ };
+
+ for (var i = 0; i < blockTags.length; ++i) {
+ text = showdown.helper.replaceRecursiveRegExp(text, repFunc, '^(?: |\\t){0,3}<' + blockTags[i] + '\\b[^>]*>', '' + blockTags[i] + '>', 'gim');
+ }
+
+ // HR SPECIAL CASE
+ text = text.replace(/(\n[ ]{0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g,
+ showdown.subParser('hashElement')(text, options, globals));
+
+ // Special case for standalone HTML comments:
+ text = text.replace(/()/g,
+ showdown.subParser('hashElement')(text, options, globals));
+
+ // PHP and ASP-style processor instructions (...?> and <%...%>)
+ text = text.replace(/(?:\n\n)([ ]{0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g,
+ showdown.subParser('hashElement')(text, options, globals));
+ return text;
+});
+
+/**
+ * Hash span elements that should not be parsed as markdown
+ */
+showdown.subParser('hashHTMLSpans', function (text, config, globals) {
+ 'use strict';
+
+ var matches = showdown.helper.matchRecursiveRegExp(text, ']*>', '', 'gi');
+
+ for (var i = 0; i < matches.length; ++i) {
+ text = text.replace(matches[i][0], '~L' + (globals.gHtmlSpans.push(matches[i][0]) - 1) + 'L');
+ }
+ return text;
+});
+
+/**
+ * Unhash HTML spans
+ */
+showdown.subParser('unhashHTMLSpans', function (text, config, globals) {
+ 'use strict';
+
+ for (var i = 0; i < globals.gHtmlSpans.length; ++i) {
+ text = text.replace('~L' + i + 'L', globals.gHtmlSpans[i]);
+ }
+
+ return text;
+});
+
+/**
+ * Hash span elements that should not be parsed as markdown
+ */
+showdown.subParser('hashPreCodeTags', function (text, config, globals) {
+ 'use strict';
+
+ var repFunc = function (wholeMatch, match, left, right) {
+ // encode html entities
+ var codeblock = left + showdown.subParser('encodeCode')(match) + right;
+ return '\n\n~G' + (globals.ghCodeBlocks.push({text: wholeMatch, codeblock: codeblock}) - 1) + 'G\n\n';
+ };
+
+ text = showdown.helper.replaceRecursiveRegExp(text, repFunc, '^(?: |\\t){0,3}]*>\\s*]*>', '^(?: |\\t){0,3}\\s*
', 'gim');
+ return text;
+});
+
+showdown.subParser('headers', function (text, options, globals) {
+ 'use strict';
+
+ text = globals.converter._dispatch('headers.before', text, options, globals);
+
+ var prefixHeader = options.prefixHeaderId,
+ headerLevelStart = (isNaN(parseInt(options.headerLevelStart))) ? 1 : parseInt(options.headerLevelStart),
+
+ // Set text-style headers:
+ // Header 1
+ // ========
+ //
+ // Header 2
+ // --------
+ //
+ setextRegexH1 = (options.smoothLivePreview) ? /^(.+)[ \t]*\n={2,}[ \t]*\n+/gm : /^(.+)[ \t]*\n=+[ \t]*\n+/gm,
+ setextRegexH2 = (options.smoothLivePreview) ? /^(.+)[ \t]*\n-{2,}[ \t]*\n+/gm : /^(.+)[ \t]*\n-+[ \t]*\n+/gm;
+
+ text = text.replace(setextRegexH1, function (wholeMatch, m1) {
+
+ var spanGamut = showdown.subParser('spanGamut')(m1, options, globals),
+ hID = (options.noHeaderId) ? '' : ' id="' + headerId(m1) + '"',
+ hLevel = headerLevelStart,
+ hashBlock = '' + spanGamut + ' ';
+ return showdown.subParser('hashBlock')(hashBlock, options, globals);
+ });
+
+ text = text.replace(setextRegexH2, function (matchFound, m1) {
+ var spanGamut = showdown.subParser('spanGamut')(m1, options, globals),
+ hID = (options.noHeaderId) ? '' : ' id="' + headerId(m1) + '"',
+ hLevel = headerLevelStart + 1,
+ hashBlock = '' + spanGamut + ' ';
+ return showdown.subParser('hashBlock')(hashBlock, options, globals);
+ });
+
+ // atx-style headers:
+ // # Header 1
+ // ## Header 2
+ // ## Header 2 with closing hashes ##
+ // ...
+ // ###### Header 6
+ //
+ text = text.replace(/^(#{1,6})[ \t]*(.+?)[ \t]*#*\n+/gm, function (wholeMatch, m1, m2) {
+ var span = showdown.subParser('spanGamut')(m2, options, globals),
+ hID = (options.noHeaderId) ? '' : ' id="' + headerId(m2) + '"',
+ hLevel = headerLevelStart - 1 + m1.length,
+ header = '' + span + ' ';
+
+ return showdown.subParser('hashBlock')(header, options, globals);
+ });
+
+ function headerId(m) {
+ var title, escapedId = m.replace(/[^\w]/g, '').toLowerCase();
+
+ if (globals.hashLinkCounts[escapedId]) {
+ title = escapedId + '-' + (globals.hashLinkCounts[escapedId]++);
+ } else {
+ title = escapedId;
+ globals.hashLinkCounts[escapedId] = 1;
+ }
+
+ // Prefix id to prevent causing inadvertent pre-existing style matches.
+ if (prefixHeader === true) {
+ prefixHeader = 'section';
+ }
+
+ if (showdown.helper.isString(prefixHeader)) {
+ return prefixHeader + title;
+ }
+ return title;
+ }
+
+ text = globals.converter._dispatch('headers.after', text, options, globals);
+ return text;
+});
+
+/**
+ * Turn Markdown image shortcuts into
tags.
+ */
+showdown.subParser('images', function (text, options, globals) {
+ 'use strict';
+
+ text = globals.converter._dispatch('images.before', text, options, globals);
+
+ var inlineRegExp = /!\[(.*?)]\s?\([ \t]*()(\S+?)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(['"])(.*?)\6[ \t]*)?\)/g,
+ referenceRegExp = /!\[([^\]]*?)] ?(?:\n *)?\[(.*?)]()()()()()/g;
+
+ function writeImageTag (wholeMatch, altText, linkId, url, width, height, m5, title) {
+
+ var gUrls = globals.gUrls,
+ gTitles = globals.gTitles,
+ gDims = globals.gDimensions;
+
+ linkId = linkId.toLowerCase();
+
+ if (!title) {
+ title = '';
+ }
+
+ if (url === '' || url === null) {
+ if (linkId === '' || linkId === null) {
+ // lower-case and turn embedded newlines into spaces
+ linkId = altText.toLowerCase().replace(/ ?\n/g, ' ');
+ }
+ url = '#' + linkId;
+
+ if (!showdown.helper.isUndefined(gUrls[linkId])) {
+ url = gUrls[linkId];
+ if (!showdown.helper.isUndefined(gTitles[linkId])) {
+ title = gTitles[linkId];
+ }
+ if (!showdown.helper.isUndefined(gDims[linkId])) {
+ width = gDims[linkId].width;
+ height = gDims[linkId].height;
+ }
+ } else {
+ return wholeMatch;
+ }
+ }
+
+ altText = altText.replace(/"/g, '"');
+ altText = showdown.helper.escapeCharacters(altText, '*_', false);
+ url = showdown.helper.escapeCharacters(url, '*_', false);
+ var result = '
';
+ return result;
+ }
+
+ // First, handle reference-style labeled images: ![alt text][id]
+ text = text.replace(referenceRegExp, writeImageTag);
+
+ // Next, handle inline images: 
+ text = text.replace(inlineRegExp, writeImageTag);
+
+ text = globals.converter._dispatch('images.after', text, options, globals);
+ return text;
+});
+
+showdown.subParser('italicsAndBold', function (text, options, globals) {
+ 'use strict';
+
+ text = globals.converter._dispatch('italicsAndBold.before', text, options, globals);
+
+ if (options.literalMidWordUnderscores) {
+ //underscores
+ // Since we are consuming a \s character, we need to add it
+ text = text.replace(/(^|\s|>|\b)__(?=\S)([\s\S]+?)__(?=\b|<|\s|$)/gm, '$1$2');
+ text = text.replace(/(^|\s|>|\b)_(?=\S)([\s\S]+?)_(?=\b|<|\s|$)/gm, '$1$2');
+ //asterisks
+ text = text.replace(/(\*\*)(?=\S)([^\r]*?\S[*]*)\1/g, '$2');
+ text = text.replace(/(\*)(?=\S)([^\r]*?\S)\1/g, '$2');
+
+ } else {
+ // must go first:
+ text = text.replace(/(\*\*|__)(?=\S)([^\r]*?\S[*_]*)\1/g, '$2');
+ text = text.replace(/(\*|_)(?=\S)([^\r]*?\S)\1/g, '$2');
+ }
+
+ text = globals.converter._dispatch('italicsAndBold.after', text, options, globals);
+ return text;
+});
+
+/**
+ * Form HTML ordered (numbered) and unordered (bulleted) lists.
+ */
+showdown.subParser('lists', function (text, options, globals) {
+ 'use strict';
+
+ text = globals.converter._dispatch('lists.before', text, options, globals);
+ /**
+ * Process the contents of a single ordered or unordered list, splitting it
+ * into individual list items.
+ * @param {string} listStr
+ * @param {boolean} trimTrailing
+ * @returns {string}
+ */
+ function processListItems (listStr, trimTrailing) {
+ // The $g_list_level global keeps track of when we're inside a list.
+ // Each time we enter a list, we increment it; when we leave a list,
+ // we decrement. If it's zero, we're not in a list anymore.
+ //
+ // We do this because when we're not inside a list, we want to treat
+ // something like this:
+ //
+ // I recommend upgrading to version
+ // 8. Oops, now this line is treated
+ // as a sub-list.
+ //
+ // As a single paragraph, despite the fact that the second line starts
+ // with a digit-period-space sequence.
+ //
+ // Whereas when we're inside a list (or sub-list), that line will be
+ // treated as the start of a sub-list. What a kludge, huh? This is
+ // an aspect of Markdown's syntax that's hard to parse perfectly
+ // without resorting to mind-reading. Perhaps the solution is to
+ // change the syntax rules such that sub-lists must start with a
+ // starting cardinal number; e.g. "1." or "a.".
+ globals.gListLevel++;
+
+ // trim trailing blank lines:
+ listStr = listStr.replace(/\n{2,}$/, '\n');
+
+ // attacklab: add sentinel to emulate \z
+ listStr += '~0';
+
+ var rgx = /(\n)?(^[ \t]*)([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(~0|\2([*+-]|\d+[.])[ \t]+))/gm,
+ isParagraphed = (/\n[ \t]*\n(?!~0)/.test(listStr));
+
+ listStr = listStr.replace(rgx, function (wholeMatch, m1, m2, m3, m4, taskbtn, checked) {
+ checked = (checked && checked.trim() !== '');
+ var item = showdown.subParser('outdent')(m4, options, globals),
+ bulletStyle = '';
+
+ // Support for github tasklists
+ if (taskbtn && options.tasklists) {
+ bulletStyle = ' class="task-list-item" style="list-style-type: none;"';
+ item = item.replace(/^[ \t]*\[(x|X| )?]/m, function () {
+ var otp = '';
+ return otp;
+ });
+ }
+ // m1 - Leading line or
+ // Has a double return (multi paragraph) or
+ // Has sublist
+ if (m1 || (item.search(/\n{2,}/) > -1)) {
+ item = showdown.subParser('githubCodeBlocks')(item, options, globals);
+ item = showdown.subParser('blockGamut')(item, options, globals);
+ } else {
+ // Recursion for sub-lists:
+ item = showdown.subParser('lists')(item, options, globals);
+ item = item.replace(/\n$/, ''); // chomp(item)
+ if (isParagraphed) {
+ item = showdown.subParser('paragraphs')(item, options, globals);
+ } else {
+ item = showdown.subParser('spanGamut')(item, options, globals);
+ }
+ }
+ item = '\n' + item + ' \n';
+ return item;
+ });
+
+ // attacklab: strip sentinel
+ listStr = listStr.replace(/~0/g, '');
+
+ globals.gListLevel--;
+
+ if (trimTrailing) {
+ listStr = listStr.replace(/\s+$/, '');
+ }
+
+ return listStr;
+ }
+
+ /**
+ * Check and parse consecutive lists (better fix for issue #142)
+ * @param {string} list
+ * @param {string} listType
+ * @param {boolean} trimTrailing
+ * @returns {string}
+ */
+ function parseConsecutiveLists(list, listType, trimTrailing) {
+ // check if we caught 2 or more consecutive lists by mistake
+ // we use the counterRgx, meaning if listType is UL we look for UL and vice versa
+ var counterRxg = (listType === 'ul') ? /^ {0,2}\d+\.[ \t]/gm : /^ {0,2}[*+-][ \t]/gm,
+ subLists = [],
+ result = '';
+
+ if (list.search(counterRxg) !== -1) {
+ (function parseCL(txt) {
+ var pos = txt.search(counterRxg);
+ if (pos !== -1) {
+ // slice
+ result += '\n\n<' + listType + '>' + processListItems(txt.slice(0, pos), !!trimTrailing) + '' + listType + '>\n\n';
+
+ // invert counterType and listType
+ listType = (listType === 'ul') ? 'ol' : 'ul';
+ counterRxg = (listType === 'ul') ? /^ {0,2}\d+\.[ \t]/gm : /^ {0,2}[*+-][ \t]/gm;
+
+ //recurse
+ parseCL(txt.slice(pos));
+ } else {
+ result += '\n\n<' + listType + '>' + processListItems(txt, !!trimTrailing) + '' + listType + '>\n\n';
+ }
+ })(list);
+ for (var i = 0; i < subLists.length; ++i) {
+
+ }
+ } else {
+ result = '\n\n<' + listType + '>' + processListItems(list, !!trimTrailing) + '' + listType + '>\n\n';
+ }
+
+ return result;
+ }
+
+ // attacklab: add sentinel to hack around khtml/safari bug:
+ // http://bugs.webkit.org/show_bug.cgi?id=11231
+ text += '~0';
+
+ // Re-usable pattern to match any entire ul or ol list:
+ var wholeList = /^(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm;
+
+ if (globals.gListLevel) {
+ text = text.replace(wholeList, function (wholeMatch, list, m2) {
+ var listType = (m2.search(/[*+-]/g) > -1) ? 'ul' : 'ol';
+ return parseConsecutiveLists(list, listType, true);
+ });
+ } else {
+ wholeList = /(\n\n|^\n?)(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm;
+ //wholeList = /(\n\n|^\n?)( {0,3}([*+-]|\d+\.)[ \t]+[\s\S]+?)(?=(~0)|(\n\n(?!\t| {2,}| {0,3}([*+-]|\d+\.)[ \t])))/g;
+ text = text.replace(wholeList, function (wholeMatch, m1, list, m3) {
+
+ var listType = (m3.search(/[*+-]/g) > -1) ? 'ul' : 'ol';
+ return parseConsecutiveLists(list, listType);
+ });
+ }
+
+ // attacklab: strip sentinel
+ text = text.replace(/~0/, '');
+
+ text = globals.converter._dispatch('lists.after', text, options, globals);
+ return text;
+});
+
+/**
+ * Remove one level of line-leading tabs or spaces
+ */
+showdown.subParser('outdent', function (text) {
+ 'use strict';
+
+ // attacklab: hack around Konqueror 3.5.4 bug:
+ // "----------bug".replace(/^-/g,"") == "bug"
+ text = text.replace(/^(\t|[ ]{1,4})/gm, '~0'); // attacklab: g_tab_width
+
+ // attacklab: clean up hack
+ text = text.replace(/~0/g, '');
+
+ return text;
+});
+
+/**
+ *
+ */
+showdown.subParser('paragraphs', function (text, options, globals) {
+ 'use strict';
+
+ text = globals.converter._dispatch('paragraphs.before', text, options, globals);
+ // Strip leading and trailing lines:
+ text = text.replace(/^\n+/g, '');
+ text = text.replace(/\n+$/g, '');
+
+ var grafs = text.split(/\n{2,}/g),
+ grafsOut = [],
+ end = grafs.length; // Wrap tags
+
+ for (var i = 0; i < end; i++) {
+ var str = grafs[i];
+ // if this is an HTML marker, copy it
+ if (str.search(/~(K|G)(\d+)\1/g) >= 0) {
+ grafsOut.push(str);
+ } else {
+ str = showdown.subParser('spanGamut')(str, options, globals);
+ str = str.replace(/^([ \t]*)/g, '
');
+ str += '
';
+ grafsOut.push(str);
+ }
+ }
+
+ /** Unhashify HTML blocks */
+ end = grafsOut.length;
+ for (i = 0; i < end; i++) {
+ var blockText = '',
+ grafsOutIt = grafsOut[i],
+ codeFlag = false;
+ // if this is a marker for an html block...
+ while (grafsOutIt.search(/~(K|G)(\d+)\1/) >= 0) {
+ var delim = RegExp.$1,
+ num = RegExp.$2;
+
+ if (delim === 'K') {
+ blockText = globals.gHtmlBlocks[num];
+ } else {
+ // we need to check if ghBlock is a false positive
+ if (codeFlag) {
+ // use encoded version of all text
+ blockText = showdown.subParser('encodeCode')(globals.ghCodeBlocks[num].text);
+ } else {
+ blockText = globals.ghCodeBlocks[num].codeblock;
+ }
+ }
+ blockText = blockText.replace(/\$/g, '$$$$'); // Escape any dollar signs
+
+ grafsOutIt = grafsOutIt.replace(/(\n\n)?~(K|G)\d+\2(\n\n)?/, blockText);
+ // Check if grafsOutIt is a pre->code
+ if (/^]*>\s*]*>/.test(grafsOutIt)) {
+ codeFlag = true;
+ }
+ }
+ grafsOut[i] = grafsOutIt;
+ }
+ text = grafsOut.join('\n\n');
+ // Strip leading and trailing lines:
+ text = text.replace(/^\n+/g, '');
+ text = text.replace(/\n+$/g, '');
+ return globals.converter._dispatch('paragraphs.after', text, options, globals);
+});
+
+/**
+ * Run extension
+ */
+showdown.subParser('runExtension', function (ext, text, options, globals) {
+ 'use strict';
+
+ if (ext.filter) {
+ text = ext.filter(text, globals.converter, options);
+
+ } else if (ext.regex) {
+ // TODO remove this when old extension loading mechanism is deprecated
+ var re = ext.regex;
+ if (!re instanceof RegExp) {
+ re = new RegExp(re, 'g');
+ }
+ text = text.replace(re, ext.replace);
+ }
+
+ return text;
+});
+
+/**
+ * These are all the transformations that occur *within* block-level
+ * tags like paragraphs, headers, and list items.
+ */
+showdown.subParser('spanGamut', function (text, options, globals) {
+ 'use strict';
+
+ text = globals.converter._dispatch('spanGamut.before', text, options, globals);
+ text = showdown.subParser('codeSpans')(text, options, globals);
+ text = showdown.subParser('escapeSpecialCharsWithinTagAttributes')(text, options, globals);
+ text = showdown.subParser('encodeBackslashEscapes')(text, options, globals);
+
+ // Process anchor and image tags. Images must come first,
+ // because ![foo][f] looks like an anchor.
+ text = showdown.subParser('images')(text, options, globals);
+ text = showdown.subParser('anchors')(text, options, globals);
+
+ // Make links out of things like ` `
+ // Must come after _DoAnchors(), because you can use < and >
+ // delimiters in inline links like [this]().
+ text = showdown.subParser('autoLinks')(text, options, globals);
+ text = showdown.subParser('encodeAmpsAndAngles')(text, options, globals);
+ text = showdown.subParser('italicsAndBold')(text, options, globals);
+ text = showdown.subParser('strikethrough')(text, options, globals);
+
+ // Do hard breaks:
+ text = text.replace(/ +\n/g, '
\n');
+
+ text = globals.converter._dispatch('spanGamut.after', text, options, globals);
+ return text;
+});
+
+showdown.subParser('strikethrough', function (text, options, globals) {
+ 'use strict';
+
+ if (options.strikethrough) {
+ text = globals.converter._dispatch('strikethrough.before', text, options, globals);
+ text = text.replace(/(?:~T){2}([\s\S]+?)(?:~T){2}/g, '$1');
+ text = globals.converter._dispatch('strikethrough.after', text, options, globals);
+ }
+
+ return text;
+});
+
+/**
+ * Strip any lines consisting only of spaces and tabs.
+ * This makes subsequent regexs easier to write, because we can
+ * match consecutive blank lines with /\n+/ instead of something
+ * contorted like /[ \t]*\n+/
+ */
+showdown.subParser('stripBlankLines', function (text) {
+ 'use strict';
+ return text.replace(/^[ \t]+$/mg, '');
+});
+
+/**
+ * Strips link definitions from text, stores the URLs and titles in
+ * hash references.
+ * Link defs are in the form: ^[id]: url "optional title"
+ *
+ * ^[ ]{0,3}\[(.+)\]: // id = $1 attacklab: g_tab_width - 1
+ * [ \t]*
+ * \n? // maybe *one* newline
+ * [ \t]*
+ * (\S+?)>? // url = $2
+ * [ \t]*
+ * \n? // maybe one newline
+ * [ \t]*
+ * (?:
+ * (\n*) // any lines skipped = $3 attacklab: lookbehind removed
+ * ["(]
+ * (.+?) // title = $4
+ * [")]
+ * [ \t]*
+ * )? // title is optional
+ * (?:\n+|$)
+ * /gm,
+ * function(){...});
+ *
+ */
+showdown.subParser('stripLinkDefinitions', function (text, options, globals) {
+ 'use strict';
+
+ var regex = /^ {0,3}\[(.+)]:[ \t]*\n?[ \t]*(\S+?)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n+|(?=~0))/gm;
+
+ // attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug
+ text += '~0';
+
+ text = text.replace(regex, function (wholeMatch, linkId, url, width, height, blankLines, title) {
+ linkId = linkId.toLowerCase();
+ globals.gUrls[linkId] = showdown.subParser('encodeAmpsAndAngles')(url); // Link IDs are case-insensitive
+
+ if (blankLines) {
+ // Oops, found blank lines, so it's not a title.
+ // Put back the parenthetical statement we stole.
+ return blankLines + title;
+
+ } else {
+ if (title) {
+ globals.gTitles[linkId] = title.replace(/"|'/g, '"');
+ }
+ if (options.parseImgDimensions && width && height) {
+ globals.gDimensions[linkId] = {
+ width: width,
+ height: height
+ };
+ }
+ }
+ // Completely remove the definition from the text
+ return '';
+ });
+
+ // attacklab: strip sentinel
+ text = text.replace(/~0/, '');
+
+ return text;
+});
+
+showdown.subParser('tables', function (text, options, globals) {
+ 'use strict';
+
+ if (!options.tables) {
+ return text;
+ }
+
+ var tableRgx = /^[ \t]{0,3}\|?.+\|.+\n[ \t]{0,3}\|?[ \t]*:?[ \t]*(?:-|=){2,}[ \t]*:?[ \t]*\|[ \t]*:?[ \t]*(?:-|=){2,}[\s\S]+?(?:\n\n|~0)/gm;
+
+ function parseStyles(sLine) {
+ if (/^:[ \t]*--*$/.test(sLine)) {
+ return ' style="text-align:left;"';
+ } else if (/^--*[ \t]*:[ \t]*$/.test(sLine)) {
+ return ' style="text-align:right;"';
+ } else if (/^:[ \t]*--*[ \t]*:$/.test(sLine)) {
+ return ' style="text-align:center;"';
+ } else {
+ return '';
+ }
+ }
+
+ function parseHeaders(header, style) {
+ var id = '';
+ header = header.trim();
+ if (options.tableHeaderId) {
+ id = ' id="' + header.replace(/ /g, '_').toLowerCase() + '"';
+ }
+ header = showdown.subParser('spanGamut')(header, options, globals);
+
+ return '' + header + ' \n';
+ }
+
+ function parseCells(cell, style) {
+ var subText = showdown.subParser('spanGamut')(cell, options, globals);
+ return '' + subText + ' \n';
+ }
+
+ function buildTable(headers, cells) {
+ var tb = '\n\n\n',
+ tblLgn = headers.length;
+
+ for (var i = 0; i < tblLgn; ++i) {
+ tb += headers[i];
+ }
+ tb += ' \n\n\n';
+
+ for (i = 0; i < cells.length; ++i) {
+ tb += '\n';
+ for (var ii = 0; ii < tblLgn; ++ii) {
+ tb += cells[i][ii];
+ }
+ tb += ' \n';
+ }
+ tb += '\n
\n';
+ return tb;
+ }
+
+ text = globals.converter._dispatch('tables.before', text, options, globals);
+
+ text = text.replace(tableRgx, function (rawTable) {
+
+ var i, tableLines = rawTable.split('\n');
+
+ // strip wrong first and last column if wrapped tables are used
+ for (i = 0; i < tableLines.length; ++i) {
+ if (/^[ \t]{0,3}\|/.test(tableLines[i])) {
+ tableLines[i] = tableLines[i].replace(/^[ \t]{0,3}\|/, '');
+ }
+ if (/\|[ \t]*$/.test(tableLines[i])) {
+ tableLines[i] = tableLines[i].replace(/\|[ \t]*$/, '');
+ }
+ }
+
+ var rawHeaders = tableLines[0].split('|').map(function (s) { return s.trim();}),
+ rawStyles = tableLines[1].split('|').map(function (s) { return s.trim();}),
+ rawCells = [],
+ headers = [],
+ styles = [],
+ cells = [];
+
+ tableLines.shift();
+ tableLines.shift();
+
+ for (i = 0; i < tableLines.length; ++i) {
+ if (tableLines[i].trim() === '') {
+ continue;
+ }
+ rawCells.push(
+ tableLines[i]
+ .split('|')
+ .map(function (s) {
+ return s.trim();
+ })
+ );
+ }
+
+ if (rawHeaders.length < rawStyles.length) {
+ return rawTable;
+ }
+
+ for (i = 0; i < rawStyles.length; ++i) {
+ styles.push(parseStyles(rawStyles[i]));
+ }
+
+ for (i = 0; i < rawHeaders.length; ++i) {
+ if (showdown.helper.isUndefined(styles[i])) {
+ styles[i] = '';
+ }
+ headers.push(parseHeaders(rawHeaders[i], styles[i]));
+ }
+
+ for (i = 0; i < rawCells.length; ++i) {
+ var row = [];
+ for (var ii = 0; ii < headers.length; ++ii) {
+ if (showdown.helper.isUndefined(rawCells[i][ii])) {
+
+ }
+ row.push(parseCells(rawCells[i][ii], styles[ii]));
+ }
+ cells.push(row);
+ }
+
+ return buildTable(headers, cells);
+ });
+
+ text = globals.converter._dispatch('tables.after', text, options, globals);
+
+ return text;
+});
+
+/**
+ * Swap back in all the special characters we've hidden.
+ */
+showdown.subParser('unescapeSpecialChars', function (text) {
+ 'use strict';
+
+ text = text.replace(/~E(\d+)E/g, function (wholeMatch, m1) {
+ var charCodeToReplace = parseInt(m1);
+ return String.fromCharCode(charCodeToReplace);
+ });
+ return text;
+});
+module.exports = showdown;
diff --git a/wx-mini-program/lib/wxParse/wxDiscode.js b/wx-mini-program/lib/wxParse/wxDiscode.js
new file mode 100644
index 0000000..e339f7a
--- /dev/null
+++ b/wx-mini-program/lib/wxParse/wxDiscode.js
@@ -0,0 +1,206 @@
+// HTML 支持的数学符号
+function strNumDiscode(str){
+ str = str.replace(/∀/g, '∀');
+ str = str.replace(/∂/g, '∂');
+ str = str.replace(/&exists;/g, '∃');
+ str = str.replace(/∅/g, '∅');
+ str = str.replace(/∇/g, '∇');
+ str = str.replace(/∈/g, '∈');
+ str = str.replace(/∉/g, '∉');
+ str = str.replace(/∋/g, '∋');
+ str = str.replace(/∏/g, '∏');
+ str = str.replace(/∑/g, '∑');
+ str = str.replace(/−/g, '−');
+ str = str.replace(/∗/g, '∗');
+ str = str.replace(/√/g, '√');
+ str = str.replace(/∝/g, '∝');
+ str = str.replace(/∞/g, '∞');
+ str = str.replace(/∠/g, '∠');
+ str = str.replace(/∧/g, '∧');
+ str = str.replace(/∨/g, '∨');
+ str = str.replace(/∩/g, '∩');
+ str = str.replace(/∩/g, '∪');
+ str = str.replace(/∫/g, '∫');
+ str = str.replace(/∴/g, '∴');
+ str = str.replace(/∼/g, '∼');
+ str = str.replace(/≅/g, '≅');
+ str = str.replace(/≈/g, '≈');
+ str = str.replace(/≠/g, '≠');
+ str = str.replace(/≤/g, '≤');
+ str = str.replace(/≥/g, '≥');
+ str = str.replace(/⊂/g, '⊂');
+ str = str.replace(/⊃/g, '⊃');
+ str = str.replace(/⊄/g, '⊄');
+ str = str.replace(/⊆/g, '⊆');
+ str = str.replace(/⊇/g, '⊇');
+ str = str.replace(/⊕/g, '⊕');
+ str = str.replace(/⊗/g, '⊗');
+ str = str.replace(/⊥/g, '⊥');
+ str = str.replace(/⋅/g, '⋅');
+ return str;
+}
+
+//HTML 支持的希腊字母
+function strGreeceDiscode(str){
+ str = str.replace(/Α/g, 'Α');
+ str = str.replace(/Β/g, 'Β');
+ str = str.replace(/Γ/g, 'Γ');
+ str = str.replace(/Δ/g, 'Δ');
+ str = str.replace(/Ε/g, 'Ε');
+ str = str.replace(/Ζ/g, 'Ζ');
+ str = str.replace(/Η/g, 'Η');
+ str = str.replace(/Θ/g, 'Θ');
+ str = str.replace(/Ι/g, 'Ι');
+ str = str.replace(/Κ/g, 'Κ');
+ str = str.replace(/Λ/g, 'Λ');
+ str = str.replace(/Μ/g, 'Μ');
+ str = str.replace(/Ν/g, 'Ν');
+ str = str.replace(/Ξ/g, 'Ν');
+ str = str.replace(/Ο/g, 'Ο');
+ str = str.replace(/Π/g, 'Π');
+ str = str.replace(/Ρ/g, 'Ρ');
+ str = str.replace(/Σ/g, 'Σ');
+ str = str.replace(/Τ/g, 'Τ');
+ str = str.replace(/Υ/g, 'Υ');
+ str = str.replace(/Φ/g, 'Φ');
+ str = str.replace(/Χ/g, 'Χ');
+ str = str.replace(/Ψ/g, 'Ψ');
+ str = str.replace(/Ω/g, 'Ω');
+
+ str = str.replace(/α/g, 'α');
+ str = str.replace(/β/g, 'β');
+ str = str.replace(/γ/g, 'γ');
+ str = str.replace(/δ/g, 'δ');
+ str = str.replace(/ε/g, 'ε');
+ str = str.replace(/ζ/g, 'ζ');
+ str = str.replace(/η/g, 'η');
+ str = str.replace(/θ/g, 'θ');
+ str = str.replace(/ι/g, 'ι');
+ str = str.replace(/κ/g, 'κ');
+ str = str.replace(/λ/g, 'λ');
+ str = str.replace(/μ/g, 'μ');
+ str = str.replace(/ν/g, 'ν');
+ str = str.replace(/ξ/g, 'ξ');
+ str = str.replace(/ο/g, 'ο');
+ str = str.replace(/π/g, 'π');
+ str = str.replace(/ρ/g, 'ρ');
+ str = str.replace(/ς/g, 'ς');
+ str = str.replace(/σ/g, 'σ');
+ str = str.replace(/τ/g, 'τ');
+ str = str.replace(/υ/g, 'υ');
+ str = str.replace(/φ/g, 'φ');
+ str = str.replace(/χ/g, 'χ');
+ str = str.replace(/ψ/g, 'ψ');
+ str = str.replace(/ω/g, 'ω');
+ str = str.replace(/ϑ/g, 'ϑ');
+ str = str.replace(/ϒ/g, 'ϒ');
+ str = str.replace(/ϖ/g, 'ϖ');
+ str = str.replace(/·/g, '·');
+ return str;
+}
+
+//
+
+function strcharacterDiscode(str){
+ // 加入常用解析
+ str = str.replace(/ /g, ' ');
+ str = str.replace(/"/g, '"');
+ str = str.replace(/&/g, '&');
+ // str = str.replace(/</g, '‹');
+ // str = str.replace(/>/g, '›');
+
+ str = str.replace(/</g, '<');
+ str = str.replace(/>/g, '>');
+
+ return str;
+}
+
+// HTML 支持的其他实体
+function strOtherDiscode(str){
+ str = str.replace(/Œ/g, 'Œ');
+ str = str.replace(/œ/g, 'œ');
+ str = str.replace(/Š/g, 'Š');
+ str = str.replace(/š/g, 'š');
+ str = str.replace(/Ÿ/g, 'Ÿ');
+ str = str.replace(/ƒ/g, 'ƒ');
+ str = str.replace(/ˆ/g, 'ˆ');
+ str = str.replace(/˜/g, '˜');
+ str = str.replace(/ /g, '');
+ str = str.replace(/ /g, '');
+ str = str.replace(/ /g, '');
+ str = str.replace(//g, '');
+ str = str.replace(//g, '');
+ str = str.replace(//g, '');
+ str = str.replace(//g, '');
+ str = str.replace(/–/g, '–');
+ str = str.replace(/—/g, '—');
+ str = str.replace(/‘/g, '‘');
+ str = str.replace(/’/g, '’');
+ str = str.replace(/‚/g, '‚');
+ str = str.replace(/“/g, '“');
+ str = str.replace(/”/g, '”');
+ str = str.replace(/„/g, '„');
+ str = str.replace(/†/g, '†');
+ str = str.replace(/‡/g, '‡');
+ str = str.replace(/•/g, '•');
+ str = str.replace(/…/g, '…');
+ str = str.replace(/‰/g, '‰');
+ str = str.replace(/′/g, '′');
+ str = str.replace(/″/g, '″');
+ str = str.replace(/‹/g, '‹');
+ str = str.replace(/›/g, '›');
+ str = str.replace(/‾/g, '‾');
+ str = str.replace(/€/g, '€');
+ str = str.replace(/™/g, '™');
+
+ str = str.replace(/←/g, '←');
+ str = str.replace(/↑/g, '↑');
+ str = str.replace(/→/g, '→');
+ str = str.replace(/↓/g, '↓');
+ str = str.replace(/↔/g, '↔');
+ str = str.replace(/↵/g, '↵');
+ str = str.replace(/⌈/g, '⌈');
+ str = str.replace(/⌉/g, '⌉');
+
+ str = str.replace(/⌊/g, '⌊');
+ str = str.replace(/⌋/g, '⌋');
+ str = str.replace(/◊/g, '◊');
+ str = str.replace(/♠/g, '♠');
+ str = str.replace(/♣/g, '♣');
+ str = str.replace(/♥/g, '♥');
+
+ str = str.replace(/♦/g, '♦');
+
+ return str;
+}
+
+function strMoreDiscode(str){
+ str = str.replace(/\r\n/g,"");
+ str = str.replace(/\n/g,"");
+
+ str = str.replace(/code/g,"wxxxcode-style");
+ return str;
+}
+
+function strDiscode(str){
+ str = strNumDiscode(str);
+ str = strGreeceDiscode(str);
+ str = strcharacterDiscode(str);
+ str = strOtherDiscode(str);
+ str = strMoreDiscode(str);
+ return str;
+}
+function urlToHttpUrl(url,rep){
+
+ var patt1 = new RegExp("^//");
+ var result = patt1.test(url);
+ if(result){
+ url = rep+":"+url;
+ }
+ return url;
+}
+
+module.exports = {
+ strDiscode:strDiscode,
+ urlToHttpUrl:urlToHttpUrl
+}
\ No newline at end of file
diff --git a/wx-mini-program/lib/wxParse/wxParse.js b/wx-mini-program/lib/wxParse/wxParse.js
new file mode 100644
index 0000000..8adab50
--- /dev/null
+++ b/wx-mini-program/lib/wxParse/wxParse.js
@@ -0,0 +1,146 @@
+/**
+ * author: Di (微信小程序开发工程师)
+ * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
+ * 垂直微信小程序开发交流社区
+ *
+ * github地址: https://github.com/icindy/wxParse
+ *
+ * for: 微信小程序富文本解析
+ * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
+ */
+
+/**
+ * utils函数引入
+ **/
+import showdown from 'showdown.js';
+import HtmlToJson from 'html2json.js';
+/**
+ * 配置及公有属性
+ **/
+/**
+ * 主函数入口区
+ **/
+function wxParse(bindName = 'wxParseData', type='html', data='数据不能为空', target,imagePadding) {
+ var that = target;
+ var transData = {};//存放转化后的数据
+ if (type == 'html') {
+ transData = HtmlToJson.html2json(data, bindName);
+ // console.log(JSON.stringify(transData, ' ', ' '));
+ } else if (type == 'md' || type == 'markdown') {
+ var converter = new showdown.Converter();
+ var html = converter.makeHtml(data);
+ transData = HtmlToJson.html2json(html, bindName);
+ // console.log(JSON.stringify(transData, ' ', ' '));
+ }
+ transData.view = {};
+ transData.view.imagePadding = 0;
+ if(typeof(imagePadding) != 'undefined'){
+ transData.view.imagePadding = imagePadding
+ }
+ var bindData = {};
+ bindData[bindName] = transData;
+ that.setData(bindData)
+ that.wxParseImgLoad = wxParseImgLoad;
+ that.wxParseImgTap = wxParseImgTap;
+}
+// 图片点击事件
+function wxParseImgTap(e) {
+ var that = this;
+ var nowImgUrl = e.target.dataset.src;
+ var tagFrom = e.target.dataset.from;
+ if (typeof (tagFrom) != 'undefined' && tagFrom.length > 0) {
+ wx.previewImage({
+ current: nowImgUrl, // 当前显示图片的http链接
+ urls: that.data[tagFrom].imageUrls // 需要预览的图片http链接列表
+ })
+ }
+}
+
+/**
+ * 图片视觉宽高计算函数区
+ **/
+function wxParseImgLoad(e) {
+ var that = this;
+ var tagFrom = e.target.dataset.from;
+ var idx = e.target.dataset.idx;
+ if (typeof (tagFrom) != 'undefined' && tagFrom.length > 0) {
+ calMoreImageInfo(e, idx, that, tagFrom)
+ }
+}
+// 假循环获取计算图片视觉最佳宽高
+function calMoreImageInfo(e, idx, that, bindName) {
+ var temData = that.data[bindName];
+ if (temData.images.length == 0) {
+ return;
+ }
+ var temImages = temData.images;
+ //因为无法获取view宽度 需要自定义padding进行计算,稍后处理
+ var recal = wxAutoImageCal(e.detail.width, e.detail.height,that,bindName);
+ temImages[idx].width = recal.imageWidth;
+ temImages[idx].height = recal.imageheight;
+ temData.images = temImages;
+ var bindData = {};
+ bindData[bindName] = temData;
+ that.setData(bindData);
+}
+
+// 计算视觉优先的图片宽高
+function wxAutoImageCal(originalWidth, originalHeight,that,bindName) {
+ //获取图片的原始长宽
+ var windowWidth = 0, windowHeight = 0;
+ var autoWidth = 0, autoHeight = 0;
+ var results = {};
+ wx.getSystemInfo({
+ success: function (res) {
+ var padding = that.data[bindName].view.imagePadding;
+ windowWidth = res.windowWidth-2*padding;
+ windowHeight = res.windowHeight;
+ //判断按照那种方式进行缩放
+ // console.log("windowWidth" + windowWidth);
+ if (originalWidth > windowWidth) {//在图片width大于手机屏幕width时候
+ autoWidth = windowWidth;
+ // console.log("autoWidth" + autoWidth);
+ autoHeight = (autoWidth * originalHeight) / originalWidth;
+ // console.log("autoHeight" + autoHeight);
+ results.imageWidth = autoWidth;
+ results.imageheight = autoHeight;
+ } else {//否则展示原来的数据
+ results.imageWidth = originalWidth;
+ results.imageheight = originalHeight;
+ }
+ }
+ })
+ return results;
+}
+
+function wxParseTemArray(temArrayName,bindNameReg,total,that){
+ var array = [];
+ var temData = that.data;
+ var obj = null;
+ for(var i = 0; i < total; i++){
+ var simArr = temData[bindNameReg+i].nodes;
+ array.push(simArr);
+ }
+
+ temArrayName = temArrayName || 'wxParseTemArray';
+ obj = JSON.parse('{"'+ temArrayName +'":""}');
+ obj[temArrayName] = array;
+ that.setData(obj);
+}
+
+/**
+ * 配置emojis
+ *
+ */
+
+function emojisInit(reg='',baseSrc="/wxParse/emojis/",emojis){
+ HtmlToJson.emojisInit(reg,baseSrc,emojis);
+}
+
+module.exports = {
+ wxParse: wxParse,
+ wxParseTemArray:wxParseTemArray,
+ emojisInit:emojisInit
+}
+
+
diff --git a/wx-mini-program/lib/wxParse/wxParse.wxml b/wx-mini-program/lib/wxParse/wxParse.wxml
new file mode 100644
index 0000000..963a1b1
--- /dev/null
+++ b/wx-mini-program/lib/wxParse/wxParse.wxml
@@ -0,0 +1,928 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.text}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/lib/wxParse/wxParse.wxss b/wx-mini-program/lib/wxParse/wxParse.wxss
new file mode 100644
index 0000000..a21e5c9
--- /dev/null
+++ b/wx-mini-program/lib/wxParse/wxParse.wxss
@@ -0,0 +1,202 @@
+
+/**
+ * author: Di (微信小程序开发工程师)
+ * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
+ * 垂直微信小程序开发交流社区
+ *
+ * github地址: https://github.com/icindy/wxParse
+ *
+ * for: 微信小程序富文本解析
+ * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
+ */
+
+.wxParse{
+ margin: 0 5px;
+ font-family: Helvetica,sans-serif;
+ font-size: 28rpx;
+ color: #666;
+ line-height: 1.8;
+}
+view{
+ word-break:break-all; overflow:auto;
+}
+.wxParse-inline{
+ display: inline;
+ margin: 0;
+ padding: 0;
+}
+/*//标题 */
+.wxParse-div{margin: 0;padding: 0;}
+.wxParse-h1{ font-size:2em; margin: .67em 0 }
+.wxParse-h2{ font-size:1.5em; margin: .75em 0 }
+.wxParse-h3{ font-size:1.17em; margin: .83em 0 }
+.wxParse-h4{ margin: 1.12em 0}
+.wxParse-h5 { font-size:.83em; margin: 1.5em 0 }
+.wxParse-h6{ font-size:.75em; margin: 1.67em 0 }
+
+.wxParse-h1 {
+ font-size: 18px;
+ font-weight: 400;
+ margin-bottom: .9em;
+}
+.wxParse-h2 {
+ font-size: 16px;
+ font-weight: 400;
+ margin-bottom: .34em;
+}
+.wxParse-h3 {
+ font-weight: 400;
+ font-size: 15px;
+ margin-bottom: .34em;
+}
+.wxParse-h4 {
+ font-weight: 400;
+ font-size: 14px;
+ margin-bottom: .24em;
+}
+.wxParse-h5 {
+ font-weight: 400;
+ font-size: 13px;
+ margin-bottom: .14em;
+}
+.wxParse-h6 {
+ font-weight: 400;
+ font-size: 12px;
+ margin-bottom: .04em;
+}
+
+.wxParse-h1, .wxParse-h2, .wxParse-h3, .wxParse-h4, .wxParse-h5, .wxParse-h6, .wxParse-b, .wxParse-strong { font-weight: bolder }
+
+.wxParse-i,.wxParse-cite,.wxParse-em,.wxParse-var,.wxParse-address{font-style:italic}
+.wxParse-pre,.wxParse-tt,.wxParse-code,.wxParse-kbd,.wxParse-samp{font-family:monospace}
+.wxParse-pre{white-space:pre}
+.wxParse-big{font-size:1.17em}
+.wxParse-small,.wxParse-sub,.wxParse-sup{font-size:.83em}
+.wxParse-sub{vertical-align:sub}
+.wxParse-sup{vertical-align:super}
+.wxParse-s,.wxParse-strike,.wxParse-del{text-decoration:line-through}
+/*wxparse-自定义个性化的css样式*/
+/*增加video的css样式*/
+.wxParse-strong,wxParse-s{display: inline}
+.wxParse-a{
+ color: deepskyblue;
+ word-break:break-all;
+ overflow:auto;
+}
+
+.wxParse-video{
+ text-align: center;
+ margin: 10px 0;
+}
+
+.wxParse-video-video{
+ width:100%;
+}
+
+.wxParse-img{
+ background-color: #efefef;
+ overflow: hidden;
+ width:40px;
+ height: 40px;
+}
+
+.wxParse-blockquote {
+ margin: 0;
+ padding:10px 0 10px 5px;
+ font-family:Courier, Calibri,"宋体";
+ background:#f5f5f5;
+ border-left: 3px solid #dbdbdb;
+}
+
+.wxParse-code,.wxParse-wxxxcode-style{
+ display: inline;
+ background:#f5f5f5;
+}
+.wxParse-ul{
+ margin: 20rpx 10rpx;
+}
+
+.wxParse-li,.wxParse-li-inner{
+ display: flex;
+ align-items: baseline;
+ margin: 10rpx 0;
+}
+.wxParse-li-text{
+
+ align-items: center;
+ line-height: 20px;
+}
+
+.wxParse-li-circle{
+ display: inline-flex;
+ width: 5px;
+ height: 5px;
+ background-color: #333;
+ margin-right: 5px;
+}
+
+.wxParse-li-square{
+ display: inline-flex;
+ width: 10rpx;
+ height: 10rpx;
+ background-color: #333;
+ margin-right: 5px;
+}
+.wxParse-li-ring{
+ display: inline-flex;
+ width: 10rpx;
+ height: 10rpx;
+ border: 2rpx solid #333;
+ border-radius: 50%;
+ background-color: #fff;
+ margin-right: 5px;
+}
+
+/*.wxParse-table{
+ width: 100%;
+ height: 400px;
+}
+.wxParse-thead,.wxParse-tfoot,.wxParse-tr{
+ display: flex;
+ flex-direction: row;
+}
+.wxParse-th,.wxParse-td{
+ display: flex;
+ width: 580px;
+ overflow: auto;
+}*/
+
+.wxParse-u {
+ text-decoration: underline;
+}
+.wxParse-hide{
+ display: none;
+}
+.WxEmojiView{
+ align-items: center;
+}
+.wxEmoji{
+ width: 16px;
+ height:16px;
+}
+.wxParse-tr{
+ display: flex;
+ border-right:1px solid #e0e0e0;
+ border-bottom:1px solid #e0e0e0;
+}
+.wxParse-th,
+.wxParse-td{
+ flex:1;
+ padding:5px;
+ font-size:28rpx;
+ border-left:1px solid #e0e0e0;
+ word-break: break-all;
+}
+.wxParse-td:last{
+ border-top:1px solid #e0e0e0;
+}
+.wxParse-th{
+ background:#f0f0f0;
+ border-top:1px solid #e0e0e0;
+}
+
diff --git a/wx-mini-program/lib/zanui-weapp/capsule/index.js b/wx-mini-program/lib/zanui-weapp/capsule/index.js
new file mode 100644
index 0000000..7b8452c
--- /dev/null
+++ b/wx-mini-program/lib/zanui-weapp/capsule/index.js
@@ -0,0 +1,31 @@
+'use strict';
+
+Component({
+ externalClasses: ['custom-class'],
+ /**
+ * 组件的属性列表
+ * 用于组件自定义设置
+ */
+ properties: {
+ // 颜色状态
+ type: {
+ type: String,
+ value: ''
+ },
+ // 自定义颜色
+ color: {
+ type: String,
+ value: ''
+ },
+ // 左侧内容
+ leftText: {
+ type: String,
+ value: ''
+ },
+ // 右侧内容
+ rightText: {
+ type: String,
+ value: ''
+ }
+ }
+});
\ No newline at end of file
diff --git a/wx-mini-program/lib/zanui-weapp/capsule/index.json b/wx-mini-program/lib/zanui-weapp/capsule/index.json
new file mode 100644
index 0000000..467ce29
--- /dev/null
+++ b/wx-mini-program/lib/zanui-weapp/capsule/index.json
@@ -0,0 +1,3 @@
+{
+ "component": true
+}
diff --git a/wx-mini-program/lib/zanui-weapp/capsule/index.wxml b/wx-mini-program/lib/zanui-weapp/capsule/index.wxml
new file mode 100644
index 0000000..2c81021
--- /dev/null
+++ b/wx-mini-program/lib/zanui-weapp/capsule/index.wxml
@@ -0,0 +1,10 @@
+
+
+ {{ leftText }}
+ {{ rightText }}
+
+
+ {{ leftText }}
+ {{ rightText }}
+
+
\ No newline at end of file
diff --git a/wx-mini-program/lib/zanui-weapp/capsule/index.wxss b/wx-mini-program/lib/zanui-weapp/capsule/index.wxss
new file mode 100644
index 0000000..4ba0eec
--- /dev/null
+++ b/wx-mini-program/lib/zanui-weapp/capsule/index.wxss
@@ -0,0 +1,42 @@
+.zan-capsule {
+ display: inline-block;
+ font-size: 12px;
+ vertical-align: middle;
+ line-height: 19px;
+ -webkit-transform: scale(0.83);
+ transform: scale(0.83);
+}
+
+.zan-capsule__left, .zan-capsule__right {
+ display: inline-block;
+ line-height: 17px;
+ height: 19px;
+ vertical-align: middle;
+ box-sizing: border-box;
+}
+
+.zan-capsule__left {
+ padding: 0 2px;
+ color: #fff;
+ background: #999;
+ border-radius: 2px 0 0 2px;
+ border: 1rpx solid #999;
+}
+
+.zan-capsule__right {
+ padding: 0 5px;
+ color: #999;
+ border-radius: 0 2px 2px 0;
+ border: 1rpx solid #999;
+}
+
+.zan-capsule--danger .zan-capsule__left {
+ color: #fff;
+ background: #f24544;
+ border-color: #f24544;
+}
+
+.zan-capsule--danger .zan-capsule__right {
+ color: #f24544;
+ border-color: #f24544;
+}
diff --git a/wx-mini-program/pages/about/about.js b/wx-mini-program/pages/about/about.js
new file mode 100644
index 0000000..3c378a3
--- /dev/null
+++ b/wx-mini-program/pages/about/about.js
@@ -0,0 +1,49 @@
+// about.js
+var app = getApp()
+var util = require("../../utils/util.js");
+
+
+var api = require("../../config/api.js");
+Page({
+
+ /**
+ * 页面的初始数据
+ */
+ data: {
+ load_statue: true,
+ shopInfo: {
+ name: '聚惠星',
+ address: 'https://www.shequlianshang.com/dts/index.html',
+ latitude: 27.4871724214,
+ longitude: 110.8950504844,
+ linkPhone: '19908488612',
+ qqNumber: '686432822'
+ },
+ },
+
+ /**
+ * 生命周期函数--监听页面加载
+ */
+ onLoad: function (options) {
+
+ },
+
+ showLocation: function (e) {
+ var that = this
+ wx.openLocation({
+ latitude: that.data.shopInfo.latitude,
+ longitude: that.data.shopInfo.longitude,
+ name: that.data.shopInfo.name,
+ address: that.data.shopInfo.address,
+ })
+ },
+ callPhone: function (e) {
+ var that = this
+ wx.makePhoneCall({
+ phoneNumber: that.data.shopInfo.linkPhone,
+ })
+ },
+ reLoad: function (e) {
+ this.loadShopInfo();
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/about/about.json b/wx-mini-program/pages/about/about.json
new file mode 100644
index 0000000..613684d
--- /dev/null
+++ b/wx-mini-program/pages/about/about.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "关于我们",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/about/about.wxml b/wx-mini-program/pages/about/about.wxml
new file mode 100644
index 0000000..4697b3b
--- /dev/null
+++ b/wx-mini-program/pages/about/about.wxml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+ {{shopInfo.name}}
+
+
+
+
+
+
+
+
+
+ {{shopInfo.address}}
+
+
+
+
+
+
+ {{shopInfo.linkPhone}}
+
+
+
+
+
+
+
+
+
+ {{shopInfo.qqNumber}}
+
+
+
+
+
+
+
+
+
+ 1.0.0
+
+
+
+
+
+
+ MIT
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/about/about.wxss b/wx-mini-program/pages/about/about.wxss
new file mode 100644
index 0000000..72f3403
--- /dev/null
+++ b/wx-mini-program/pages/about/about.wxss
@@ -0,0 +1,44 @@
+/* about.wxss */
+
+page{
+ height: 100%;
+ background-color: #F2f2f2;
+}
+.page-view{
+ height: 100%;
+}
+.banner-image{
+ width: 100%;
+ height: 350rpx;
+ background: #ee1;
+ margin-bottom: 30rpx;
+ border-bottom: solid #f2f2f2 0.5dp;
+}
+
+.about-item{
+ background: white;
+ border-top: solid #f2f2f2 0.2rpx;
+ border-bottom: solid #f2f2f2 0.2rpx;
+ width: 100%;
+ height: 100rpx;
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+}
+
+.item-left{
+ font-size: 30rpx;
+ margin-left: 15rpx;
+ margin-top: auto;
+ margin-bottom: auto;
+}
+.item-right{
+
+ margin-right: 15rpx;
+ margin-top: auto;
+ margin-bottom: auto;
+}
+.right-icon{
+ width: 40rpx;
+ height: 40rpx;
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/article/article.js b/wx-mini-program/pages/article/article.js
new file mode 100644
index 0000000..8bb42de
--- /dev/null
+++ b/wx-mini-program/pages/article/article.js
@@ -0,0 +1,95 @@
+var app = getApp();
+var util = require('../../utils/util.js');
+var api = require('../../config/api.js');
+var WxParse = require('../../lib/wxParse/wxParse.js');
+
+Page({
+
+ /**
+ * 页面的初始数据
+ */
+ data: {
+ 'title': '公告详情',
+ 'content': "",
+ id:0,
+ "addTime":"2019-01-01",
+ "type":1
+ },
+
+ /**
+ * 生命周期函数--监听页面加载
+ */
+ onLoad: function (options) {
+ if (options.hasOwnProperty('id')){
+ this.setData({ id: options.id});
+ }else{
+ wx.navigateBack({delta: 1 });
+ }
+ },
+
+ /**
+ * 生命周期函数--监听页面初次渲染完成
+ */
+ onReady: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面显示
+ */
+ onShow: function () {
+ this.getArticleOne();
+ },
+ getArticleOne:function(){
+ var that = this;
+ util.request(api.ArticleDetail, {
+ id: that.data.id
+ }).then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ "title": res.data.title,
+ "content": res.data.content,
+ "addTime": res.data.addTime,
+ "type": res.data.type
+ });
+
+ //html转wxml
+ WxParse.wxParse('content', 'html', res.data.content, that, 0);
+ }
+ });
+ },
+ /**
+ * 生命周期函数--监听页面隐藏
+ */
+ onHide: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面卸载
+ */
+ onUnload: function () {
+
+ },
+
+ /**
+ * 页面相关事件处理函数--监听用户下拉动作
+ */
+ onPullDownRefresh: function () {
+
+ },
+
+ /**
+ * 页面上拉触底事件的处理函数
+ */
+ onReachBottom: function () {
+
+ },
+
+ /**
+ * 用户点击右上角分享
+ */
+ onShareAppMessage: function () {
+
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/article/article.json b/wx-mini-program/pages/article/article.json
new file mode 100644
index 0000000..0ed8fce
--- /dev/null
+++ b/wx-mini-program/pages/article/article.json
@@ -0,0 +1,7 @@
+{
+ "navigationBarTitleText": "公告详情",
+ "enablePullDownRefresh": false,
+ "usingComponents": {
+ "home": "../../lib/home/index"
+ }
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/article/article.wxml b/wx-mini-program/pages/article/article.wxml
new file mode 100644
index 0000000..dbd4d1e
--- /dev/null
+++ b/wx-mini-program/pages/article/article.wxml
@@ -0,0 +1,14 @@
+
+ {{title}}
+
+ 公告
+ 新闻
+ {{addTime}}
+ 10000+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/article/article.wxss b/wx-mini-program/pages/article/article.wxss
new file mode 100644
index 0000000..9a80c76
--- /dev/null
+++ b/wx-mini-program/pages/article/article.wxss
@@ -0,0 +1,9 @@
+page{background-color:#fff!important;}
+.newsDetail .title{padding:0 30rpx;font-size:34rpx;color:#282828;font-weight:bold;margin:45rpx 0 23rpx 0;line-height:1.5;}
+.newsDetail .list{margin:0 30rpx;border-bottom:1rpx solid #eee;padding-bottom:25rpx;}
+.newsDetail .list .label{font-size:24rpx;height:38rpx;border-radius:3rpx;text-align:center;line-height:38rpx;padding: 0 10rpx;}
+.newsDetail .list .item{margin-left:27rpx;font-size:24rpx;color:#999;}
+.newsDetail .list .item .iconfont{font-size:28rpx;margin-right:10rpx;}
+.newsDetail .list .item .iconfont.icon-shenhezhong{font-size:26rpx;}
+.newsDetail .conter{padding:0 15rpx;font-size:30rpx;color:#333;line-height:1.7;padding-top:35rpx;}
+@import "/lib/wxParse/wxParse.wxss";
\ No newline at end of file
diff --git a/wx-mini-program/pages/auth/accountLogin/accountLogin.js b/wx-mini-program/pages/auth/accountLogin/accountLogin.js
new file mode 100644
index 0000000..959f37e
--- /dev/null
+++ b/wx-mini-program/pages/auth/accountLogin/accountLogin.js
@@ -0,0 +1,117 @@
+var api = require('../../../config/api.js');
+var util = require('../../../utils/util.js');
+var user = require('../../../utils/user.js');
+
+var app = getApp();
+Page({
+ data: {
+ username: '',
+ password: '',
+ code: '',
+ loginErrorCount: 0
+ },
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ // 页面渲染完成
+
+ },
+ onReady: function() {
+
+ },
+ onShow: function() {
+ // 页面显示
+ },
+ onHide: function() {
+ // 页面隐藏
+
+ },
+ onUnload: function() {
+ // 页面关闭
+
+ },
+ accountLogin: function() {
+ var that = this;
+
+ if (this.data.password.length < 1 || this.data.username.length < 1) {
+ wx.showModal({
+ title: '错误信息',
+ content: '请输入用户名和密码',
+ showCancel: false
+ });
+ return false;
+ }
+
+ wx.request({
+ url: api.AuthLoginByAccount,
+ data: {
+ username: that.data.username,
+ password: that.data.password
+ },
+ method: 'POST',
+ header: {
+ 'content-type': 'application/json'
+ },
+ success: function(res) {
+ if (res.data.errno == 0) {
+ that.setData({
+ loginErrorCount: 0
+ });
+ app.globalData.hasLogin = true;
+ wx.setStorageSync('userInfo', res.data.data.userInfo);
+ wx.setStorage({
+ key: "token",
+ data: res.data.data.token,
+ success: function() {
+ wx.switchTab({
+ url: '/pages/ucenter/index/index'
+ });
+ }
+ });
+ } else {
+ that.setData({
+ loginErrorCount: that.data.loginErrorCount + 1
+ });
+ app.globalData.hasLogin = false;
+ util.showErrorToast('账户登录失败');
+ }
+ }
+ });
+ },
+ bindUsernameInput: function(e) {
+
+ this.setData({
+ username: e.detail.value
+ });
+ },
+ bindPasswordInput: function(e) {
+
+ this.setData({
+ password: e.detail.value
+ });
+ },
+ bindCodeInput: function(e) {
+
+ this.setData({
+ code: e.detail.value
+ });
+ },
+ clearInput: function(e) {
+ switch (e.currentTarget.id) {
+ case 'clear-username':
+ this.setData({
+ username: ''
+ });
+ break;
+ case 'clear-password':
+ this.setData({
+ password: ''
+ });
+ break;
+ case 'clear-code':
+ this.setData({
+ code: ''
+ });
+ break;
+ }
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/auth/accountLogin/accountLogin.json b/wx-mini-program/pages/auth/accountLogin/accountLogin.json
new file mode 100644
index 0000000..eb41fcd
--- /dev/null
+++ b/wx-mini-program/pages/auth/accountLogin/accountLogin.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "账号登录",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/auth/accountLogin/accountLogin.wxml b/wx-mini-program/pages/auth/accountLogin/accountLogin.wxml
new file mode 100644
index 0000000..0b075d7
--- /dev/null
+++ b/wx-mini-program/pages/auth/accountLogin/accountLogin.wxml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 注册账号
+ 忘记密码
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/auth/accountLogin/accountLogin.wxss b/wx-mini-program/pages/auth/accountLogin/accountLogin.wxss
new file mode 100644
index 0000000..3046f81
--- /dev/null
+++ b/wx-mini-program/pages/auth/accountLogin/accountLogin.wxss
@@ -0,0 +1,103 @@
+.form-box {
+ width: 100%;
+ height: auto;
+ overflow: hidden;
+ padding: 0 40rpx;
+ margin-top: 200rpx;
+ background: #f4f4f4;
+}
+
+.form-item {
+ position: relative;
+ background: #f4f4f4;
+ height: 96rpx;
+ border-bottom: 1px solid #d9d9d9;
+}
+
+.form-item .username, .form-item .password, .form-item .code {
+ position: absolute;
+ top: 26rpx;
+ left: 0;
+ display: block;
+ width: 100%;
+ height: 44rpx;
+ background: #f4f4f4;
+ color: #333;
+ font-size: 30rpx;
+}
+
+.form-item-code {
+ margin-top: 32rpx;
+ height: auto;
+ overflow: hidden;
+ width: 100%;
+}
+
+.form-item-code .form-item {
+ float: left;
+ width: 350rpx;
+}
+
+.form-item-code .code-img {
+ float: right;
+ margin-top: 4rpx;
+ height: 88rpx;
+ width: 236rpx;
+}
+
+.form-item .clear {
+ position: absolute;
+ top: 26rpx;
+ right: 18rpx;
+ z-index: 2;
+ display: block;
+ background: #f4f4f4;
+ height: 44rpx;
+ width: 44rpx;
+}
+
+.login-btn {
+ margin: 60rpx 0 40rpx 0;
+ height: 96rpx;
+ line-height: 96rpx;
+ font-size: 30rpx;
+ border-radius: 6rpx;
+ width: 90%;
+ color: #f4f4f4;
+ right: 0;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ position: flex;
+ bottom: 0;
+ left: 0;
+ padding: 0;
+ margin-left: 5%;
+ text-align: center;
+ /* padding-left: -5rpx; */
+ border-top-left-radius: 50rpx;
+ border-bottom-left-radius: 50rpx;
+ border-top-right-radius: 50rpx;
+ border-bottom-right-radius: 50rpx;
+ letter-spacing: 3rpx;
+ background-image: linear-gradient(to right, #9a9ba1 0%, #9a9ba1 100%);
+}
+
+.form-item-text {
+ height: 35rpx;
+ width: 100%;
+}
+
+.form-item-text .register {
+ display: block;
+ height: 34rpx;
+ float: left;
+ font-size: 28rpx;
+}
+
+.form-item-text .reset {
+ display: block;
+ height: 34rpx;
+ float: right;
+ font-size: 28rpx;
+}
diff --git a/wx-mini-program/pages/auth/login/login.js b/wx-mini-program/pages/auth/login/login.js
new file mode 100644
index 0000000..5a6677c
--- /dev/null
+++ b/wx-mini-program/pages/auth/login/login.js
@@ -0,0 +1,52 @@
+var api = require('../../../config/api.js');
+var util = require('../../../utils/util.js');
+var user = require('../../../utils/user.js');
+
+var app = getApp();
+Page({
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ // 页面渲染完成
+
+ },
+ onReady: function() {
+
+ },
+ onShow: function() {
+ // 页面显示
+ },
+ onHide: function() {
+ // 页面隐藏
+
+ },
+ onUnload: function() {
+ // 页面关闭
+
+ },
+ wxLogin: function(e) {
+ if (e.detail.userInfo == undefined) {
+ app.globalData.hasLogin = false;
+ util.showErrorToast('微信登录失败');
+ return;
+ }
+ user.checkLogin().catch(() => {
+
+ user.loginByWeixin(e.detail.userInfo).then(res => {
+ app.globalData.hasLogin = true;
+
+ wx.navigateBack({
+ delta: 1
+ })
+ }).catch((err) => {
+ app.globalData.hasLogin = false;
+ util.showErrorToast('微信登录失败');
+ });
+
+ });
+ },
+ accountLogin: function() {
+ wx.navigateTo({
+ url: "/pages/auth/accountLogin/accountLogin"
+ });
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/auth/login/login.json b/wx-mini-program/pages/auth/login/login.json
new file mode 100644
index 0000000..2bdef21
--- /dev/null
+++ b/wx-mini-program/pages/auth/login/login.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "登录",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/auth/login/login.wxml b/wx-mini-program/pages/auth/login/login.wxml
new file mode 100644
index 0000000..c2b604b
--- /dev/null
+++ b/wx-mini-program/pages/auth/login/login.wxml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/auth/login/login.wxss b/wx-mini-program/pages/auth/login/login.wxss
new file mode 100644
index 0000000..89affa5
--- /dev/null
+++ b/wx-mini-program/pages/auth/login/login.wxss
@@ -0,0 +1,61 @@
+.login-box {
+ width: 100%;
+ height: auto;
+ overflow: hidden;
+ padding: 0 40rpx;
+ margin-top: 200rpx;
+ background: #f4f4f4;
+}
+
+.wx-login-btn {
+ margin: 60rpx 0 40rpx 0;
+ height: 96rpx;
+ line-height: 96rpx;
+ font-size: 30rpx;
+ border-radius: 6rpx;
+ width: 90%;
+ color: #fff;
+ right: 0;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ position: flex;
+ bottom: 0;
+ left: 0;
+ padding: 0;
+ margin-left: 5%;
+ text-align: center;
+ /* padding-left: -5rpx; */
+ border-top-left-radius: 50rpx;
+ border-bottom-left-radius: 50rpx;
+ border-top-right-radius: 50rpx;
+ border-bottom-right-radius: 50rpx;
+ letter-spacing: 3rpx;
+}
+
+.account-login-btn {
+ width: 90%;
+ margin: 0 auto;
+ color: #fff;
+ font-size: 30rpx;
+ height: 96rpx;
+ line-height: 96rpx;
+ right: 0;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ position: flex;
+ bottom: 0;
+ left: 0;
+ border-radius: 0;
+ padding: 0;
+ margin-left: 5%;
+ text-align: center;
+ /* padding-left: -5rpx; */
+ border-top-left-radius: 50rpx;
+ border-bottom-left-radius: 50rpx;
+ border-top-right-radius: 50rpx;
+ border-bottom-right-radius: 50rpx;
+ letter-spacing: 3rpx;
+ background-image: linear-gradient(to right, #9a9ba1 0%, #9a9ba1 100%);
+}
diff --git a/wx-mini-program/pages/auth/register/register.js b/wx-mini-program/pages/auth/register/register.js
new file mode 100644
index 0000000..54453db
--- /dev/null
+++ b/wx-mini-program/pages/auth/register/register.js
@@ -0,0 +1,230 @@
+var api = require('../../../config/api.js');
+var check = require('../../../utils/check.js');
+
+var app = getApp();
+Page({
+ data: {
+ username: '',
+ password: '',
+ confirmPassword: '',
+ mobile: '',
+ code: ''
+ },
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ // 页面渲染完成
+
+ },
+ onReady: function() {
+
+ },
+ onShow: function() {
+ // 页面显示
+
+ },
+ onHide: function() {
+ // 页面隐藏
+
+ },
+ onUnload: function() {
+ // 页面关闭
+
+ },
+ sendCode: function() {
+ let that = this;
+
+ if (this.data.mobile.length == 0) {
+ wx.showModal({
+ title: '错误信息',
+ content: '手机号不能为空',
+ showCancel: false
+ });
+ return false;
+ }
+
+ if (!check.isValidPhone(this.data.mobile)) {
+ wx.showModal({
+ title: '错误信息',
+ content: '手机号输入不正确',
+ showCancel: false
+ });
+ return false;
+ }
+
+ wx.request({
+ url: api.AuthRegisterCaptcha,
+ data: {
+ mobile: that.data.mobile
+ },
+ method: 'POST',
+ header: {
+ 'content-type': 'application/json'
+ },
+ success: function(res) {
+ if (res.data.errno == 0) {
+ wx.showModal({
+ title: '发送成功',
+ content: '验证码已发送',
+ showCancel: false
+ });
+ } else {
+ wx.showModal({
+ title: '错误信息',
+ content: res.data.errmsg,
+ showCancel: false
+ });
+ }
+ }
+ });
+ },
+ requestRegister: function(wxCode) {
+ let that = this;
+ wx.request({
+ url: api.AuthRegister,
+ data: {
+ username: that.data.username,
+ password: that.data.password,
+ mobile: that.data.mobile,
+ code: that.data.code,
+ wxCode: wxCode
+ },
+ method: 'POST',
+ header: {
+ 'content-type': 'application/json'
+ },
+ success: function(res) {
+ if (res.data.errno == 0) {
+ app.globalData.hasLogin = true;
+ wx.setStorageSync('userInfo', res.data.data.userInfo);
+ wx.setStorage({
+ key: "token",
+ data: res.data.data.token,
+ success: function() {
+ wx.switchTab({
+ url: '/pages/ucenter/index/index'
+ });
+ }
+ });
+ } else {
+ wx.showModal({
+ title: '错误信息',
+ content: res.data.errmsg,
+ showCancel: false
+ });
+ }
+ }
+ });
+ },
+ startRegister: function() {
+ var that = this;
+
+ if (this.data.password.length < 6 || this.data.username.length < 6) {
+ wx.showModal({
+ title: '错误信息',
+ content: '用户名和密码不得少于6位',
+ showCancel: false
+ });
+ return false;
+ }
+
+ if (this.data.password != this.data.confirmPassword) {
+ wx.showModal({
+ title: '错误信息',
+ content: '确认密码不一致',
+ showCancel: false
+ });
+ return false;
+ }
+
+ if (this.data.mobile.length == 0 || this.data.code.length == 0) {
+ wx.showModal({
+ title: '错误信息',
+ content: '手机号和验证码不能为空',
+ showCancel: false
+ });
+ return false;
+ }
+
+ if (!check.isValidPhone(this.data.mobile)) {
+ wx.showModal({
+ title: '错误信息',
+ content: '手机号输入不正确',
+ showCancel: false
+ });
+ return false;
+ }
+
+ wx.login({
+ success: function(res) {
+ if (!res.code) {
+ wx.showModal({
+ title: '错误信息',
+ content: '注册失败',
+ showCancel: false
+ });
+ }
+
+ that.requestRegister(res.code);
+ }
+ });
+ },
+ bindUsernameInput: function(e) {
+
+ this.setData({
+ username: e.detail.value
+ });
+ },
+ bindPasswordInput: function(e) {
+
+ this.setData({
+ password: e.detail.value
+ });
+ },
+ bindConfirmPasswordInput: function(e) {
+
+ this.setData({
+ confirmPassword: e.detail.value
+ });
+ },
+ bindMobileInput: function(e) {
+
+ this.setData({
+ mobile: e.detail.value
+ });
+ },
+ bindCodeInput: function(e) {
+
+ this.setData({
+ code: e.detail.value
+ });
+ },
+ clearInput: function(e) {
+ switch (e.currentTarget.id) {
+ case 'clear-username':
+ this.setData({
+ username: ''
+ });
+ break;
+ case 'clear-password':
+ this.setData({
+ password: ''
+ });
+ break;
+ case 'clear-confirm-password':
+ this.setData({
+ confirmPassword: ''
+ });
+ break;
+ case 'clear-mobile':
+ this.setData({
+ mobile: ''
+ });
+ break;
+ case 'clear-code':
+ this.setData({
+ code: ''
+ });
+ break;
+ }
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/auth/register/register.json b/wx-mini-program/pages/auth/register/register.json
new file mode 100644
index 0000000..37f10f3
--- /dev/null
+++ b/wx-mini-program/pages/auth/register/register.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "注册",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/auth/register/register.wxml b/wx-mini-program/pages/auth/register/register.wxml
new file mode 100644
index 0000000..0696496
--- /dev/null
+++ b/wx-mini-program/pages/auth/register/register.wxml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 获取验证码
+
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/auth/register/register.wxss b/wx-mini-program/pages/auth/register/register.wxss
new file mode 100644
index 0000000..6878ce6
--- /dev/null
+++ b/wx-mini-program/pages/auth/register/register.wxss
@@ -0,0 +1,69 @@
+.form-box {
+ width: 100%;
+ height: auto;
+ overflow: hidden;
+ padding: 0 40rpx;
+ margin-top: 96rpx;
+ background: #fff;
+}
+
+.form-item {
+ position: relative;
+ background: #fff;
+ height: 96rpx;
+ border-bottom: 1px solid #d9d9d9;
+}
+
+.form-item .username, .form-item .password, .form-item .mobile, .form-item .code {
+ position: absolute;
+ top: 26rpx;
+ left: 0;
+ display: block;
+ width: 100%;
+ height: 44rpx;
+ background: #fff;
+ color: #333;
+ font-size: 30rpx;
+}
+
+.form-item-code {
+ margin-top: 32rpx;
+ height: auto;
+ overflow: hidden;
+ width: 100%;
+}
+
+.form-item-code .form-item {
+ float: left;
+ width: 350rpx;
+}
+
+.form-item-code .code-btn {
+ float: right;
+ padding: 20rpx 40rpx;
+ border: 1px solid #d9d9d9;
+ border-radius: 10rpx;
+ color: #fff;
+ background: green;
+}
+
+.form-item .clear {
+ position: absolute;
+ top: 26rpx;
+ right: 18rpx;
+ z-index: 2;
+ display: block;
+ background: #fff;
+ height: 44rpx;
+ width: 44rpx;
+}
+
+.register-btn {
+ margin: 60rpx 0 40rpx 0;
+ height: 96rpx;
+ line-height: 96rpx;
+ color: #fff;
+ font-size: 30rpx;
+ width: 100%;
+ border-radius: 6rpx;
+}
diff --git a/wx-mini-program/pages/auth/reset/reset.js b/wx-mini-program/pages/auth/reset/reset.js
new file mode 100644
index 0000000..3b821ee
--- /dev/null
+++ b/wx-mini-program/pages/auth/reset/reset.js
@@ -0,0 +1,172 @@
+var api = require('../../../config/api.js');
+var check = require('../../../utils/check.js');
+
+var app = getApp();
+Page({
+ data: {
+ mobile: '',
+ code: '',
+ password: '',
+ confirmPassword: ''
+ },
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ // 页面渲染完成
+
+ },
+ onReady: function() {
+
+ },
+ onShow: function() {
+ // 页面显示
+
+ },
+ onHide: function() {
+ // 页面隐藏
+
+ },
+ onUnload: function() {
+ // 页面关闭
+
+ },
+
+ sendCode: function() {
+ let that = this;
+ wx.request({
+ url: api.AuthRegisterCaptcha,
+ data: {
+ mobile: that.data.mobile
+ },
+ method: 'POST',
+ header: {
+ 'content-type': 'application/json'
+ },
+ success: function(res) {
+ if (res.data.errno == 0) {
+ wx.showModal({
+ title: '发送成功',
+ content: '验证码已发送',
+ showCancel: false
+ });
+ } else {
+ wx.showModal({
+ title: '错误信息',
+ content: res.data.errmsg,
+ showCancel: false
+ });
+ }
+ }
+ });
+ },
+ startReset: function() {
+ var that = this;
+
+ if (this.data.mobile.length == 0 || this.data.code.length == 0) {
+ wx.showModal({
+ title: '错误信息',
+ content: '手机号和验证码不能为空',
+ showCancel: false
+ });
+ return false;
+ }
+
+ if (!check.isValidPhone(this.data.mobile)) {
+ wx.showModal({
+ title: '错误信息',
+ content: '手机号输入不正确',
+ showCancel: false
+ });
+ return false;
+ }
+
+ if (this.data.password.length < 3) {
+ wx.showModal({
+ title: '错误信息',
+ content: '用户名和密码不得少于3位',
+ showCancel: false
+ });
+ return false;
+ }
+
+ if (this.data.password != this.data.confirmPassword) {
+ wx.showModal({
+ title: '错误信息',
+ content: '确认密码不一致',
+ showCancel: false
+ });
+ return false;
+ }
+
+ wx.request({
+ url: api.AuthReset,
+ data: {
+ mobile: that.data.mobile,
+ code: that.data.code,
+ password: that.data.password
+ },
+ method: 'POST',
+ header: {
+ 'content-type': 'application/json'
+ },
+ success: function(res) {
+ if (res.data.errno == 0) {
+ wx.navigateBack();
+ } else {
+ wx.showModal({
+ title: '密码重置失败',
+ content: res.data.errmsg,
+ showCancel: false
+ });
+ }
+ }
+ });
+ },
+ bindPasswordInput: function(e) {
+
+ this.setData({
+ password: e.detail.value
+ });
+ },
+ bindConfirmPasswordInput: function(e) {
+
+ this.setData({
+ confirmPassword: e.detail.value
+ });
+ },
+ bindMobileInput: function(e) {
+
+ this.setData({
+ mobile: e.detail.value
+ });
+ },
+ bindCodeInput: function(e) {
+
+ this.setData({
+ code: e.detail.value
+ });
+ },
+ clearInput: function(e) {
+ switch (e.currentTarget.id) {
+ case 'clear-password':
+ this.setData({
+ password: ''
+ });
+ break;
+ case 'clear-confirm-password':
+ this.setData({
+ confirmPassword: ''
+ });
+ break;
+ case 'clear-mobile':
+ this.setData({
+ mobile: ''
+ });
+ break;
+ case 'clear-code':
+ this.setData({
+ code: ''
+ });
+ break;
+ }
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/auth/reset/reset.json b/wx-mini-program/pages/auth/reset/reset.json
new file mode 100644
index 0000000..3d4154f
--- /dev/null
+++ b/wx-mini-program/pages/auth/reset/reset.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "密码重置",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/auth/reset/reset.wxml b/wx-mini-program/pages/auth/reset/reset.wxml
new file mode 100644
index 0000000..35f29cf
--- /dev/null
+++ b/wx-mini-program/pages/auth/reset/reset.wxml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 获取验证码
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/auth/reset/reset.wxss b/wx-mini-program/pages/auth/reset/reset.wxss
new file mode 100644
index 0000000..4f61be7
--- /dev/null
+++ b/wx-mini-program/pages/auth/reset/reset.wxss
@@ -0,0 +1,68 @@
+.form-box {
+ width: 100%;
+ height: auto;
+ overflow: hidden;
+ padding: 0 40rpx;
+ margin-top: 96rpx;
+ background: #fff;
+}
+
+.form-item {
+ position: relative;
+ background: #fff;
+ height: 96rpx;
+ border-bottom: 1px solid #d9d9d9;
+}
+
+.form-item .mobile, .form-item .password, .form-item .code {
+ position: absolute;
+ top: 26rpx;
+ left: 0;
+ display: block;
+ width: 100%;
+ height: 44rpx;
+ background: #fff;
+ color: #333;
+ font-size: 30rpx;
+}
+
+.form-item-code {
+ margin-top: 32rpx;
+ height: auto;
+ overflow: hidden;
+ width: 100%;
+}
+
+.form-item-code .form-item {
+ float: left;
+ width: 350rpx;
+}
+
+.form-item-code .code-btn {
+ float: right;
+ padding: 20rpx 40rpx;
+ border: 1px solid #d9d9d9;
+ border-radius: 10rpx;
+}
+
+.form-item .clear {
+ position: absolute;
+ top: 26rpx;
+ right: 18rpx;
+ z-index: 2;
+ display: block;
+ background: #fff;
+ height: 44rpx;
+ width: 44rpx;
+}
+
+.reset-btn {
+ margin: 60rpx 0 40rpx 0;
+ height: 96rpx;
+ line-height: 96rpx;
+ color: #fff;
+ font-size: 30rpx;
+ width: 100%;
+ background: #b4282d;
+ border-radius: 6rpx;
+}
diff --git a/wx-mini-program/pages/brand/brand.js b/wx-mini-program/pages/brand/brand.js
new file mode 100644
index 0000000..7e1920b
--- /dev/null
+++ b/wx-mini-program/pages/brand/brand.js
@@ -0,0 +1,59 @@
+var util = require('../../utils/util.js');
+var api = require('../../config/api.js');
+var app = getApp();
+Page({
+ data: {
+ brandList: [],
+ page: 1,
+ size: 10,
+ totalPages: 1
+ },
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ this.getBrandList();
+ },
+ getBrandList: function() {
+ wx.showLoading({
+ title: '加载中...',
+ });
+ let that = this;
+ util.request(api.BrandList, {
+ page: that.data.page,
+ size: that.data.size
+ }).then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ brandList: that.data.brandList.concat(res.data.brandList),
+ totalPages: res.data.totalPages
+ });
+ }
+ wx.hideLoading();
+ });
+ },
+ onReachBottom() {
+ if (this.data.totalPages > this.data.page) {
+ this.setData({
+ page: this.data.page + 1
+ });
+ } else {
+ return false;
+ }
+
+ this.getBrandList();
+ },
+ onReady: function() {
+
+ },
+ onShow: function() {
+ // 页面显示
+
+ },
+ onHide: function() {
+ // 页面隐藏
+
+ },
+ onUnload: function() {
+ // 页面关闭
+
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/brand/brand.json b/wx-mini-program/pages/brand/brand.json
new file mode 100644
index 0000000..cb83aa4
--- /dev/null
+++ b/wx-mini-program/pages/brand/brand.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "品牌厂商直供",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/brand/brand.wxml b/wx-mini-program/pages/brand/brand.wxml
new file mode 100644
index 0000000..ef2e2b9
--- /dev/null
+++ b/wx-mini-program/pages/brand/brand.wxml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+ {{item.name}}
+ |
+ {{item.floorPrice}}元起
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/brand/brand.wxss b/wx-mini-program/pages/brand/brand.wxss
new file mode 100644
index 0000000..4fdc8c5
--- /dev/null
+++ b/wx-mini-program/pages/brand/brand.wxss
@@ -0,0 +1,52 @@
+.brand-list .item {
+ display: block;
+ width: 750rpx;
+ height: 416rpx;
+ position: relative;
+ margin-bottom: 4rpx;
+}
+
+.brand-list .item .img-bg {
+ position: absolute;
+ left: 0;
+ top: 0;
+ z-index: 0;
+ width: 750rpx;
+ height: 417rpx;
+ overflow: hidden;
+}
+
+.brand-list .item .img-bg image {
+ width: 750rpx;
+ height: 416rpx;
+}
+
+.brand-list .item .txt-box {
+ position: absolute;
+ left: 0;
+ top: 0;
+ display: table;
+ z-index: 0;
+ width: 750rpx;
+ height: 417rpx;
+}
+
+.brand-list .item .line {
+ display: table-cell;
+ vertical-align: middle;
+ text-align: center;
+ height: 63rpx;
+ line-height: 63rpx;
+}
+
+.brand-list .item .line text {
+ font-size: 35rpx;
+ font-weight: 700;
+ text-shadow: 1rpx 1rpx rgba(0, 0, 0, 0.32);
+ color: #fff;
+}
+
+.brand-list .item .line .s {
+ padding: 0 10rpx;
+ font-size: 40rpx;
+}
diff --git a/wx-mini-program/pages/brandDetail/brandDetail.js b/wx-mini-program/pages/brandDetail/brandDetail.js
new file mode 100644
index 0000000..8944cd7
--- /dev/null
+++ b/wx-mini-program/pages/brandDetail/brandDetail.js
@@ -0,0 +1,69 @@
+var util = require('../../utils/util.js');
+var api = require('../../config/api.js');
+
+
+var app = getApp();
+
+Page({
+ data: {
+ id: 0,
+ brand: {},
+ goodsList: [],
+ page: 1,
+ size: 200
+ },
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ var that = this;
+ that.setData({
+ id: parseInt(options.id)
+ });
+ this.getBrand();
+ },
+ getBrand: function() {
+ let that = this;
+ util.request(api.BrandDetail, {
+ id: that.data.id
+ }).then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ brand: res.data.brand
+ });
+
+ that.getGoodsList();
+ }
+ });
+ },
+ getGoodsList() {
+ var that = this;
+
+ util.request(api.GoodsList, {
+ brandId: that.data.id,
+ page: that.data.page,
+ size: that.data.size
+ })
+ .then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ goodsList: res.data.goodsList
+ });
+ }
+ });
+ },
+ onReady: function() {
+ // 页面渲染完成
+
+ },
+ onShow: function() {
+ // 页面显示
+
+ },
+ onHide: function() {
+ // 页面隐藏
+
+ },
+ onUnload: function() {
+ // 页面关闭
+
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/brandDetail/brandDetail.json b/wx-mini-program/pages/brandDetail/brandDetail.json
new file mode 100644
index 0000000..6c9e61b
--- /dev/null
+++ b/wx-mini-program/pages/brandDetail/brandDetail.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "品牌商详情",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/brandDetail/brandDetail.wxml b/wx-mini-program/pages/brandDetail/brandDetail.wxml
new file mode 100644
index 0000000..bf4e9ed
--- /dev/null
+++ b/wx-mini-program/pages/brandDetail/brandDetail.wxml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+ {{brand.name}}
+
+
+
+
+
+ {{brand.desc}}
+
+
+
+
+
+
+
+
+ {{iitem.name}}
+ ¥{{iitem.retailPrice}}
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/brandDetail/brandDetail.wxss b/wx-mini-program/pages/brandDetail/brandDetail.wxss
new file mode 100644
index 0000000..3126093
--- /dev/null
+++ b/wx-mini-program/pages/brandDetail/brandDetail.wxss
@@ -0,0 +1,111 @@
+page {
+ background: #f4f4f4;
+}
+
+.brand-info .name {
+ width: 100%;
+ height: 290rpx;
+ position: relative;
+}
+
+.brand-info .img {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 290rpx;
+}
+
+.brand-info .info-box {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 290rpx;
+ text-align: center;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.brand-info .info {
+ display: block;
+}
+
+.brand-info .txt {
+ display: block;
+ height: 37.5rpx;
+ font-size: 37.5rpx;
+ color: #fff;
+}
+
+.brand-info .line {
+ margin: 0 auto;
+ margin-top: 16rpx;
+ display: block;
+ height: 2rpx;
+ width: 145rpx;
+ background: #fff;
+}
+
+.brand-info .desc {
+ background: #fff;
+ width: 100%;
+ height: auto;
+ overflow: hidden;
+ padding: 41.5rpx 31.25rpx;
+ font-size: 30rpx;
+ color: #666;
+ line-height: 41.5rpx;
+ text-align: center;
+}
+
+.cate-item .b {
+ width: 750rpx;
+ height: auto;
+ overflow: hidden;
+ border-top: 1rpx solid #f4f4f4;
+ margin-top: 20rpx;
+}
+
+.cate-item .b .item {
+ float: left;
+ background: #fff;
+ width: 375rpx;
+ padding-bottom: 33.333rpx;
+ border-bottom: 1rpx solid #f4f4f4;
+ height: auto;
+ overflow: hidden;
+ text-align: center;
+}
+
+.cate-item .b .item-b {
+ border-right: 1rpx solid #f4f4f4;
+}
+
+.cate-item .item .img {
+ margin-top: 10rpx;
+ width: 302rpx;
+ height: 302rpx;
+}
+
+.cate-item .item .name {
+ display: block;
+ width: 365.625rpx;
+ height: 35rpx;
+ padding: 0 20rpx;
+ overflow: hidden;
+ margin: 11.5rpx 0 22rpx 0;
+ text-align: center;
+ font-size: 30rpx;
+ color: #333;
+}
+
+.cate-item .item .price {
+ display: block;
+ width: 365.625rpx;
+ height: 30rpx;
+ text-align: center;
+ font-size: 30rpx;
+ color: #b4282d;
+}
diff --git a/wx-mini-program/pages/brokerage/main/main.js b/wx-mini-program/pages/brokerage/main/main.js
new file mode 100644
index 0000000..b7ff39c
--- /dev/null
+++ b/wx-mini-program/pages/brokerage/main/main.js
@@ -0,0 +1,126 @@
+var app = getApp();
+var util = require('../../../utils/util.js');
+var api = require('../../../config/api.js');
+
+Page({
+ data: {
+ today_type:"active",
+ yestoday_type:"disable",
+ week_type:"disable",
+ month_type: "disable",
+ hasLogin: false
+ },
+ onLoad: function(options) {
+ },
+ onReady: function() {
+ // 页面渲染完成
+ },
+ onShow: function() {
+ // 页面显示
+ //获取用户的登录信息
+ if (app.globalData.hasLogin) {
+ let userInfo = wx.getStorageSync('userInfo');
+ this.setData({
+ userInfo: userInfo,
+ hasLogin: true
+ });
+
+ let that = this;
+ util.request(api.BrokerageMain).then(function (res) {
+ if (res.errno === 0) {
+ that.setData({
+ totalAmount: res.data.totalAmount,
+ remainAmount: res.data.remainAmount,
+ lastMonthSettleMoney: res.data.lastMonthSettleMoney,
+ currMonthSettleMoney: res.data.currMonthSettleMoney,
+ currType: res.data.todayData,
+ todayData: res.data.todayData,
+ yestodayData: res.data.yestodayData,
+ weekData: res.data.weekData,
+ monthData: res.data.monthData,
+ });
+ }
+ });
+ }
+ },
+ onHide: function() {
+ // 页面隐藏
+
+ },
+ onUnload: function() {
+ // 页面关闭
+
+ },
+ switchTabType:function(e){
+ var type = e.currentTarget.dataset.type;
+ var currType;
+ var today_type = "disable";
+ var yestoday_type = "disable";
+ var week_type = "disable";
+ var month_type = "disable";
+ if (type == 1){
+ currType = this.data.todayData;
+ today_type = "active";
+ } else if (type == 2) {
+ currType = this.data.yestodayData;
+ yestoday_type = "active";
+ } else if (type == 3) {
+ currType = this.data.weekData;
+ week_type = "active";
+ } else if (type == 4) {
+ currType = this.data.monthData;
+ month_type = "active";
+ }
+ this.setData({
+ currType: currType,
+ today_type: today_type,
+ yestoday_type: yestoday_type,
+ week_type: week_type,
+ month_type: month_type
+ })
+ },
+ goOrderList: function () {
+ if (this.data.hasLogin) {
+ wx.navigateTo({
+ url: "/pages/brokerage/order/order"
+ });
+ } else {
+ wx.navigateTo({
+ url: "/pages/auth/login/login"
+ });
+ }
+ },
+ goExtract: function () {
+ if (this.data.hasLogin) {
+ wx.navigateTo({
+ url: "/pages/brokerage/record/record"
+ });
+ } else {
+ wx.navigateTo({
+ url: "/pages/auth/login/login"
+ });
+ }
+ },
+ extractMoney: function () {
+ if (this.data.hasLogin) {
+ if (this.data.remainAmount >= 1){
+ wx.navigateTo({
+ url: "/pages/brokerage/withdrawal/withdrawal?remainAmount=" + this.data.remainAmount
+ });
+ } else {
+ wx.showModal({
+ title: '提示',
+ content: '您的可提现金额小于1元,暂时无法申请提现!',
+ showCancel:false,
+ success (res) {
+ //暂时不做处理
+ }
+ });
+ }
+ } else {
+ wx.navigateTo({
+ url: "/pages/auth/login/login"
+ });
+ }
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/brokerage/main/main.json b/wx-mini-program/pages/brokerage/main/main.json
new file mode 100644
index 0000000..13cabac
--- /dev/null
+++ b/wx-mini-program/pages/brokerage/main/main.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "佣金收益",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/brokerage/main/main.wxml b/wx-mini-program/pages/brokerage/main/main.wxml
new file mode 100644
index 0000000..ae9a752
--- /dev/null
+++ b/wx-mini-program/pages/brokerage/main/main.wxml
@@ -0,0 +1,82 @@
+
+
+
+ 可提现余额
+
+
+ ¥ {{remainAmount}}
+
+ 提现申请
+
+
+
+
+
+
+
+ 我的提现记录
+
+
+
+
+
+ 本月收益
+ ¥ {{currMonthSettleMoney}}
+
+
+ 上月收益
+ ¥ {{lastMonthSettleMoney}}
+
+
+
+
+
+
+
+
+
+ 推广订单明细
+
+
+
+
+
+
+
+
+
+
+
+
+ 推广用户数
+ {{currType.userCnt}} 个
+
+
+ 推广订单数
+ {{currType.orderCnt}} 笔
+
+
+
+
+
+ 预估收益
+ {{currType.orderSettleAmt}} 元
+
+
+ 预估结算收益
+ {{currType.finalSettleAmt}} 元
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/brokerage/main/main.wxss b/wx-mini-program/pages/brokerage/main/main.wxss
new file mode 100644
index 0000000..04ef015
--- /dev/null
+++ b/wx-mini-program/pages/brokerage/main/main.wxss
@@ -0,0 +1,294 @@
+.container {
+ margin-bottom: 100rpx;
+ width: 750rpx;
+ height: auto;
+ overflow: hidden;
+}
+
+.container .h {
+ position: relative;
+ height: 145.5rpx;
+ width: 750rpx;
+ padding: 56.25rpx 0;
+ background: #fff;
+ text-align: center;
+}
+.container .h .line {
+ display: inline-block;
+ position: absolute;
+ top: 72rpx;
+ left: 0;
+ z-index: 2;
+ height: 1px;
+ margin-left: 125rpx;
+ width: 500rpx;
+ background: #ccc;
+}
+
+.container .h .title {
+ display: inline-block;
+ position: absolute;
+ top: 56.125rpx;
+ left: 0;
+ z-index: 3;
+ height: 33rpx;
+ margin-left: 285rpx;
+ width: 180rpx;
+ background: #fff;
+}
+
+.container .b {
+ width: 750rpx;
+ height: auto;
+ overflow: hidden;
+ padding: 0rpx 30rpx;
+ background: #fff;
+}
+
+.container .number {
+ height: auto;
+ overflow: hidden;
+ padding-bottom: 25rpx;
+ text-align: center;
+ font-size: 88rpx;
+ color:#e62222;
+}
+
+.extractBtnss {
+ width: 60%;
+ height: 80rpx;
+ margin-top: 20rpx;
+ background-color:#85c43f;
+ border-radius: 98rpx;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: center;
+ margin-bottom: 40rpx;
+}
+
+.extractBtn{background-color:#85c43f;font-size:32rpx;color:#fff;width:560rpx;height:90rpx;border-radius:50rpx;text-align:center;line-height:90rpx;margin:36rpx auto 40rpx auto;}
+
+.extractBtn .btxt{
+ color: #fff;
+ font-size: 42rpx;
+}
+
+.btn::after {
+ border-radius: 98rpx;
+ border: 0;
+}
+
+.user_area {
+ width: 100%;
+ height: 246rpx;
+ margin-top: 5rpx;
+ background: #fff;
+ border-top: 8rpx solid #f4f4f4;
+}
+
+.user_row {
+ /* border: 1px solid black; */
+ height: 86rpx;
+ line-height: 86rpx;
+ border-bottom: 1px solid #eaeaea;
+}
+
+.user_row_left {
+ /* border: 1px solid #757575; */
+ float: left;
+ height: 86rpx;
+ line-height: 86rpx;
+ margin-left: 35rpx;
+ letter-spacing: 1rpx;
+}
+
+.user_row_right {
+ /* border: 1px solid #757575; */
+ float: right;
+ height: 40rpx;
+ width: 40rpx;
+ font-weight: 550;
+ line-height: 86rpx;
+ margin-right: 30rpx;
+}
+
+.user_column {
+ /* border: 1px solid black; */
+ height: 190rpx;
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+ margin-right: 30rpx;
+ line-height: 190rpx;
+ padding-bottom: 40rpx;
+ margin-bottom: 40rpx;
+}
+
+
+.item_left {
+ padding-top: 12rpx;
+ height: 115rpx;
+ width:50%;
+ float: left;
+ text-align: center;
+ position: relative;
+ border-right: 1rpx solid #eaeaea;
+}
+
+.item_rigth {
+ padding-top: 12rpx;
+ height: 115rpx;
+ width:50%;
+ text-align: center;
+ position: relative;
+ float: right;
+}
+
+ .user_column .name {
+ display: block;
+ height: 45rpx;
+ line-height: 45rpx;
+ color: #999;
+ font-size: 32.5rpx;
+ margin-bottom: 15rpx;
+}
+
+.user_column .money {
+ display: block;
+ height: 30rpx;
+ text-align:center;
+ line-height: 30rpx;
+ margin-bottom: 10rpx;
+ color: #333;
+ font-size: 32rpx;
+}
+
+.order_area {
+ width: 100%;
+ height: 520rpx;
+ margin-top: 5rpx;
+ background: #fff;
+ border-top: 8rpx solid #f4f4f4;
+}
+
+.chose_type{
+ height: 80rpx;
+ line-height: 80rpx;
+ margin: 40rpx;
+}
+
+.chose-p{
+ line-height: 40rpx;
+ width: 100%;
+ height:40rpx;
+}
+
+.btn_left{
+ line-height: 60rpx;
+ height:60rpx;
+ width: 24%;
+ text-align: center;
+ float: left;
+ align-items: center;
+}
+
+.active{
+ background-color: #85c43f;
+}
+.active text{
+ color:#fff;
+}
+.disable{
+ background-color: #FFF;
+}
+.disable text{
+ color:#999;
+}
+.btn_center{
+ line-height: 60rpx;
+ height:60rpx;
+ width: 25%;
+ text-align: center;
+ float: left;
+ border-radius: 0;
+ align-items: center;
+}
+
+.btn_rigth {
+ line-height: 60rpx;
+ height:60rpx;
+ width: 25%;
+ text-align: center;
+ float: left;
+ align-items: center;
+}
+
+.order_area button{
+ border-radius: 0;
+ border: 1rpx solid #eaeaea;
+ margin-right: -1rpx;
+}
+.order_area button::after {
+ border-radius: 0;
+}
+button.btn_left {
+ border-radius: 0;
+ border-top-left-radius: 98rpx;
+ border-bottom-left-radius: 98rpx;
+}
+button.btn_left::after{
+ border-radius: 0;
+ border-top-left-radius: 98rpx;
+ border-bottom-left-radius: 98rpx;
+}
+
+button.btn_rigth{
+ border-radius: 0;
+ border-top-right-radius: 98rpx;
+ border-bottom-right-radius: 98rpx;
+}
+button.btn_rigth::after{
+ border-radius: 0;
+ border-top-right-radius: 98rpx;
+ border-bottom-right-radius: 98rpx;
+}
+
+.order_column {
+ height: 120rpx;
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+ margin-right: 30rpx;
+ line-height: 100rpx;
+ padding-bottom: 20rpx;
+ margin-bottom: 20rpx;
+}
+
+.order_column_item {
+ width: 50%;
+ height: 100rpx;
+ background: #fff;
+ text-align: center;
+ position: relative;
+}
+
+.order_column_item .info {
+ display: block;
+ height: 45rpx;
+ line-height: 45rpx;
+ color: #999;
+ font-size: 30.5rpx;
+ margin-bottom: 15rpx;
+}
+
+.order_column_item .value {
+ display: block;
+ height: 30rpx;
+ line-height: 30rpx;
+ margin-bottom: 10rpx;
+ color: #000;
+ font-size: 34rpx;
+}
diff --git a/wx-mini-program/pages/brokerage/order/order.js b/wx-mini-program/pages/brokerage/order/order.js
new file mode 100644
index 0000000..ac94998
--- /dev/null
+++ b/wx-mini-program/pages/brokerage/order/order.js
@@ -0,0 +1,79 @@
+var util = require('../../../utils/util.js');
+var api = require('../../../config/api.js');
+
+Page({
+ data: {
+ orderList: [],
+ showType: 0,
+ page: 1,
+ size: 10,
+ totalPages: 1
+ },
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ let that = this
+ try {
+ var tab = wx.getStorageSync('tab');
+
+ this.setData({
+ showType: tab
+ });
+ } catch (e) {}
+
+ },
+ getOrderList() {
+ let that = this;
+ util.request(api.SettleOrderList, {
+ showType: that.data.showType,
+ page: that.data.page,
+ size: that.data.size
+ }).then(function(res) {
+ if (res.errno === 0) {
+ console.log(res.data);
+ that.setData({
+ orderList: that.data.orderList.concat(res.data.data),
+ totalPages: res.data.totalPages
+ });
+ }
+ });
+ },
+ onReachBottom() {
+ if (this.data.totalPages > this.data.page) {
+ this.setData({
+ page: this.data.page + 1
+ });
+ this.getOrderList();
+ } else {
+ wx.showToast({
+ title: '没有更多订单了',
+ icon: 'none',
+ duration: 2000
+ });
+ return false;
+ }
+ },
+ switchTab: function(event) {
+ let showType = event.currentTarget.dataset.index;
+ this.setData({
+ orderList: [],
+ showType: showType,
+ page: 1,
+ size: 10,
+ totalPages: 1
+ });
+ this.getOrderList();
+ },
+ onReady: function() {
+ // 页面渲染完成
+ },
+ onShow: function() {
+ // 页面显示
+ this.getOrderList();
+ },
+ onHide: function() {
+ // 页面隐藏
+ },
+ onUnload: function() {
+ // 页面关闭
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/brokerage/order/order.json b/wx-mini-program/pages/brokerage/order/order.json
new file mode 100644
index 0000000..10e3252
--- /dev/null
+++ b/wx-mini-program/pages/brokerage/order/order.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "我的推广订单",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/brokerage/order/order.wxml b/wx-mini-program/pages/brokerage/order/order.wxml
new file mode 100644
index 0000000..fb189b8
--- /dev/null
+++ b/wx-mini-program/pages/brokerage/order/order.wxml
@@ -0,0 +1,46 @@
+
+
+
+ 所有订单
+
+
+ 有效订单
+
+
+ 失效订单
+
+
+ 已结算单
+
+
+ 待结算单
+
+
+
+
+
+ 还没有任何订单呢
+
+
+
+
+
+
+ 订单编号:{{item.orderSn}}
+ {{item.orderStatusText}}
+
+
+
+
+
+
+ {{gitem.goodsName}}
+
+
+
+
+ 实付:¥{{item.actualPrice}}
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/brokerage/order/order.wxss b/wx-mini-program/pages/brokerage/order/order.wxss
new file mode 100644
index 0000000..08595ec
--- /dev/null
+++ b/wx-mini-program/pages/brokerage/order/order.wxss
@@ -0,0 +1,181 @@
+page {
+ height: 100%;
+ width: 100%;
+ background: #f4f4f4;
+}
+
+.orders-switch {
+ width: 100%;
+ background: #fff;
+ height: 84rpx;
+ /* border-bottom: 1px solid rgba(0,0,0,.15); */
+}
+
+.orders-switch .item {
+ display: inline-block;
+ height: 82rpx;
+ width: 18%;
+ padding: 0 15rpx;
+ text-align: center;
+}
+
+.orders-switch .item .txt {
+ display: inline-block;
+ height: 82rpx;
+ padding: 0 20rpx;
+ line-height: 82rpx;
+ color: #9a9ba1;
+ font-size: 30rpx;
+ margin-left: 10rp;
+ margin-right: 10rpx;
+ width: 160rpx;
+}
+
+.orders-switch .item.active .txt {
+ color: #85c43f;
+ border-bottom: 3rpx solid #85c43f;
+}
+
+.no-order {
+ width: 100%;
+ height: auto;
+ margin: 0 auto;
+}
+
+.no-order .c {
+ width: 100%;
+ height: auto;
+ margin-top: 200rpx;
+}
+
+.no-order .c image {
+ margin: 0 auto;
+ display: block;
+ text-align: center;
+ width: 258rpx;
+ height: 258rpx;
+}
+
+.no-order .c text {
+ margin: 0 auto;
+ display: block;
+ width: 258rpx;
+ height: 29rpx;
+ line-height: 29rpx;
+ text-align: center;
+ font-size: 29rpx;
+ color: #999;
+}
+
+.orders {
+ height: auto;
+ width: 100%;
+ overflow: hidden;
+}
+
+.order {
+ margin-top: 20rpx;
+ background: #fff;
+}
+
+.order .h {
+ height: 83.3rpx;
+ line-height: 83.3rpx;
+ margin-left: 31.25rpx;
+ padding-right: 31.25rpx;
+ border-bottom: 1px solid #f4f4f4;
+ font-size: 30rpx;
+ color: #333;
+}
+
+.order .h .l {
+ float: left;
+}
+
+.order .h .r {
+ float: right;
+ color: #b4282d;
+ font-size: 24rpx;
+}
+
+.order .goods {
+ display: flex;
+ align-items: center;
+ height: 199rpx;
+ margin-left: 31.25rpx;
+}
+
+.order .goods .img {
+ height: 145.83rpx;
+ width: 145.83rpx;
+ background: #f4f4f4;
+}
+
+.order .goods .img image {
+ height: 145.83rpx;
+ width: 145.83rpx;
+}
+
+.order .goods .info {
+ height: 145.83rpx;
+ flex: 1;
+ padding-left: 20rpx;
+}
+
+.order .goods .name {
+ margin-top: 30rpx;
+ display: block;
+ height: 44rpx;
+ line-height: 44rpx;
+ color: #333;
+ font-size: 30rpx;
+}
+
+.order .goods .number {
+ display: block;
+ height: 37rpx;
+ line-height: 37rpx;
+ color: #666;
+ font-size: 25rpx;
+}
+
+.order .goods .status {
+ width: 105rpx;
+ color: #b4282d;
+ font-size: 25rpx;
+}
+
+.order .b {
+ height: 103rpx;
+ line-height: 103rpx;
+ margin-left: 31.25rpx;
+ padding-right: 31.25rpx;
+ border-top: 1px solid #f4f4f4;
+ font-size: 30rpx;
+ color: #333;
+}
+
+.order .b .l {
+ float: left;
+}
+
+.order .b .r {
+ float: right;
+}
+
+.order .b .btn {
+ margin-top: 19rpx;
+ height: 64.5rpx;
+ line-height: 64.5rpx;
+ text-align: center;
+ padding: 0 20rpx;
+ border-radius: 5rpx;
+ font-size: 28rpx;
+ color: #fff;
+ background: #b4282d;
+}
+
+.price{
+ font-size: 28rpx;
+ color: #b4282d;
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/brokerage/record/record.js b/wx-mini-program/pages/brokerage/record/record.js
new file mode 100644
index 0000000..5571bb7
--- /dev/null
+++ b/wx-mini-program/pages/brokerage/record/record.js
@@ -0,0 +1,44 @@
+var util = require('../../../utils/util.js');
+var api = require('../../../config/api.js');
+var app = getApp();
+
+Page({
+ data: {
+ accountTraceList: [],
+ page: 1,
+ size: 10,
+ totalPages: 1
+ },
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ },
+ onReady: function() {
+ // 页面渲染完成
+ },
+ onShow: function() {
+ // 页面显示
+ this.getRecordList();
+ },
+ getRecordList() {
+ let that = this;
+ util.request(api.ExtractList, {
+ page: that.data.page,
+ size: that.data.size
+ }).then(function (res) {
+ if (res.errno === 0) {
+ console.log(res.data);
+ that.setData({
+ accountTraceList: res.data.accountTraceList,
+ totalPages: res.data.totalPages
+ });
+ }
+ });
+ },
+
+ onHide: function() {
+ // 页面隐藏
+ },
+ onUnload: function() {
+ // 页面关闭
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/brokerage/record/record.json b/wx-mini-program/pages/brokerage/record/record.json
new file mode 100644
index 0000000..9b65745
--- /dev/null
+++ b/wx-mini-program/pages/brokerage/record/record.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "我的提现记录",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/brokerage/record/record.wxml b/wx-mini-program/pages/brokerage/record/record.wxml
new file mode 100644
index 0000000..b42cf33
--- /dev/null
+++ b/wx-mini-program/pages/brokerage/record/record.wxml
@@ -0,0 +1,24 @@
+
+
+
+
+ {{item.amount}}
+ 提现中
+ 已提现
+ 月结
+
+
+ {{item.mobile}}
+ 系统
+ 时间:{{item.traceTime}}
+
+
+ 余额:{{item.remainAmount}}
+
+
+
+
+
+ 您尚未有提现记录,努力加油推广吧!
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/brokerage/record/record.wxss b/wx-mini-program/pages/brokerage/record/record.wxss
new file mode 100644
index 0000000..79470e2
--- /dev/null
+++ b/wx-mini-program/pages/brokerage/record/record.wxss
@@ -0,0 +1,139 @@
+page {
+ height: 100%;
+ width: 100%;
+ background: #f4f4f4;
+}
+
+.container {
+ height: 100%;
+ width: 100%;
+}
+
+.address-list {
+ padding-left: 31.25rpx;
+ background: #fff;
+ background-size: auto 10.5rpx;
+ margin-bottom: 90rpx;
+}
+
+.address-list .item {
+ height: 156.55rpx;
+ align-items: center;
+ display: flex;
+ border-bottom: 1rpx solid #dcd9d9;
+}
+
+.address-list .l {
+ width: 155rpx;
+ height: 80rpx;
+ overflow: hidden;
+}
+
+.address-list .name {
+ width: 155rpx;
+ height: 43rpx;
+ font-size: 29rpx;
+ color: #333;
+ margin-bottom: 5.2rpx;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+}
+
+.address-list .default {
+ width: 82.5rpx;
+ height: 33rpx;
+ line-height: 28rpx;
+ text-align: center;
+ font-size: 20rpx;
+ color: #b4282d;
+ border: 1rpx solid #b4282d;
+ visibility: visible;
+}
+
+.address-list .c {
+ flex: 1;
+ height: auto;
+ overflow: hidden;
+}
+
+.address-list .mobile {
+ height: 29rpx;
+ font-size: 29rpx;
+ line-height: 29rpx;
+ overflow: hidden;
+ color: #333;
+ margin-bottom: 6.25rpx;
+}
+
+.address-list .address {
+ height: 37rpx;
+ font-size: 25rpx;
+ line-height: 37rpx;
+ overflow: hidden;
+ color: #666;
+}
+
+.address-list .r {
+ width: 252rpx;
+ height: auto;
+ overflow: hidden;
+ margin-right: 16.5rpx;
+}
+
+.address-list .del {
+ display: block;
+ width: 252rpx;
+ height: 52rpx;
+ padding-left: 40rpx;
+}
+
+.add-address {
+ border: none;
+ right: 0;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 90%;
+ height: 90rpx;
+ line-height: 98rpx;
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ border-radius: 0;
+ padding: 0;
+ margin: 0;
+ margin-left: 5%;
+ text-align: center;
+ /* padding-left: -5rpx; */
+ font-size: 25rpx;
+ color: #f4f4f4;
+ border-top-left-radius: 50rpx;
+ border-bottom-left-radius: 50rpx;
+ border-top-right-radius: 50rpx;
+ border-bottom-right-radius: 50rpx;
+ letter-spacing: 3rpx;
+ background-image: linear-gradient(to right, #9a9ba1 0%, #9a9ba1 100%);
+}
+
+.empty-view {
+ height: 100%;
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+
+.empty-view .icon {
+ height: 248rpx;
+ width: 258rpx;
+ margin-bottom: 10rpx;
+}
+
+.empty-view .text {
+ width: auto;
+ font-size: 28rpx;
+ line-height: 35rpx;
+ color: #999;
+}
diff --git a/wx-mini-program/pages/brokerage/withdrawal/withdrawal.js b/wx-mini-program/pages/brokerage/withdrawal/withdrawal.js
new file mode 100644
index 0000000..9836cae
--- /dev/null
+++ b/wx-mini-program/pages/brokerage/withdrawal/withdrawal.js
@@ -0,0 +1,124 @@
+var api = require('../../../config/api.js');
+var check = require('../../../utils/check.js');
+
+var app = getApp();
+Page({
+ data: {
+ amt: '0.00',
+ mobile: '',
+ code: ''
+ },
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ let userInfo = wx.getStorageSync('userInfo');
+ this.setData({
+ amt: options.remainAmount,
+ mobile:userInfo.phone
+ });
+ // 页面渲染完成
+
+ },
+ onReady: function() {
+
+ },
+ onShow: function() {
+ // 页面显示
+
+ },
+ onHide: function() {
+ // 页面隐藏
+
+ },
+ onUnload: function() {
+ // 页面关闭
+
+ },
+ sendCode: function() {
+ let that = this;
+
+ if (this.data.mobile.length == 0) {
+ wx.showModal({
+ title: '错误信息',
+ content: '手机号不能为空',
+ showCancel: false
+ });
+ return false;
+ }
+
+ if (!check.isValidPhone(this.data.mobile)) {
+ wx.showModal({
+ title: '错误信息',
+ content: '手机号输入不正确',
+ showCancel: false
+ });
+ return false;
+ }
+
+ wx.request({
+ url: api.AuthRegisterCaptcha,
+ data: {
+ mobile: that.data.mobile
+ },
+ method: 'POST',
+ header: {
+ 'content-type': 'application/json'
+ },
+ success: function(res) {
+ if (res.data.errno == 0) {
+ wx.showModal({
+ title: '发送成功',
+ content: '验证码已发送',
+ showCancel: false
+ });
+ } else {
+ wx.showModal({
+ title: '错误信息',
+ content: res.data.errmsg,
+ showCancel: false
+ });
+ }
+ }
+ });
+ },
+ goWithdrawal: function() {
+ var that = this;
+ if (this.data.mobile.length == 0 || this.data.code.length == 0) {
+ wx.showModal({
+ title: '错误信息',
+ content: '手机号和验证码不能为空',
+ showCancel: false
+ });
+ return false;
+ }
+
+ if (!check.isValidPhone(this.data.mobile)) {
+ wx.showModal({
+ title: '错误信息',
+ content: '手机号输入不正确',
+ showCancel: false
+ });
+ return false;
+ }
+ //调用后台申请提现接口
+
+ },
+ bindMobileInput: function(e) {
+ this.setData({
+ mobile: e.detail.value
+ });
+ },
+ bindCodeInput: function(e) {
+ this.setData({
+ code: e.detail.value
+ });
+ },
+ clearInput: function(e) {
+ switch (e.currentTarget.id) {
+ case 'clear-code':
+ this.setData({
+ code: ''
+ });
+ break;
+ }
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/brokerage/withdrawal/withdrawal.json b/wx-mini-program/pages/brokerage/withdrawal/withdrawal.json
new file mode 100644
index 0000000..8b55760
--- /dev/null
+++ b/wx-mini-program/pages/brokerage/withdrawal/withdrawal.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "提现",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/brokerage/withdrawal/withdrawal.wxml b/wx-mini-program/pages/brokerage/withdrawal/withdrawal.wxml
new file mode 100644
index 0000000..9d138db
--- /dev/null
+++ b/wx-mini-program/pages/brokerage/withdrawal/withdrawal.wxml
@@ -0,0 +1,22 @@
+
+
+
+ 提现金额:{{amt}} 元
+
+
+ 绑定手机号:{{mobile}}
+ 请去设置页面绑定手机
+
+
+
+
+
+
+
+ 获取验证码
+
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/brokerage/withdrawal/withdrawal.wxss b/wx-mini-program/pages/brokerage/withdrawal/withdrawal.wxss
new file mode 100644
index 0000000..c6722ea
--- /dev/null
+++ b/wx-mini-program/pages/brokerage/withdrawal/withdrawal.wxss
@@ -0,0 +1,68 @@
+.form-box {
+ width: 100%;
+ height: auto;
+ overflow: hidden;
+ padding: 0 40rpx;
+ background: #fff;
+}
+
+.form-item {
+ position: relative;
+ background: #fff;
+ height: 96rpx;
+ border-bottom: 1px solid #d9d9d9;
+}
+
+.form-item .amt, .form-item .mobile, .form-item .code {
+ position: absolute;
+ top: 26rpx;
+ left: 0;
+ display: block;
+ width: 100%;
+ height: 44rpx;
+ background: #fff;
+ color: #333;
+ font-size: 30rpx;
+}
+
+.form-item-code {
+ margin-top: 32rpx;
+ height: auto;
+ overflow: hidden;
+ width: 100%;
+}
+
+.form-item-code .form-item {
+ float: left;
+ width: 350rpx;
+}
+
+.form-item-code .code-btn {
+ float: right;
+ padding: 20rpx 40rpx;
+ border: 1px solid #d9d9d9;
+ border-radius: 10rpx;
+ color: #fff;
+ background: green;
+}
+
+.form-item .clear {
+ position: absolute;
+ top: 26rpx;
+ right: 18rpx;
+ z-index: 2;
+ display: block;
+ background: #fff;
+ height: 44rpx;
+ width: 44rpx;
+}
+
+.register-btn {
+ margin: 60rpx 0 40rpx 0;
+ height: 96rpx;
+ line-height: 96rpx;
+ color: #fff;
+ font-size: 30rpx;
+ width: 100%;
+ border-radius: 6rpx;
+}
diff --git a/wx-mini-program/pages/cart/cart.js b/wx-mini-program/pages/cart/cart.js
new file mode 100644
index 0000000..902a363
--- /dev/null
+++ b/wx-mini-program/pages/cart/cart.js
@@ -0,0 +1,530 @@
+var util = require('../../utils/util.js');
+var api = require('../../config/api.js');
+var user = require('../../utils/user.js');
+
+var app = getApp();
+
+Page({
+ data: {
+ isMultiOrderModel:0,
+ cartGoods: [],
+ brandCartgoods:[],
+ cartTotal: {
+ "goodsCount": 0,
+ "goodsAmount": 0.00,
+ "checkedGoodsCount": 0,
+ "checkedGoodsAmount": 0.00
+ },
+ isEditCart: false,
+ checkedAllStatus: true,
+ editCartList: [],
+ hasLogin: false
+ },
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ },
+ onReady: function() {
+ // 页面渲染完成
+ },
+ onPullDownRefresh() {
+ wx.showNavigationBarLoading() //在标题栏中显示加载
+ this.getCartList();
+ wx.hideNavigationBarLoading() //完成停止加载
+ wx.stopPullDownRefresh() //停止下拉刷新
+ },
+ onShow: function() {
+ // 页面显示
+ if (app.globalData.hasLogin) {
+ this.getCartList();
+ }
+
+ this.setData({
+ hasLogin: app.globalData.hasLogin
+ });
+
+ },
+ onHide: function() {
+ // 页面隐藏
+ },
+ onUnload: function() {
+ // 页面关闭
+ },
+ goLogin() {
+ wx.navigateTo({
+ url: "/pages/auth/login/login"
+ });
+ },
+ getCartList: function() {
+ let that = this;
+ util.request(api.CartList).then(function(res) {
+ if (res.errno === 0) {
+ if (res.data.isMultiOrderModel === 1){
+ that.setData({
+ isMultiOrderModel: res.data.isMultiOrderModel,
+ brandCartgoods: res.data.brandCartgoods,
+ cartTotal: res.data.cartTotal
+ });
+ } else {
+ that.setData({
+ isMultiOrderModel: res.data.isMultiOrderModel,
+ cartGoods: res.data.cartList,
+ cartTotal: res.data.cartTotal
+ });
+ }
+
+ that.setData({
+ checkedAllStatus: that.isCheckedAll()
+ });
+ }
+ });
+ },
+ isChildCheckedAll: function (cartList){
+ return cartList.every(function (element, index, array) {
+ if (element.checked == true) {
+ return true;
+ } else {
+ return false;
+ }
+ });
+ },
+ isCheckedAll: function() {
+ let that = this;
+ if (that.data.isMultiOrderModel === 1){
+ //多店铺模式的商品全选判断
+ return that.data.brandCartgoods.every(function (element, index, array) {
+ if (that.isChildCheckedAll(element.cartList)){
+ return true;
+ } else {
+ return false;
+ }
+ });
+ } else {
+ //判断购物车商品已全选
+ return that.data.cartGoods.every(function (element, index, array) {
+ if (element.checked == true) {
+ return true;
+ } else {
+ return false;
+ }
+ });
+ }
+ },
+ doCheckedAll: function() {
+ let checkedAll = this.isCheckedAll()
+ this.setData({
+ checkedAllStatus: this.isCheckedAll()
+ });
+ },
+ getProductChecked:function(productId){
+ let that = this;
+ let isChecked = null;
+ if (that.data.isMultiOrderModel === 1) {
+ that.data.brandCartgoods.forEach(function (v) {
+ let cartList = v.cartList;
+ cartList.forEach(function(o){
+ if (o.productId === productId) {
+ isChecked = o.checked ? 0 : 1;
+ }
+ });
+ });
+ } else {
+ that.data.cartGoods.forEach(function(o){
+ if (o.productId === productId) {
+ isChecked = o.checked ? 0 : 1;
+ }
+ });
+ }
+ return isChecked;
+ },
+ checkedItem: function(event) {
+ //let itemIndex = event.target.dataset.itemIndex;
+ let productId = event.currentTarget.dataset.productid;
+ let that = this;
+
+ let productIds = [];
+ productIds.push(productId);
+ let isChecked = that.getProductChecked(productId);
+ if (!this.data.isEditCart) {
+ util.request(api.CartChecked, {
+ productIds: productIds,
+ isChecked: isChecked
+ }, 'POST').then(function(res) {
+ if (res.errno === 0) {
+ if (res.data.isMultiOrderModel === 1) {
+ that.setData({
+ isMultiOrderModel: res.data.isMultiOrderModel,
+ brandCartgoods: res.data.brandCartgoods,
+ cartTotal: res.data.cartTotal
+ });
+ } else {
+ that.setData({
+ isMultiOrderModel: res.data.isMultiOrderModel,
+ cartGoods: res.data.cartList,
+ cartTotal: res.data.cartTotal
+ });
+ }
+ }
+
+ that.setData({
+ checkedAllStatus: that.isCheckedAll()
+ });
+ });
+ } else {
+ //编辑状态
+ if (that.data.isMultiOrderModel === 1) {
+ let tmpBrandCartData = this.data.brandCartgoods.map(function (element, index, array) {
+ let tmpBrandGoods = element.cartList.map(function (childEle,childIndex,childArr){
+ if (childEle.productId === productId) {
+ childEle.checked = !childEle.checked;
+ }
+ return childEle;
+ });
+ element.cartList = tmpBrandGoods;
+ return element;
+ });
+
+ that.setData({
+ brandCartgoods: tmpBrandCartData,
+ checkedAllStatus: that.isCheckedAll(),
+ 'cartTotal.checkedGoodsCount': that.getCheckedGoodsCount()
+ });
+ } else {
+ let tmpCartData = this.data.cartGoods.map(function (element, index, array) {
+ if (element.productId === productId) {
+ element.checked = !element.checked;
+ }
+ return element;
+ });
+
+ that.setData({
+ cartGoods: tmpCartData,
+ checkedAllStatus: that.isCheckedAll(),
+ 'cartTotal.checkedGoodsCount': that.getCheckedGoodsCount()
+ });
+ }
+ }
+ },
+ getCheckedGoodsCount: function() {
+ let that = this;
+ let checkedGoodsCount = 0;
+ if (that.data.isMultiOrderModel === 1) {
+ that.data.brandCartgoods.forEach(function (v) {
+ v.cartList.forEach(function (o){
+ if (o.checked === true) {
+ checkedGoodsCount += o.number;
+ }
+ });
+ });
+ } else {
+ that.data.cartGoods.forEach(function (v) {
+ if (v.checked === true) {
+ checkedGoodsCount += v.number;
+ }
+ });
+ }
+ console.log(checkedGoodsCount);
+ return checkedGoodsCount;
+ },
+ checkedAll: function() {
+ let that = this;
+ if (!this.data.isEditCart) {
+ let productIds = [];
+ if (that.data.isMultiOrderModel === 1) {
+ that.data.brandCartgoods.forEach(function (v) {
+ v.cartList.forEach(function (o) {
+ productIds.push(o.productId);
+ });
+ });
+ } else {
+ var productIds = that.data.cartGoods.map(function (v) {
+ return v.productId;
+ });
+ }
+
+ util.request(api.CartChecked, {
+ productIds: productIds,
+ isChecked: that.isCheckedAll() ? 0 : 1
+ }, 'POST').then(function(res) {
+ if (res.errno === 0) {
+ console.log(res.data);
+ if (res.data.isMultiOrderModel === 1) {
+ that.setData({
+ isMultiOrderModel: res.data.isMultiOrderModel,
+ brandCartgoods: res.data.brandCartgoods,
+ cartTotal: res.data.cartTotal
+ });
+ } else {
+ that.setData({
+ isMultiOrderModel: res.data.isMultiOrderModel,
+ cartGoods: res.data.cartList,
+ cartTotal: res.data.cartTotal
+ });
+ }
+ }
+ that.setData({
+ checkedAllStatus: that.isCheckedAll()
+ });
+ });
+ } else {
+ //编辑状态,将所有
+ let checkedAllStatus = that.isCheckedAll();
+
+ if (that.data.isMultiOrderModel === 1) {
+ let tmpBrandCartData = this.data.brandCartgoods.map(function (element, index, array) {
+ let tmpBrandGoods = element.cartList.map(function (childEle, childIndex, childArr) {
+ childEle.checked = !checkedAllStatus;
+ return childEle;
+ });
+ element.cartList = tmpBrandGoods;
+ return element;
+ });
+
+ that.setData({
+ brandCartgoods: tmpBrandCartData,
+ checkedAllStatus: that.isCheckedAll(),
+ 'cartTotal.checkedGoodsCount': that.getCheckedGoodsCount()
+ });
+ } else {
+ let tmpCartData = this.data.cartGoods.map(function (element, index, array) {
+ element.checked = !checkedAllStatus;
+ return element;
+ });
+
+ that.setData({
+ cartGoods: tmpCartData,
+ checkedAllStatus: that.isCheckedAll(),
+ 'cartTotal.checkedGoodsCount': that.getCheckedGoodsCount()
+ });
+ }
+ }
+ },
+ editCart: function() {
+ var that = this;
+ if (this.data.isEditCart) {
+ this.getCartList();
+ this.setData({
+ isEditCart: !this.data.isEditCart
+ });
+ } else {
+ //编辑状态
+ if (that.data.isMultiOrderModel === 1) {
+ let tmpBrandCartData = that.data.brandCartgoods.map(function (element, index, array) {
+ let tmpBrandGoods = element.cartList.map(function (childEle, childIndex, childArr) {
+ childEle.checked = false;
+ return childEle;
+ });
+ element.cartList = tmpBrandGoods;
+ return element;
+ });
+
+ that.setData({
+ brandCartgoods: tmpBrandCartData,
+ isEditCart: !that.data.isEditCart,
+ checkedAllStatus: that.isCheckedAll(),
+ 'cartTotal.checkedGoodsCount': that.getCheckedGoodsCount()
+ });
+ } else {
+ let tmpCartData = that.data.cartGoods.map(function (element, index, array) {
+ element.checked = false;
+ return element;
+ });
+
+ that.setData({
+ // editCartList: this.data.cartGoods,
+ cartGoods: tmpCartList,
+ isEditCart: !that.data.isEditCart,
+ checkedAllStatus: that.isCheckedAll(),
+ 'cartTotal.checkedGoodsCount': that.getCheckedGoodsCount()
+ });
+ }
+ }
+ },
+
+ updateCart: function(productId, goodsId, number, id) {
+ let that = this;
+
+ util.request(api.CartUpdate, {
+ productId: productId,
+ goodsId: goodsId,
+ number: number,
+ id: id
+ }, 'POST').then(function(res) {
+ that.setData({
+ checkedAllStatus: that.isCheckedAll()
+ });
+ });
+
+ },
+ getProductItem: function (productId){
+ let that = this;
+ let productItem = null;
+ if (that.data.isMultiOrderModel === 1) {
+ that.data.brandCartgoods.forEach(function (v) {
+ let cartList = v.cartList;
+ cartList.forEach(function (o) {
+ if (o.productId === productId) {
+ productItem = o;
+ }
+ });
+ });
+ } else {
+ that.data.cartGoods.forEach(function (o) {
+ if (o.productId === productId) {
+ productItem = o;
+ }
+ });
+ }
+ return productItem;
+ },
+ setProductItem: function (cartItem,productId){
+ let that = this;
+ if (that.data.isMultiOrderModel === 1) {
+ let tmpBrandCartData = this.data.brandCartgoods.map(function (element, index, array) {
+ let tmpBrandGoods = element.cartList.map(function (childEle, childIndex, childArr) {
+ if (childEle.productId === productId) {
+ return cartItem;
+ } else {
+ return childEle;
+ }
+ });
+ element.cartList = tmpBrandGoods;
+ return element;
+ });
+
+ that.setData({
+ brandCartgoods: tmpBrandCartData,
+ checkedAllStatus: that.isCheckedAll(),
+ 'cartTotal.checkedGoodsCount': that.getCheckedGoodsCount()
+ });
+ } else {
+ let tmpCartData = this.data.cartGoods.map(function (element, index, array) {
+ if (element.productId === productId) {
+ return cartItem;
+ } else {
+ return element;
+ }
+ });
+ that.setData({
+ cartGoods: tmpCartData,
+ checkedAllStatus: that.isCheckedAll(),
+ 'cartTotal.checkedGoodsCount': that.getCheckedGoodsCount()
+ });
+ }
+ },
+ cutNumber: function(event) {
+ //let itemIndex = event.target.dataset.itemIndex;
+ let productId = event.currentTarget.dataset.productid;
+ let cartItem = this.getProductItem(productId);
+ let number = (cartItem.number - 1 > 1) ? cartItem.number - 1 : 1;
+ cartItem.number = number;
+ this.setProductItem(cartItem, productId);
+ this.updateCart(cartItem.productId, cartItem.goodsId, number, cartItem.id);
+ },
+ addNumber: function(event) {
+ // let itemIndex = event.target.dataset.itemIndex;
+ let productId = event.currentTarget.dataset.productid;
+ let cartItem = this.getProductItem(productId);
+
+ let number = cartItem.number + 1;
+ cartItem.number = number;
+ this.setProductItem(cartItem, productId);
+ this.updateCart(cartItem.productId, cartItem.goodsId, number, cartItem.id);
+ },
+ checkoutOrder: function() {
+ //获取已选择的商品
+ let that = this;
+ /*var checkedGoods = this.data.cartGoods.filter(function(element, index, array) {
+ if (element.checked == true) {
+ return true;
+ } else {
+ return false;
+ }
+ });
+ if (checkedGoods.length <= 0) {
+ return false;
+ }*/
+
+ if(that.getCheckedGoodsCount() <= 0){
+ wx.showModal({
+ title: '错误信息',
+ content: '请勾选需要下单的商品!',
+ showCancel: false
+ });
+ return false;
+ }
+
+ // storage中设置了cartId,则是购物车购买
+ try {
+ wx.setStorageSync('cartId', 0);
+ wx.navigateTo({
+ url: '/pages/checkout/checkout'
+ })
+ } catch (e) {}
+
+ },
+ deleteCart: function() {
+ //获取已选择的商品
+ let that = this;
+ /*let productIds = this.data.cartGoods.filter(function(element, index, array) {
+ if (element.checked == true) {
+ return true;
+ } else {
+ return false;
+ }
+ });
+
+ if (productIds.length <= 0) {
+ return false;
+ }*/
+
+ if (that.getCheckedGoodsCount() <= 0) {
+ wx.showModal({
+ title: '错误信息',
+ content: '请勾选需要删除的商品!',
+ showCancel: false
+ });
+ return false;
+ }
+
+ let productIds = [];
+ if (that.data.isMultiOrderModel === 1) {
+ that.data.brandCartgoods.forEach(function (v) {
+ v.cartList.forEach(function (o) {
+ if (o.checked == true){
+ productIds.push(o.productId);
+ }
+ });
+ });
+ } else {
+ productIds = that.data.cartGoods.map(function (v) {
+ if (v.checked == true) {
+ return v.productId;
+ }
+ });
+ }
+
+ util.request(api.CartDelete, {
+ productIds: productIds
+ }, 'POST').then(function(res) {
+ if (res.errno === 0) {
+ if (res.data.isMultiOrderModel === 1) {
+ that.setData({
+ isMultiOrderModel: res.data.isMultiOrderModel,
+ brandCartgoods: res.data.brandCartgoods,
+ cartTotal: res.data.cartTotal
+ });
+ } else {
+ that.setData({
+ isMultiOrderModel: res.data.isMultiOrderModel,
+ cartGoods: res.data.cartList,
+ cartTotal: res.data.cartTotal
+ });
+ }
+
+ that.setData({
+ checkedAllStatus: that.isCheckedAll()
+ });
+ }
+ });
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/cart/cart.json b/wx-mini-program/pages/cart/cart.json
new file mode 100644
index 0000000..2c3ab45
--- /dev/null
+++ b/wx-mini-program/pages/cart/cart.json
@@ -0,0 +1,4 @@
+{
+ "backgroundColor": "#f4f4f4",
+ "navigationBarTitleText": "购物车"
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/cart/cart.wxml b/wx-mini-program/pages/cart/cart.wxml
new file mode 100644
index 0000000..1925c2b
--- /dev/null
+++ b/wx-mini-program/pages/cart/cart.wxml
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
+ 全场优惠券抵扣
+ 7天无忧快速退货
+ 满66元免邮费
+
+
+
+
+
+
+
+
+
+
+
+ {{bitem.brandName}} >
+
+
+
+
+
+
+
+ {{item.goodsName}}
+
+
+ ¥{{item.price}}
+ x{{item.number}}
+
+
+ -
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.goodsName}}
+ x{{item.number}}
+
+ {{ isEditCart ? '已选择:' : ''}}{{item.goodsSpecificationValues||''}}
+
+ ¥{{item.price}}
+
+ -
+
+ +
+
+
+
+
+
+
+
+
+
+
+ 全选({{cartTotal.checkedGoodsCount}})
+ {{!isEditCart ? '¥'+cartTotal.checkedGoodsAmount : ''}}
+
+ {{!isEditCart ? '编辑' : '完成'}}
+ 删除({{cartTotal.checkedGoodsCount}})
+ 下单
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/cart/cart.wxss b/wx-mini-program/pages/cart/cart.wxss
new file mode 100644
index 0000000..60bead9
--- /dev/null
+++ b/wx-mini-program/pages/cart/cart.wxss
@@ -0,0 +1,560 @@
+page {
+ height: 100%;
+ min-height: 100%;
+ background: #f4f4f4;
+}
+
+.container {
+ background: #f4f4f4;
+ width: 100%;
+ height: auto;
+ min-height: 100%;
+ overflow: hidden;
+}
+
+.service-policy {
+ width: 750rpx;
+ height: 73rpx;
+ background: #f4f4f4;
+ padding: 0 31.25rpx;
+ display: flex;
+ flex-flow: row nowrap;
+ align-items: center;
+ justify-content: space-between;
+}
+
+.service-policy .item {
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAM1BMVEWrKyurKyurKyurKyurKyurKyurKyurKyurKyurKyurKyurKyurKyurKyurKyurKyurKytnkgnjAAAAEHRSTlMAERJMTU5ub3Z3hL7y8/T5Yye+AQAAAEVJREFUCB0FwQkCgCAMwLAyJyrj6P9fawJkrVUXwFDVAZenR/RjUj4An8U0AMLJNADCRfkAvBbp6a31Y8JQ1QFw196V8AOmRAMI0B3h8wAAAABJRU5ErkJggg==') 0 center no-repeat;
+ background-size: 10rpx;
+ padding-left: 15rpx;
+ display: flex;
+ align-items: center;
+ font-size: 25rpx;
+ color: #666;
+}
+
+.no-login {
+ width: 100%;
+ height: auto;
+ margin: 0 auto;
+}
+
+.no-login .c {
+ width: 100%;
+ height: auto;
+ margin-top: 200rpx;
+}
+
+.no-login .c image {
+ margin: 0 auto;
+ display: block;
+ text-align: center;
+ width: 414rpx;
+ height: 336rpx;
+ margin-bottom: 100rpx;
+}
+
+.no-login .c text {
+ margin: 0 auto;
+ display: block;
+ width: 258rpx;
+ height: 59rpx;
+ line-height: 29rpx;
+ text-align: center;
+ font-size: 35rpx;
+ color: #999;
+}
+
+.no-login button {
+ width: 90%;
+ margin: 40 auto;
+ color: #fff;
+ font-size: 30rpx;
+ height: 96rpx;
+ line-height: 96rpx;
+ right: 0;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ position: flex;
+ bottom: 0;
+ left: 0;
+ border-radius: 0;
+ padding: 0;
+ margin-left: 5%;
+ text-align: center;
+ /* padding-left: -5rpx; */
+ border-top-left-radius: 50rpx;
+ border-bottom-left-radius: 50rpx;
+ border-top-right-radius: 50rpx;
+ border-bottom-right-radius: 50rpx;
+ letter-spacing: 3rpx;
+ background-image: linear-gradient(to right, #9a9ba1 0%, #9a9ba1 100%);
+}
+
+.no-cart {
+ width: 100%;
+ height: auto;
+ margin: 0 auto;
+}
+
+.no-cart .c {
+ width: 100%;
+ height: auto;
+ margin-top: 200rpx;
+}
+
+.no-cart .c image {
+ margin: 0 auto;
+ display: block;
+ text-align: center;
+ width: 414rpx;
+ height: 336rpx;
+}
+
+.no-cart .c text {
+ margin: 0 auto;
+ display: block;
+ width: 258rpx;
+ height: 29rpx;
+ line-height: 29rpx;
+ text-align: center;
+ font-size: 29rpx;
+ color: #999;
+}
+
+.cart-view {
+ width: 100%;
+ height: auto;
+ overflow: hidden;
+}
+
+.cart-view .list {
+ height: auto;
+ width: 100%;
+ overflow: hidden;
+ background: #f4f4f4;
+ margin-bottom: 120rpx;
+}
+
+.cart-view .group-item {
+ height: auto;
+ width: 100%;
+ margin-top:20rpx;
+ background: #f4f4f4;
+ margin-bottom: 18rpx;
+}
+
+.goods {
+ margin-top: 20rpx;
+ background: #fff;
+}
+
+.goods .h {
+ height: 83.3rpx;
+ line-height: 83.3rpx;
+ margin-left: 31.25rpx;
+ padding-right: 31.25rpx;
+ border-bottom: 1px solid #f4f4f4;
+ font-size: 30rpx;
+ color: #333;
+}
+
+.goods .h .l {
+ float: left;
+ font-weight:bold;
+}
+
+.cart-view .item {
+ height: 202rpx;
+ width: 100%;
+ overflow: hidden;
+}
+
+.cart-view .item .checkbox {
+ float: left;
+ height: 34rpx;
+ width: 34rpx;
+ margin: 65rpx 18rpx 65rpx 26rpx;
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAmCAMAAACf4xmcAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABCUExURUdwTMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzAV+Z0EAAAAVdFJOUwAJ+KUEFTPay2bzRXdZ7RkhmJ6qJOWhY+QAAAEDSURBVDjLnZTplsIgDIUNWwK2tdt9/1cdxHGmVcAc+dH25Hw0+71cvjhztDIZM4mNc4txo+BwZKxSVwbSFoMn8iFuCeDrG0RLNkc6GGK+ttCZ8gIzuJcgBgPxJ4rB4T2OkM0HjgRyq8V7Y8i/3/V06YVb/nKECa0qBYPffB1jaFd8AD8+RrBrY8R41FkQew2MkPtrR6IeRglzoW1/HrbizfZ9Pv8jCH0slOAm+D7mMeUn4PoYwegxpVNlCsqCKMurbJay9R8GyT0HSTmWeciTYsh7K+MPK1MW0H9eQOU652sqcch+15rUrFQXLpuFy7ksXLYuXDUZbBZ9v4sqiqju34jyD97JD4dkfgo1AAAAAElFTkSuQmCC') no-repeat;
+ background-size: 34rpx;
+}
+
+.cart-view .item .checkbox.checked {
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAmCAMAAACf4xmcAAAAQlBMVEUAAACrKyurKyurKyurKyurKyurKyurKyurKyurKyurKyurKyurKyurKyurKyvw19exOzv////z4uK1Q0Pt0dGxOjp+CNkCAAAADnRSTlMARVn7B9cVoc/jIWtnJIM++AMAAADUSURBVDjLndRLEoMgEEVRPyCg+FAh+99qYqmAabFL7/hMaKCrN/VWyRZopbJ9ETUaWbq5RLXBX6YmSChcpMRZdRKX6e6kDAqZzAmNYlpEpnCTimfEbfWmhLlnZp8qmLY5a47pVY0oNIWArfV+h5Jy88FsNg2q3JTNRLIK8sd4hTZnwfmzSuVsmRdPFGV+d1S18QjJUQUZB5IcVVBxvMlRBRsvKzmq0JOr9y58yNU/eEj8s3zyyPkvcyQk9wH57/xwOfCrhl9cNMGswdQ4HEt1GKsXfQHGSThPkNi75AAAAABJRU5ErkJggg==') no-repeat;
+ background-size: 34rpx;
+}
+
+.cart-view .item .cart-goods {
+ float: left;
+ height: 204rpx;
+ width: 672rpx;
+ border-bottom: 1px solid #f4f4f4;
+}
+
+.cart-view .item .img {
+ float: left;
+ height: 145.83rpx;
+ width: 145.83rpx;
+ background: #f4f4f4;
+ margin: 12.5rpx 18rpx 12.5rpx 0;
+}
+
+.cart-view .item .info {
+ flex: 1;
+ float: left;
+ height: 145.83rpx;
+ width: 453rpx;
+ margin: 15.5rpx 26rpx 15.5rpx 0;
+}
+
+.cart-view .item .t {
+ margin: 8rpx 0;
+ height: 80rpx;
+ font-size: 25rpx;
+ color: #333;
+}
+
+.cart-view .item .name {
+ /*height: 28rpx;
+ max-width: 310rpx;
+ line-height: 28rpx;
+ font-size: 25rpx;
+ color: #333;
+ overflow: hidden;*/
+ display: block;
+ float: left;
+ height: 33rpx;
+ line-height: 33rpx;
+ color: #333;
+ font-size: 30rpx;
+}
+
+.cart-view .item .num {
+ height: 28rpx;
+ line-height: 28rpx;
+ float: right;
+}
+
+.cart-view .item .attr {
+ margin-bottom: 17rpx;
+ height: 24rpx;
+ line-height: 24rpx;
+ font-size: 22rpx;
+ color: #666;
+ float: right;
+}
+
+.cart-view .item .b {
+ height: 28rpx;
+ line-height: 28rpx;
+ font-size: 25rpx;
+ color: #333;
+ overflow: hidden;
+}
+
+.cart-view .item .price {
+ float: left;
+}
+
+.cart-view .item .open {
+ height: 28rpx;
+ width: 150rpx;
+ display: block;
+ float: right;
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAUBAMAAABL3sEiAAAAGFBMVEVmZmZ6enp7e3uDg4OEhITHx8fu7u7///8ummCmAAAARUlEQVQI12MoBwOGUjcwVcyUDqLKBNRAVHkSiMtQXqagBqLAXCAF4gIpEBdElSmYI1EQQagSiAaodohhYA7cIqi1EEcAAHB/LX9QfndHAAAAAElFTkSuQmCC') right center no-repeat;
+ background-size: 25rpx;
+ font-size: 25rpx;
+ color: #333;
+}
+
+.cart-view .item.edit .num{
+ display: none;
+}
+
+.cart-view .item.edit .attr {
+ text-align: right;
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAUBAMAAABL3sEiAAAAGFBMVEVmZmZ6enp7e3uDg4OEhITHx8fu7u7///8ummCmAAAARUlEQVQI12MoBwOGUjcwVcyUDqLKBNRAVHkSiMtQXqagBqLAXCAF4gIpEBdElSmYI1EQQagSiAaodohhYA7cIqi1EEcAAHB/LX9QfndHAAAAAElFTkSuQmCC') right center no-repeat;
+ padding-right: 25rpx;
+ background-size: 12rpx 20rpx;
+ margin-bottom: 24rpx;
+ height: 39rpx;
+ line-height: 39rpx;
+ font-size: 24rpx;
+ color: #999;
+ overflow: hidden;
+}
+
+.cart-view .item.edit .b {
+ display: flex;
+ height: 52rpx;
+ overflow: hidden;
+}
+
+.cart-view .item.edit .price {
+ line-height: 52rpx;
+ height: 52rpx;
+ flex: 1;
+}
+
+.cart-view .item .selnum {
+ display: none;
+}
+
+.cart-view .item.edit .selnum {
+ width: 235rpx;
+ height: 52rpx;
+ border: 1rpx solid #ccc;
+ display: flex;
+}
+
+.selnum .cut {
+ width: 70rpx;
+ height: 100%;
+ text-align: center;
+ line-height: 50rpx;
+}
+
+.selnum .number {
+ flex: 1;
+ height: 100%;
+ text-align: center;
+ line-height: 68.75rpx;
+ border-left: 1px solid #ccc;
+ border-right: 1px solid #ccc;
+ float: left;
+}
+
+.selnum .add {
+ width: 80rpx;
+ height: 100%;
+ text-align: center;
+ line-height: 50rpx;
+}
+
+.cart-view .group-item .header {
+ width: 100%;
+ height: 94rpx;
+ line-height: 94rpx;
+ padding: 0 26rpx;
+ border-bottom: 1px solid #f4f4f4;
+}
+
+.cart-view .promotion .icon {
+ display: inline-block;
+ height: 24rpx;
+ width: 15rpx;
+}
+
+.cart-view .promotion {
+ margin-top: 25.5rpx;
+ float: left;
+ height: 43rpx;
+ width: 480rpx;
+ /*margin-right: 84rpx;*/
+ line-height: 43rpx;
+ font-size: 0;
+}
+
+.cart-view .promotion .tag {
+ border: 1px solid #f48f18;
+ height: 37rpx;
+ line-height: 31rpx;
+ padding: 0 9rpx;
+ margin-right: 10rpx;
+ color: #f48f18;
+ font-size: 24.5rpx;
+}
+
+.cart-view .promotion .txt {
+ height: 43rpx;
+ line-height: 43rpx;
+ padding-right: 10rpx;
+ color: #333;
+ font-size: 29rpx;
+ overflow: hidden;
+}
+
+.cart-view .get {
+ margin-top: 18rpx;
+ float: right;
+ height: 58rpx;
+ padding-left: 14rpx;
+ border-left: 1px solid #d9d9d9;
+ line-height: 58rpx;
+ font-size: 29rpx;
+ color: #333;
+}
+
+.cart-bottom {
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ height: 100rpx;
+ width: 100%;
+ background: #fff;
+ display: flex;
+}
+
+.cart-bottom .checkbox {
+ height: 34rpx;
+ padding-left: 60rpx;
+ line-height: 34rpx;
+ margin: 33rpx 18rpx 33rpx 26rpx;
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAmCAMAAACf4xmcAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABCUExURUdwTMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzAV+Z0EAAAAVdFJOUwAJ+KUEFTPay2bzRXdZ7RkhmJ6qJOWhY+QAAAEDSURBVDjLnZTplsIgDIUNWwK2tdt9/1cdxHGmVcAc+dH25Hw0+71cvjhztDIZM4mNc4txo+BwZKxSVwbSFoMn8iFuCeDrG0RLNkc6GGK+ttCZ8gIzuJcgBgPxJ4rB4T2OkM0HjgRyq8V7Y8i/3/V06YVb/nKECa0qBYPffB1jaFd8AD8+RrBrY8R41FkQew2MkPtrR6IeRglzoW1/HrbizfZ9Pv8jCH0slOAm+D7mMeUn4PoYwegxpVNlCsqCKMurbJay9R8GyT0HSTmWeciTYsh7K+MPK1MW0H9eQOU652sqcch+15rUrFQXLpuFy7ksXLYuXDUZbBZ9v4sqiqju34jyD97JD4dkfgo1AAAAAElFTkSuQmCC') no-repeat;
+ background-size: 34rpx;
+ font-size: 29rpx;
+}
+
+.cart-bottom .checkbox.checked {
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAmCAMAAACf4xmcAAAAQlBMVEUAAACrKyurKyurKyurKyurKyurKyurKyurKyurKyurKyurKyurKyurKyurKyvw19exOzv////z4uK1Q0Pt0dGxOjp+CNkCAAAADnRSTlMARVn7B9cVoc/jIWtnJIM++AMAAADUSURBVDjLndRLEoMgEEVRPyCg+FAh+99qYqmAabFL7/hMaKCrN/VWyRZopbJ9ETUaWbq5RLXBX6YmSChcpMRZdRKX6e6kDAqZzAmNYlpEpnCTimfEbfWmhLlnZp8qmLY5a47pVY0oNIWArfV+h5Jy88FsNg2q3JTNRLIK8sd4hTZnwfmzSuVsmRdPFGV+d1S18QjJUQUZB5IcVVBxvMlRBRsvKzmq0JOr9y58yNU/eEj8s3zyyPkvcyQk9wH57/xwOfCrhl9cNMGswdQ4HEt1GKsXfQHGSThPkNi75AAAAABJRU5ErkJggg==') no-repeat;
+ background-size: 34rpx;
+}
+
+.cart-bottom .total {
+ height: 34rpx;
+ flex: 1;
+ margin: 33rpx 10rpx;
+ font-size: 29rpx;
+}
+
+.cart-bottom .delete {
+ text-align: center;
+ width: 180rpx;
+ height: 60rpx;
+ line-height: 82rpx;
+ padding: 0;
+ margin: 0;
+ margin-left: -5rpx;
+ padding-right: 25rpx;
+ font-size: 25rpx;
+ color: #f4f4f4;
+ /* text-align: center; */
+ border-top-left-radius: 0rpx;
+ border-bottom-left-radius: 0rpx;
+ border-top-right-radius: 50rpx;
+ border-bottom-right-radius: 50rpx;
+ letter-spacing: 3rpx;
+ background-image: linear-gradient(to right, #9a9ba1 0%, #ae8b9c 100%);
+}
+
+.cart-bottom .checkout {
+ height: 100rpx;
+ width: 210rpx;
+ text-align: center;
+ line-height: 100rpx;
+ font-size: 29rpx;
+ background: #b4282d;
+ color: #fff;
+}
+
+.action_btn_area {
+ /* border: 1px solid #333; */
+ position: absolute;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ right: 0;
+ top: 0;
+ width: 380rpx;
+ height: 100rpx;
+}
+
+.action_btn_area .edit {
+ width: 140rpx;
+ /* border: 1px solid #000; */
+ height: 70rpx;
+ line-height: 70rpx;
+ padding: 0;
+ margin: 0;
+ margin-right: 5rpx;
+ text-align: center;
+ /* padding-left: 25rpx; */
+ font-size: 25rpx;
+ color: #f4f4f4;
+ border-top-left-radius: 50rpx;
+ border-bottom-left-radius: 50rpx;
+ border-top-right-radius: 50rpx;
+ border-bottom-right-radius: 50rpx;
+ letter-spacing: 3rpx;
+ /* background-image: linear-gradient(to right, #ff7701 100%); */
+ background-image: linear-gradient(to right, #f8b230 0%, #ee9e09 100%);
+}
+
+.action_btn_area .checkout {
+ width: 140rpx;
+ height: 70rpx;
+ line-height: 70rpx;
+ padding: 0;
+ margin: 0;
+ margin-left: 5rpx;
+ /* padding-right: 25rpx; */
+ font-size: 25rpx;
+ color: #f4f4f4;
+ text-align: center;
+ border-top-left-radius: 50rpx;
+ border-bottom-left-radius: 50rpx;
+ border-top-right-radius: 50rpx;
+ border-bottom-right-radius: 50rpx;
+ letter-spacing: 3rpx;
+ background-image: linear-gradient(to right, #ce373c 0%, #b4282d 100%);
+}
+
+.action_btn_area .delete {
+ width: 140rpx;
+ /* border: 1px solid #000; */
+ height: 70rpx;
+ line-height: 70rpx;
+ padding: 0;
+ margin: 0;
+ margin-right: 5rpx;
+ text-align: center;
+ padding-left: -5rpx;
+ font-size: 25rpx;
+ color: #f4f4f4;
+ border-top-left-radius: 50rpx;
+ border-bottom-left-radius: 50rpx;
+ border-top-right-radius: 50rpx;
+ border-bottom-right-radius: 50rpx;
+ letter-spacing: 3rpx;
+ background-image: linear-gradient(to right, #ff7701 0%, #fe4800 100%);
+}
+
+.action_btn_area .sure {
+ text-align: center;
+ width: 140rpx;
+ height: 70rpx;
+ line-height: 70rpx;
+ padding: 0;
+ margin: 0;
+ margin-right: 10rpx;
+ padding-left: -5rpx;
+ font-size: 25rpx;
+ color: #f4f4f4;
+ /* text-align: center; */
+ border-top-left-radius: 50rpx;
+ border-bottom-left-radius: 50rpx;
+ border-top-right-radius: 50rpx;
+ border-bottom-right-radius: 50rpx;
+ letter-spacing: 3rpx;
+ background-image: linear-gradient(to right, #f8b230 0%, #ee9e09 100%);
+ /* background-image: linear-gradient(to right, #ff7701 0%, #fe4800 100%); */
+}
+
+.auth_btn {
+ position: fixed;
+ top: 55vh;
+ left: 10vw;
+ width: 80vw;
+ height: 96rpx;
+ line-height: 96rpx;
+ font-size: 25rpx;
+ color: #f4f4f4;
+ /* text-align: center; */
+ border-top-left-radius: 50rpx;
+ border-bottom-left-radius: 50rpx;
+ border-top-right-radius: 50rpx;
+ border-bottom-right-radius: 50rpx;
+ letter-spacing: 3rpx;
+ background-image: linear-gradient(to right, #f8b230 0%, #ee9e09 100%);
+}
diff --git a/wx-mini-program/pages/catalog/catalog.js b/wx-mini-program/pages/catalog/catalog.js
new file mode 100644
index 0000000..929475d
--- /dev/null
+++ b/wx-mini-program/pages/catalog/catalog.js
@@ -0,0 +1,77 @@
+var util = require('../../utils/util.js');
+var api = require('../../config/api.js');
+
+Page({
+ data: {
+ categoryList: [],
+ currentCategory: {},
+ currentSubCategoryList: {},
+ scrollLeft: 0,
+ scrollTop: 0,
+ goodsCount: 0,
+ scrollHeight: 0
+ },
+ onLoad: function(options) {
+ this.getCatalog();
+ },
+ onPullDownRefresh() {
+ wx.showNavigationBarLoading() //在标题栏中显示加载
+ this.getCatalog();
+ wx.hideNavigationBarLoading() //完成停止加载
+ wx.stopPullDownRefresh() //停止下拉刷新
+ },
+ getCatalog: function() {
+ //CatalogList
+ let that = this;
+ wx.showLoading({
+ title: '加载中...',
+ });
+ util.request(api.CatalogList).then(function(res) {
+ that.setData({
+ categoryList: res.data.categoryList,
+ currentCategory: res.data.currentCategory,
+ currentSubCategoryList: res.data.currentSubCategory
+ });
+ wx.hideLoading();
+ });
+ util.request(api.GoodsCount).then(function(res) {
+ that.setData({
+ goodsCount: res.data.goodsCount
+ });
+ });
+
+ },
+ getCurrentCategory: function(id) {
+ let that = this;
+ util.request(api.CatalogCurrent, {
+ id: id
+ })
+ .then(function(res) {
+ that.setData({
+ currentCategory: res.data.currentCategory,
+ currentSubCategoryList: res.data.currentSubCategory
+ });
+ });
+ },
+ onReady: function() {
+ // 页面渲染完成
+ },
+ onShow: function() {
+ // 页面显示
+ },
+ onHide: function() {
+ // 页面隐藏
+ },
+ onUnload: function() {
+ // 页面关闭
+ },
+ switchCate: function(event) {
+ var that = this;
+ var currentTarget = event.currentTarget;
+ if (this.data.currentCategory.id == event.currentTarget.dataset.id) {
+ return false;
+ }
+
+ this.getCurrentCategory(event.currentTarget.dataset.id);
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/catalog/catalog.json b/wx-mini-program/pages/catalog/catalog.json
new file mode 100644
index 0000000..48d7c2d
--- /dev/null
+++ b/wx-mini-program/pages/catalog/catalog.json
@@ -0,0 +1,3 @@
+{
+ "navigationBarTitleText": "分类"
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/catalog/catalog.wxml b/wx-mini-program/pages/catalog/catalog.wxml
new file mode 100644
index 0000000..b34d199
--- /dev/null
+++ b/wx-mini-program/pages/catalog/catalog.wxml
@@ -0,0 +1,30 @@
+
+
+
+
+ 搜索, 共{{goodsCount}}款商品
+
+
+
+
+ {{item.name}}
+
+
+
+
+ {{currentCategory.frontName}}
+
+
+
+ {{currentCategory.name}}分类
+
+
+
+
+
+ {{item.name}}
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/catalog/catalog.wxss b/wx-mini-program/pages/catalog/catalog.wxss
new file mode 100644
index 0000000..501c9fa
--- /dev/null
+++ b/wx-mini-program/pages/catalog/catalog.wxss
@@ -0,0 +1,163 @@
+page {
+ height: 100%;
+}
+
+.container {
+ background: #f9f9f9;
+ height: 100%;
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+}
+
+.search {
+ height: 100rpx;
+ width: 100%;
+ padding: 0 30rpx;
+ background: #fff;
+ display: flex;
+ align-items: center;
+}
+
+.search .input {
+ width: 690rpx;
+ height: 70rpx;
+ border-radius: 20rpx;
+ display: flex;
+ padding-top: 18rpx;
+ padding-left: 20rpx;
+ align-items: left;
+ vertical-align: middle;
+ justify-content: left;
+}
+
+.search .icon {
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAMAAABF0y+mAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAA8UExURUdwTGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjQWelcAAAATdFJOUwDUDlMW8DUFcdHpnc3cSLkosSd78uTdAAAAvUlEQVQoz4WS6QLDEBCE131L0nn/d23J0VCV+bP4LLsM0S6Tg1NQLmRDnYz1OOVti18OcFZLI7Utw/XGtEIS10wkKH3NVoWF3/byBerMNQ5be4vZ4I4Vi8S7+niC3bd55L54yvA1VSDSryJqheE4oZVFKMFBD6AGK0FBDiCHKgEwA/hZfsxkszun1U77nL7Q9G3nvzL6z1sH2ndOANi3eRmrhzjx6qGo2Z327pMNJSMO34paSkc7PdJI/2lc3naRCwMB9sl5AAAAAElFTkSuQmCC') center no-repeat;
+ background-size: 100%;
+ width: 34rpx;
+ height: 34rpx;
+}
+
+.search .txt {
+ height: 42rpx;
+ line-height: 42rpx;
+ padding-left: 10rpx;
+}
+
+.catalog {
+ flex: 1;
+ width: 100%;
+ background: #fff;
+ display: flex;
+ border-top: 1px solid #fafafa;
+}
+
+.catalog .nav {
+ width: 162rpx;
+ height: 100%;
+}
+
+.catalog .nav .item {
+ text-align: center;
+ line-height: 90rpx;
+ width: 162rpx;
+ height: 90rpx;
+ color: #333;
+ font-size: 28rpx;
+ border-left: 6rpx solid #fff;
+}
+
+.catalog .nav .item.active {
+ color: #85c43f;
+ font-size: 29rpx;
+ border-left: 6rpx solid #85c43f;
+}
+
+.catalog .cate {
+ border-left: 1px solid #fafafa;
+ flex: 1;
+ height: 100%;
+ padding: 0 30rpx 0 30rpx;
+}
+
+.banner {
+ display: block;
+ height: 222rpx;
+ width: 100%;
+ position: relative;
+}
+
+.banner .image {
+ position: absolute;
+ top: 30rpx;
+ left: 0;
+ border-radius: 4rpx;
+ height: 192rpx;
+ width: 100%;
+}
+
+.banner .txt {
+ position: absolute;
+ top: 30rpx;
+ text-align: center;
+ color: #fff;
+ font-size: 28rpx;
+ left: 0;
+ height: 192rpx;
+ line-height: 192rpx;
+ width: 100%;
+}
+
+.catalog .hd {
+ height: 108rpx;
+ width: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.catalog .hd .txt {
+ font-size: 24rpx;
+ text-align: center;
+ color: #333;
+ padding: 0 10rpx;
+ width: auto;
+}
+
+.catalog .hd .line {
+ width: 100rpx;
+ height: 1px;
+ background: #d9d9d9;
+}
+
+.catalog .bd {
+ height: auto;
+ width: 100%;
+ overflow: hidden;
+}
+
+.catalog .bd .item {
+ display: block;
+ float: left;
+ height: 200rpx;
+ width: 152rpx;
+ margin-right: 28rpx;
+}
+
+.catalog .bd .item.last {
+ margin-right: 0;
+}
+
+.catalog .bd .item .icon {
+ height: 152rpx;
+ width: 152rpx;
+}
+
+.catalog .bd .item .txt {
+ display: block;
+ text-align: center;
+ font-size: 24rpx;
+ color: #333;
+ height: 62rpx;
+ width: 152rpx;
+}
diff --git a/wx-mini-program/pages/category/category.js b/wx-mini-program/pages/category/category.js
new file mode 100644
index 0000000..b4e2a37
--- /dev/null
+++ b/wx-mini-program/pages/category/category.js
@@ -0,0 +1,132 @@
+var util = require('../../utils/util.js');
+var api = require('../../config/api.js');
+
+Page({
+ data: {
+ navList: [],
+ goodsList: [],
+ id: 0,
+ currentCategory: {},
+ scrollLeft: 0,
+ scrollTop: 0,
+ scrollHeight: 0,
+ page: 1,
+ size: 500
+ },
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ var that = this;
+ if (options.id) {
+ that.setData({
+ id: parseInt(options.id)
+ });
+ }
+
+ wx.getSystemInfo({
+ success: function(res) {
+ that.setData({
+ scrollHeight: res.windowHeight
+ });
+ }
+ });
+
+
+ this.getCategoryInfo();
+
+ },
+ getCategoryInfo: function() {
+ let that = this;
+ util.request(api.GoodsCategory, {
+ id: this.data.id
+ })
+ .then(function(res) {
+
+ if (res.errno == 0) {
+ that.setData({
+ navList: res.data.brotherCategory,
+ currentCategory: res.data.currentCategory
+ });
+
+ wx.setNavigationBarTitle({
+ title: res.data.parentCategory.name
+ })
+
+ // 当id是L1分类id时,这里需要重新设置成L1分类的一个子分类的id
+ if (res.data.parentCategory.id == that.data.id) {
+ that.setData({
+ id: res.data.currentCategory.id
+ });
+ }
+
+ //nav位置
+ let currentIndex = 0;
+ let navListCount = that.data.navList.length;
+ for (let i = 0; i < navListCount; i++) {
+ currentIndex += 1;
+ if (that.data.navList[i].id == that.data.id) {
+ break;
+ }
+ }
+ if (currentIndex > navListCount / 2 && navListCount > 5) {
+ that.setData({
+ scrollLeft: currentIndex * 60
+ });
+ }
+ that.getGoodsList();
+
+ } else {
+ //显示错误信息
+ }
+
+ });
+ },
+ onReady: function() {
+ // 页面渲染完成
+ },
+ onShow: function() {
+ // 页面显示
+ console.log(1);
+ },
+ onHide: function() {
+ // 页面隐藏
+ },
+ getGoodsList: function() {
+ var that = this;
+
+ util.request(api.GoodsList, {
+ categoryId: that.data.id,
+ page: that.data.page,
+ size: that.data.size
+ })
+ .then(function(res) {
+ that.setData({
+ goodsList: res.data.goodsList,
+ });
+ });
+ },
+ onUnload: function() {
+ // 页面关闭
+ },
+ switchCate: function(event) {
+ if (this.data.id == event.currentTarget.dataset.id) {
+ return false;
+ }
+ var that = this;
+ var clientX = event.detail.x;
+ var currentTarget = event.currentTarget;
+ if (clientX < 60) {
+ that.setData({
+ scrollLeft: currentTarget.offsetLeft - 60
+ });
+ } else if (clientX > 330) {
+ that.setData({
+ scrollLeft: currentTarget.offsetLeft
+ });
+ }
+ this.setData({
+ id: event.currentTarget.dataset.id
+ });
+
+ this.getCategoryInfo();
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/category/category.json b/wx-mini-program/pages/category/category.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/wx-mini-program/pages/category/category.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/wx-mini-program/pages/category/category.wxml b/wx-mini-program/pages/category/category.wxml
new file mode 100644
index 0000000..bacf81b
--- /dev/null
+++ b/wx-mini-program/pages/category/category.wxml
@@ -0,0 +1,25 @@
+
+
+
+
+ {{item.name}}
+
+
+
+
+
+
+
+
+
+
+ {{iitem.name}}
+ ¥{{iitem.retailPrice}}
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/category/category.wxss b/wx-mini-program/pages/category/category.wxss
new file mode 100644
index 0000000..97cd881
--- /dev/null
+++ b/wx-mini-program/pages/category/category.wxss
@@ -0,0 +1,114 @@
+.container {
+ background: #f9f9f9;
+}
+
+.cate-nav {
+ position: fixed;
+ left: 0;
+ top: 0;
+ z-index: 1000;
+}
+
+.cate-nav-body {
+ height: 84rpx;
+ white-space: nowrap;
+ background: #fff;
+ border-top: 1px solid rgba(0, 0, 0, 0.15);
+ overflow: hidden;
+}
+
+.cate-nav .item {
+ display: inline-block;
+ height: 84rpx;
+ min-width: 130rpx;
+ padding: 0 15rpx;
+}
+
+.cate-nav .item .name {
+ display: block;
+ height: 84rpx;
+ padding: 0 20rpx;
+ line-height: 84rpx;
+ width: auto;
+}
+
+.cate-nav .item.active .name {
+ color: #85c43f;
+ border-bottom: 2px solid #85c43f;
+}
+
+.cate-item {
+ margin-top: 94rpx;
+ height: auto;
+ overflow: hidden;
+}
+
+.cate-item .h {
+ height: 145rpx;
+ width: 750rpx;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+
+.cate-item .h .name {
+ display: block;
+ height: 35rpx;
+ margin-bottom: 18rpx;
+ font-size: 30rpx;
+ color: #333;
+}
+
+.cate-item .h .desc {
+ display: block;
+ height: 24rpx;
+ font-size: 24rpx;
+ color: #999;
+}
+
+.cate-item .b {
+ width: 750rpx;
+ padding: 0 6.25rpx;
+ height: auto;
+ overflow: hidden;
+}
+
+.cate-item .b .item {
+ float: left;
+ background: #fff;
+ width: 365rpx;
+ margin-bottom: 6.25rpx;
+ padding-bottom: 33.333rpx;
+ height: auto;
+ overflow: hidden;
+ text-align: center;
+}
+
+.cate-item .b .item-b {
+ margin-left: 6.25rpx;
+}
+
+.cate-item .item .img {
+ width: 302rpx;
+ height: 302rpx;
+}
+
+.cate-item .item .name {
+ display: block;
+ width: 365.625rpx;
+ height: 35rpx;
+ margin: 11.5rpx 0 22rpx 0;
+ text-align: center;
+ overflow: hidden;
+ padding: 0 20rpx;
+ font-size: 30rpx;
+ color: #333;
+}
+
+.cate-item .item .price {
+ display: block;
+ width: 365.625rpx;
+ height: 30rpx;
+ text-align: center;
+}
diff --git a/wx-mini-program/pages/checkout/checkout.js b/wx-mini-program/pages/checkout/checkout.js
new file mode 100644
index 0000000..a5c23ce
--- /dev/null
+++ b/wx-mini-program/pages/checkout/checkout.js
@@ -0,0 +1,216 @@
+var util = require('../../utils/util.js');
+var api = require('../../config/api.js');
+
+var app = getApp();
+var lastTime = null;
+
+Page({
+ data: {
+ isMultiOrderModel: 0,
+ brandCartgoods:[],
+ checkedGoodsList: [],
+ checkedAddress: {},
+ availableCouponLength: 0, // 可用的优惠券数量
+ goodsTotalPrice: 0.00, //商品总价
+ freightPrice: 0.00, //快递费
+ couponPrice: 0.00, //优惠券的价格
+ grouponPrice: 0.00, //团购优惠价格
+ orderTotalPrice: 0.00, //订单总价
+ actualPrice: 0.00, //实际需要支付的总价
+ cartId: 0,
+ addressId: 0,
+ couponId: 0,
+ message: '',
+ grouponLinkId: 0, //参与的团购,如果是发起则为0
+ grouponRulesId: 0 //团购规则ID
+ },
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ },
+
+ //获取checkou信息
+ getCheckoutInfo: function() {
+ let that = this;
+ util.request(api.CartCheckout, {
+ cartId: that.data.cartId,
+ addressId: that.data.addressId,
+ couponId: that.data.couponId,
+ grouponRulesId: that.data.grouponRulesId
+ }).then(function(res) {
+ if (res.errno === 0) {
+ let brandCartgoods = [];
+ let checkedGoodsList = [];
+ if (res.data.isMultiOrderModel === 1) {
+ brandCartgoods = res.data.brandCartgoods;
+ } else {
+ checkedGoodsList = res.data.checkedGoodsList;
+ }
+ that.setData({
+ isMultiOrderModel: res.data.isMultiOrderModel,
+ brandCartgoods: brandCartgoods,
+ checkedGoodsList: checkedGoodsList,
+ checkedAddress: res.data.checkedAddress,
+ availableCouponLength: res.data.availableCouponLength,
+ actualPrice: res.data.actualPrice,
+ couponPrice: res.data.couponPrice,
+ grouponPrice: res.data.grouponPrice,
+ freightPrice: res.data.freightPrice,
+ goodsTotalPrice: res.data.goodsTotalPrice,
+ orderTotalPrice: res.data.orderTotalPrice,
+ addressId: res.data.addressId,
+ couponId: res.data.couponId,
+ grouponRulesId: res.data.grouponRulesId,
+ });
+ }
+ wx.hideLoading();
+ });
+ },
+ selectAddress() {
+ wx.navigateTo({
+ url: '/pages/ucenter/address/address',
+ })
+ },
+ selectCoupon() {
+ wx.navigateTo({
+ url: '/pages/ucenter/couponSelect/couponSelect',
+ })
+ },
+ bindMessageInput: function(e) {
+ this.setData({
+ message: e.detail.value
+ });
+ },
+ onReady: function() {
+ // 页面渲染完成
+
+ },
+ onShow: function() {
+ // 页面显示
+ wx.showLoading({
+ title: '加载中...',
+ });
+ try {
+ var cartId = wx.getStorageSync('cartId');
+ if (cartId) {
+ this.setData({
+ 'cartId': cartId
+ });
+ }
+
+ var addressId = wx.getStorageSync('addressId');
+ if (addressId) {
+ this.setData({
+ 'addressId': addressId
+ });
+ }
+
+ var couponId = wx.getStorageSync('couponId');
+ if (couponId) {
+ this.setData({
+ 'couponId': couponId
+ });
+ }
+
+ var grouponRulesId = wx.getStorageSync('grouponRulesId');
+ if (grouponRulesId) {
+ this.setData({
+ 'grouponRulesId': grouponRulesId
+ });
+ }
+
+ var grouponLinkId = wx.getStorageSync('grouponLinkId');
+ if (grouponLinkId) {
+ this.setData({
+ 'grouponLinkId': grouponLinkId
+ });
+ }
+ } catch (e) {
+ // Do something when catch error
+ console.log(e);
+ }
+
+ this.getCheckoutInfo();
+ },
+ onHide: function() {
+ // 页面隐藏
+
+ },
+ onUnload: function() {
+ // 页面关闭
+
+ },
+ submitOrder: function() {
+ if (this.data.addressId <= 0) {
+ util.showErrorToast('请选择收货地址');
+ return false;
+ }
+ util.jhxLoadShow("正在下单,请稍后...");
+ let nowTime = + new Date();
+ if (nowTime - lastTime > 5000 || !lastTime) { //5秒内避免重复提交订单
+ lastTime = nowTime;
+ } else {
+ return false;
+ }
+
+ util.request(api.OrderSubmit, {
+ cartId: this.data.cartId,
+ addressId: this.data.addressId,
+ couponId: this.data.couponId,
+ message: this.data.message,
+ grouponRulesId: this.data.grouponRulesId,
+ grouponLinkId: this.data.grouponLinkId
+ }, 'POST').then(res => {
+ util.jhxLoadHide();
+ if (res.errno === 0) {
+
+ // 下单成功,重置couponId
+ try {
+ wx.setStorageSync('couponId', 0);
+ } catch (error) {
+
+ }
+
+ const orderId = res.data.orderId;
+ util.request(api.OrderPrepay, {
+ orderId: orderId
+ }, 'POST').then(function(res) {
+ if (res.errno === 0) {
+ const payParam = res.data;
+ console.log("支付过程开始");
+ wx.requestPayment({
+ 'timeStamp': payParam.timeStamp,
+ 'nonceStr': payParam.nonceStr,
+ 'package': payParam.packageValue,
+ 'signType': payParam.signType,
+ 'paySign': payParam.paySign,
+ 'success': function(res) {
+ console.log("支付过程成功");
+ wx.redirectTo({
+ url: '/pages/payResult/payResult?status=1&orderId=' + orderId
+ });
+ },
+ 'fail': function(res) {
+ console.log("支付过程失败");
+ wx.redirectTo({
+ url: '/pages/payResult/payResult?status=0&orderId=' + orderId
+ });
+ },
+ 'complete': function(res) {
+ console.log("支付过程结束")
+ }
+ });
+ } else {
+ wx.redirectTo({
+ url: '/pages/payResult/payResult?status=0&orderId=' + orderId
+ });
+ }
+ });
+
+ } else {
+ wx.redirectTo({
+ url: '/pages/payResult/payResult?status=0&orderId=' + orderId
+ });
+ }
+ });
+ }
+});
\ No newline at end of file
diff --git a/wx-mini-program/pages/checkout/checkout.json b/wx-mini-program/pages/checkout/checkout.json
new file mode 100644
index 0000000..08b75ef
--- /dev/null
+++ b/wx-mini-program/pages/checkout/checkout.json
@@ -0,0 +1,3 @@
+{
+ "navigationBarTitleText": "填写订单"
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/checkout/checkout.wxml b/wx-mini-program/pages/checkout/checkout.wxml
new file mode 100644
index 0000000..24c0ac9
--- /dev/null
+++ b/wx-mini-program/pages/checkout/checkout.wxml
@@ -0,0 +1,139 @@
+
+
+
+
+ {{checkedAddress.name}}
+ 默认
+
+
+ {{checkedAddress.mobile}}
+ {{checkedAddress.address}}
+
+
+
+
+
+
+
+ 还没有收货地址,去添加
+
+
+
+
+
+
+
+
+
+
+ 没有可用的优惠券
+ 0张
+
+
+ 优惠券
+ {{availableCouponLength}}张
+
+
+ 优惠券
+ ¥{{couponPrice}}元
+
+
+
+
+
+
+
+
+
+
+
+
+ {{bitem.brandName}} >
+
+
+
+
+
+
+
+ {{item.goodsName}}
+
+ {{item.specifications}}
+ ¥{{item.price}}
+ x{{item.number}}
+
+
+
+
+
+ 商品合计
+
+
+ ¥{{bitem.bandGoodsTotalPrice}}元
+
+
+
+
+ 运费
+
+
+ ¥{{bitem.bandFreightPrice}}元
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.goodsName}}
+ x{{item.number}}
+
+ {{item.specifications}}
+ ¥{{item.price}}
+
+
+
+
+
+
+
+
+
+
+ 商品合计
+
+
+ ¥{{goodsTotalPrice}}元
+
+
+
+
+ 运费
+
+
+ ¥{{freightPrice}}元
+
+
+
+
+ 优惠券
+
+
+ -¥{{couponPrice}}元
+
+
+
+
+
+ 实付:¥{{actualPrice}}
+ 去付款
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/checkout/checkout.wxss b/wx-mini-program/pages/checkout/checkout.wxss
new file mode 100644
index 0000000..2dc36c2
--- /dev/null
+++ b/wx-mini-program/pages/checkout/checkout.wxss
@@ -0,0 +1,372 @@
+page {
+ height: auto;
+ min-height: 100%;
+ background: #f4f4f4;
+}
+
+.address-box {
+ width: 100%;
+ height: 166.55rpx;
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAKCAMAAADfAc3wAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAYUExURc2AgICg1v///+rw+ffq6tKMjI2p2ouo2QT3I5MAAAA9SURBVCjPpcs5EgAgCARB5ND//9jEYwlZJp1q0ZTNAS3L10OgcGlYlYZNuGoRly3guv2YsA8z9mLKHsxZ3e5sBBsNqhCTAAAAAElFTkSuQmCC') 0 0 repeat-x;
+ background-size: 62.5rpx 10.5rpx;
+ margin-bottom: 20rpx;
+ padding-top: 10.5rpx;
+}
+
+.address-item {
+ display: flex;
+ height: 155.55rpx;
+ background: #fff;
+ padding: 41.6rpx 0 41.6rpx 31.25rpx;
+}
+
+.address-item.address-empty {
+ line-height: 75rpx;
+ text-align: center;
+}
+
+.address-box .l {
+ width: 125rpx;
+ height: 100%;
+}
+
+.address-box .l .name {
+ margin-left: 6.25rpx;
+ margin-top: -7.25rpx;
+ display: block;
+ width: 125rpx;
+ height: 43rpx;
+ line-height: 43rpx;
+ font-size: 30rpx;
+ color: #333;
+ margin-bottom: 15rpx;
+}
+
+.address-box .l .default {
+ margin-left: 6.25rpx;
+ display: block;
+ width: 62rpx;
+ height: 33rpx;
+ border-radius: 5rpx;
+ border: 1px solid #b4282d;
+ font-size: 20.5rpx;
+ text-align: center;
+ line-height: 29rpx;
+ color: #b4282d;
+}
+
+.address-box .m {
+ flex: 1;
+ height: 72.25rpx;
+ color: #999;
+}
+
+.address-box .mobile {
+ display: block;
+ height: 29rpx;
+ line-height: 29rpx;
+ margin-bottom: 16.25rpx;
+ font-size: 30rpx;
+ color: #333;
+}
+
+.address-box .address {
+ display: block;
+ height: 37.5rpx;
+ line-height: 37.5rpx;
+ font-size: 25rpx;
+ color: #666;
+}
+
+.address-box .r {
+ width: 77rpx;
+ height: 77rpx;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.address-box .r image {
+ width: 52.078rpx;
+ height: 52.078rpx;
+}
+
+.coupon-box {
+ width: 100%;
+ height: auto;
+ overflow: hidden;
+ background: #fff;
+ border-bottom: 1px solid #fafafa;
+}
+
+.coupon-box .coupon-item {
+ width: 100%;
+ height: 78.3rpx;
+ overflow: hidden;
+ background: #fff;
+ display: flex;
+ padding-left: 31.25rpx;
+}
+
+.coupon-box .l {
+ flex: 1;
+ height: 33rpx;
+ line-height: 33rpx;
+ padding-top: 25rpx;
+}
+
+.coupon-box .l .name {
+ float: left;
+ font-size: 30rpx;
+ color: #666;
+}
+
+.coupon-box .l .txt {
+ float: right;
+ font-size: 30rpx;
+ color: #666;
+}
+
+.coupon-box .r {
+ margin-top: 10.5rpx;
+ width: 77rpx;
+ height: 57rpx;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.coupon-box .r image {
+ width: 52.078rpx;
+ height: 52.078rpx;
+}
+
+.message-box {
+ width: 100%;
+ height: auto;
+ overflow: hidden;
+ background: #fff;
+ margin-bottom: 16.25rpx;
+}
+
+.message-box .message-item {
+ height: 72.078rpx;
+ overflow: hidden;
+ background: #fff;
+ display: flex;
+ margin-left: 31.25rpx;
+ padding-right: 31.25rpx;
+ padding-top: 10rpx;
+}
+
+.group-item {
+ width: 100%;
+ background: #fff;
+ height: auto;
+ padding-right: 11.25rpx;
+ margin-bottom: 26.25rpx;
+}
+.group-item .h {
+ height: 83.3rpx;
+ line-height: 83.3rpx;
+ margin-left: 21.25rpx;
+ padding-right: 11.25rpx;
+ border-bottom: 1px solid #f4f4f4;
+ font-size: 30rpx;
+ color: #333;
+}
+
+.group-item .h .l {
+ float: left;
+ font-weight:bold;
+}
+
+.brand-order{
+ width: 100%;
+ height: auto;
+ overflow: hidden;
+ background: #fff;
+}
+
+
+.brand-order .order-item {
+ height: 64.3rpx;
+ overflow: hidden;
+ background: #fff;
+ display: flex;
+ margin-left: 31.25rpx;
+ padding-right: 31.25rpx;
+ padding-top: 16rpx;
+ border-bottom: 1px solid #fafafa;
+}
+
+.brand-order .order-item .l {
+ float: left;
+ height: 42rpx;
+ width: 50%;
+ line-height: 42rpx;
+ overflow: hidden;
+}
+
+.brand-order .order-item .r {
+ float: right;
+ text-align: right;
+ width: 50%;
+ height: 42rpx;
+ line-height: 42rpx;
+ overflow: hidden;
+}
+
+.order-box {
+ margin-top: 10rpx;
+ width: 100%;
+ height: auto;
+ overflow: hidden;
+ background: #fff;
+ margin-bottom: 120rpx;
+}
+
+.order-box .order-item {
+ height: 64.3rpx;
+ overflow: hidden;
+ background: #fff;
+ display: flex;
+ margin-left: 31.25rpx;
+ padding-right: 31.25rpx;
+ padding-top: 16rpx;
+ border-bottom: 1px solid #fafafa;
+}
+
+.order-box .order-item .l {
+ float: left;
+ height: 42rpx;
+ width: 50%;
+ line-height: 42rpx;
+ overflow: hidden;
+}
+
+.order-box .order-item .r {
+ float: right;
+ text-align: right;
+ width: 50%;
+ height: 42rpx;
+ line-height: 42rpx;
+ overflow: hidden;
+}
+
+.order-box .order-item.no-border {
+ border-bottom: none;
+}
+
+.goods-items {
+ margin-top: 20rpx;
+ width: 100%;
+ height: auto;
+ overflow: hidden;
+ margin-bottom: 20rpx;
+}
+
+.goods-items .item {
+ height: 162rpx;
+ padding-left: 11.25rpx;
+ padding-right: 31.25rpx;
+ display: flex;
+ align-items: center;
+ border-bottom: 1px solid #fafafa;
+}
+
+.goods-items .item.no-border {
+ border-bottom: none;
+}
+
+.goods-items .item:last-child {
+ border-bottom: none;
+}
+
+.goods-items .img {
+ height: 145.83rpx;
+ width: 145.83rpx;
+ background-color: #f4f4f4;
+ margin-right: 20rpx;
+}
+
+.goods-items .img image {
+ height: 145.83rpx;
+ width: 145.83rpx;
+}
+
+.goods-items .info {
+ flex: 1;
+ height: 145.83rpx;
+ padding-top: 5rpx;
+}
+
+.goods-items .t {
+ height: 33rpx;
+ line-height: 33rpx;
+ margin-bottom: 10rpx;
+ overflow: hidden;
+ font-size: 30rpx;
+ color: #333;
+}
+
+.goods-items .t .name {
+ display: block;
+ float: left;
+}
+
+.goods-items .b {
+ float: left;
+ height: 41rpx;
+ overflow: hidden;
+ line-height: 41rpx;
+ font-size: 30rpx;
+ color: #ec4223;
+}
+.goods-items .number {
+ display: block;
+ float: right;
+ text-align: right;
+}
+
+.goods-items .m {
+ height: 29rpx;
+ overflow: hidden;
+ line-height: 29rpx;
+ margin-bottom: 25rpx;
+ font-size: 25rpx;
+ color: #999;
+}
+
+
+.order-total {
+ position: fixed;
+ left: 0;
+ bottom: 0;
+ height: 100rpx;
+ width: 100%;
+ display: flex;
+}
+
+.order-total .l {
+ flex: 1;
+ height: 100rpx;
+ line-height: 100rpx;
+ color: #b4282d;
+ background: #fff;
+ font-size: 33rpx;
+ padding-left: 31.25rpx;
+ border-top: 1rpx solid rgba(0, 0, 0, 0.2);
+ border-bottom: 1rpx solid rgba(0, 0, 0, 0.2);
+}
+
+.order-total .r {
+ width: 233rpx;
+ height: 100rpx;
+ background: #b4282d;
+ border: 1px solid #fafafa;
+ line-height: 100rpx;
+ text-align: center;
+ color: #fff;
+ font-size: 30rpx;
+}
diff --git a/wx-mini-program/pages/comment/comment.js b/wx-mini-program/pages/comment/comment.js
new file mode 100644
index 0000000..688eb4f
--- /dev/null
+++ b/wx-mini-program/pages/comment/comment.js
@@ -0,0 +1,127 @@
+var app = getApp();
+var util = require('../../utils/util.js');
+var api = require('../../config/api.js');
+
+Page({
+ data: {
+ comments: [],
+ allCommentList: [],
+ picCommentList: [],
+ type: 0,
+ valueId: 0,
+ showType: 0,
+ allCount: 0,
+ hasPicCount: 0,
+ allPage: 1,
+ picPage: 1,
+ size: 20
+ },
+ getCommentCount: function() {
+ let that = this;
+ util.request(api.CommentCount, {
+ valueId: that.data.valueId,
+ type: that.data.type
+ }).then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ allCount: res.data.allCount,
+ hasPicCount: res.data.hasPicCount
+ });
+ }
+ });
+ },
+ getCommentList: function() {
+ let that = this;
+ util.request(api.CommentList, {
+ valueId: that.data.valueId,
+ type: that.data.type,
+ size: that.data.size,
+ page: (that.data.showType == 0 ? that.data.allPage : that.data.picPage),
+ showType: that.data.showType
+ }).then(function(res) {
+ if (res.errno === 0) {
+
+ if (that.data.showType == 0) {
+ that.setData({
+ allCommentList: that.data.allCommentList.concat(res.data.data),
+ allPage: res.data.currentPage,
+ comments: that.data.allCommentList.concat(res.data.data)
+ });
+ } else {
+ that.setData({
+ picCommentList: that.data.picCommentList.concat(res.data.data),
+ picPage: res.data.currentPage,
+ comments: that.data.picCommentList.concat(res.data.data)
+ });
+ }
+ }
+ });
+ },
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ this.setData({
+ type: options.type,
+ valueId: options.valueId
+ });
+ this.getCommentCount();
+ this.getCommentList();
+ },
+ onReady: function() {
+ // 页面渲染完成
+
+ },
+ onShow: function() {
+ // 页面显示
+
+ },
+ onHide: function() {
+ // 页面隐藏
+
+ },
+ onUnload: function() {
+ // 页面关闭
+
+ },
+ switchTab: function() {
+ let that = this;
+ if (that.data.showType == 0) {
+ that.setData({
+ allCommentList: [],
+ allPage: 1,
+ comments: [],
+ showType: 1
+ });
+ } else {
+ that.setData({
+ picCommentList: [],
+ picPage: 1,
+ comments: [],
+ showType: 0
+ });
+ }
+ this.getCommentList();
+ },
+ onReachBottom: function() {
+ console.log('onPullDownRefresh');
+ if (this.data.showType == 0) {
+
+ if (this.data.allCount / this.data.size < this.data.allPage) {
+ return false;
+ }
+
+ this.setData({
+ 'allPage': this.data.allPage + 1
+ });
+ } else {
+ if (this.data.hasPicCount / this.data.size < this.data.picPage) {
+ return false;
+ }
+
+ this.setData({
+ 'picPage': this.data.picPage + 1
+ });
+ }
+
+ this.getCommentList();
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/comment/comment.json b/wx-mini-program/pages/comment/comment.json
new file mode 100644
index 0000000..ff90da7
--- /dev/null
+++ b/wx-mini-program/pages/comment/comment.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "评价",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/comment/comment.wxml b/wx-mini-program/pages/comment/comment.wxml
new file mode 100644
index 0000000..dfc28bb
--- /dev/null
+++ b/wx-mini-program/pages/comment/comment.wxml
@@ -0,0 +1,30 @@
+
+
+
+ 全部({{allCount}})
+
+
+ 有图({{hasPicCount}})
+
+
+
+
+
+
+
+ {{item.userInfo.nickname}}
+
+ {{item.addTime}}
+
+ {{item.content}}
+
+
+
+
+ 小商场回复:
+ {{item.reply}}
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/comment/comment.wxss b/wx-mini-program/pages/comment/comment.wxss
new file mode 100644
index 0000000..700517e
--- /dev/null
+++ b/wx-mini-program/pages/comment/comment.wxss
@@ -0,0 +1,155 @@
+.comments {
+ width: 100%;
+ height: auto;
+ padding-left: 30rpx;
+ background: #fff;
+ margin: 20rpx 0;
+}
+
+.comments .h {
+ position: fixed;
+ left: 0;
+ top: 0;
+ z-index: 1000;
+ width: 100%;
+ display: flex;
+ background: #fff;
+ height: 84rpx;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.15);
+}
+
+.comments .h .item {
+ display: inline-block;
+ height: 82rpx;
+ width: 50%;
+ padding: 0 15rpx;
+ text-align: center;
+}
+
+.comments .h .item .txt {
+ display: inline-block;
+ height: 82rpx;
+ padding: 0 20rpx;
+ line-height: 82rpx;
+ color: #333;
+ font-size: 30rpx;
+ width: 170rpx;
+}
+
+.comments .h .item.active .txt {
+ color: #ab2b2b;
+ border-bottom: 4rpx solid #ab2b2b;
+}
+
+.comments .b {
+ margin-top: 85rpx;
+ height: auto;
+ width: 720rpx;
+}
+
+.comments .b.no-h {
+ margin-top: 0;
+}
+
+.comments .item {
+ height: auto;
+ width: 720rpx;
+ overflow: hidden;
+ border-bottom: 1px solid #d9d9d9;
+ padding-bottom: 25rpx;
+}
+
+.comments .info {
+ height: 127rpx;
+ width: 100%;
+ padding: 33rpx 0 27rpx 0;
+}
+
+.comments .user {
+ float: left;
+ width: auto;
+ height: 67rpx;
+ line-height: 67rpx;
+ font-size: 0;
+}
+
+.comments .user image {
+ float: left;
+ width: 67rpx;
+ height: 67rpx;
+ margin-right: 17rpx;
+ border-radius: 50%;
+}
+
+.comments .user text {
+ display: inline-block;
+ width: auto;
+ height: 66rpx;
+ overflow: hidden;
+ font-size: 29rpx;
+ line-height: 66rpx;
+}
+
+.comments .time {
+ display: block;
+ float: right;
+ width: auto;
+ height: 67rpx;
+ line-height: 67rpx;
+ color: #7f7f7f;
+ font-size: 25rpx;
+ margin-right: 30rpx;
+}
+
+.comments .comment {
+ width: 720rpx;
+ padding-right: 30rpx;
+ line-height: 45.8rpx;
+ font-size: 29rpx;
+ margin-bottom: 16rpx;
+}
+
+.comments .imgs {
+ width: 720rpx;
+ height: 150rpx;
+ margin-bottom: 25rpx;
+}
+
+.comments .imgs .img {
+ height: 150rpx;
+ width: 150rpx;
+ margin-right: 28rpx;
+}
+
+.comments .spec {
+ width: 720rpx;
+ height: 25rpx;
+ font-size: 24rpx;
+ color: #999;
+}
+
+.comments .spec .item {
+ color: #7f7f7f;
+ font-size: 25rpx;
+}
+
+.comments .customer-service {
+ width: 690rpx;
+ height: auto;
+ overflow: hidden;
+ margin-top: 23rpx;
+ background: rgba(0, 0, 0, 0.03);
+ padding: 21rpx;
+}
+
+.comments .customer-service .u {
+ font-size: 24rpx;
+ color: #333;
+ line-height: 37.5rpx;
+}
+
+.comments .customer-service .c {
+ font-size: 24rpx;
+ color: #999;
+ line-height: 37.5rpx;
+}
diff --git a/wx-mini-program/pages/commentPost/commentPost.js b/wx-mini-program/pages/commentPost/commentPost.js
new file mode 100644
index 0000000..fed429d
--- /dev/null
+++ b/wx-mini-program/pages/commentPost/commentPost.js
@@ -0,0 +1,177 @@
+// 上传组件 基于https://github.com/Tencent/weui-wxss/tree/master/src/example/uploader
+var app = getApp();
+var util = require('../../utils/util.js');
+var api = require('../../config/api.js');
+Page({
+ data: {
+ orderId: 0,
+ type: 0,
+ valueId: 0,
+ orderGoods: {},
+ content: '',
+ stars: [0, 1, 2, 3, 4],
+ star: 5,
+ starText: '十分满意',
+ hasPicture: false,
+ picUrls: [],
+ files: []
+ },
+ chooseImage: function(e) {
+ if (this.data.files.length >= 5) {
+ util.showErrorToast('只能上传五张图片')
+ return false;
+ }
+
+ var that = this;
+ wx.chooseImage({
+ count: 1,
+ sizeType: ['original', 'compressed'],
+ sourceType: ['album', 'camera'],
+ success: function(res) {
+ that.setData({
+ files: that.data.files.concat(res.tempFilePaths)
+ });
+ that.upload(res);
+ }
+ })
+ },
+ upload: function(res) {
+ var that = this;
+ const uploadTask = wx.uploadFile({
+ url: api.StorageUpload,
+ filePath: res.tempFilePaths[0],
+ name: 'file',
+ success: function(res) {
+ var _res = JSON.parse(res.data);
+ if (_res.errno === 0) {
+ var url = _res.data.url
+ that.data.picUrls.push(url)
+ that.setData({
+ hasPicture: true,
+ picUrls: that.data.picUrls
+ })
+ }
+ },
+ fail: function(e) {
+ wx.showModal({
+ title: '错误',
+ content: '上传失败',
+ showCancel: false
+ })
+ },
+ })
+
+ uploadTask.onProgressUpdate((res) => {
+ console.log('上传进度', res.progress)
+ console.log('已经上传的数据长度', res.totalBytesSent)
+ console.log('预期需要上传的数据总长度', res.totalBytesExpectedToSend)
+ })
+
+ },
+ previewImage: function(e) {
+ wx.previewImage({
+ current: e.currentTarget.id, // 当前显示图片的http链接
+ urls: this.data.files // 需要预览的图片http链接列表
+ })
+ },
+ selectRater: function(e) {
+ var star = e.currentTarget.dataset.star + 1;
+ var starText;
+ if (star == 1) {
+ starText = '很差';
+ } else if (star == 2) {
+ starText = '不太满意';
+ } else if (star == 3) {
+ starText = '满意';
+ } else if (star == 4) {
+ starText = '比较满意';
+ } else {
+ starText = '十分满意'
+ }
+ this.setData({
+ star: star,
+ starText: starText
+ })
+
+ },
+ onLoad: function(options) {
+ var that = this;
+ that.setData({
+ orderId: options.orderId,
+ type: options.type,
+ valueId: options.valueId
+ });
+ this.getOrderGoods();
+ },
+ getOrderGoods: function() {
+ let that = this;
+ util.request(api.OrderGoods, {
+ orderId: that.data.orderId,
+ goodsId: that.data.valueId
+ }).then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ orderGoods: res.data,
+ });
+ }
+ });
+ },
+ onClose: function() {
+ wx.navigateBack();
+ },
+ onPost: function() {
+ let that = this;
+
+ if (!this.data.content) {
+ util.showErrorToast('请填写评论')
+ return false;
+ }
+
+ util.request(api.OrderComment, {
+ orderGoodsId: that.data.orderGoods.id,
+ content: that.data.content,
+ star: that.data.star,
+ hasPicture: that.data.hasPicture,
+ picUrls: that.data.picUrls
+ }, 'POST').then(function(res) {
+ if (res.errno === 0) {
+ wx.showToast({
+ title: '评论成功',
+ complete: function() {
+ wx.switchTab({
+ url: '/pages/ucenter/index/index'
+ })
+ }
+ })
+ }
+ });
+ },
+ bindInputValue(event) {
+
+ let value = event.detail.value;
+
+ //判断是否超过140个字符
+ if (value && value.length > 140) {
+ return false;
+ }
+
+ this.setData({
+ content: event.detail.value,
+ })
+ },
+ onReady: function() {
+
+ },
+ onShow: function() {
+ // 页面显示
+
+ },
+ onHide: function() {
+ // 页面隐藏
+
+ },
+ onUnload: function() {
+ // 页面关闭
+
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/commentPost/commentPost.json b/wx-mini-program/pages/commentPost/commentPost.json
new file mode 100644
index 0000000..ff90da7
--- /dev/null
+++ b/wx-mini-program/pages/commentPost/commentPost.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "评价",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/commentPost/commentPost.wxml b/wx-mini-program/pages/commentPost/commentPost.wxml
new file mode 100644
index 0000000..a4067d5
--- /dev/null
+++ b/wx-mini-program/pages/commentPost/commentPost.wxml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+ {{orderGoods.goodsName}} x{{orderGoods.number}}
+
+ {{orderGoods.goodsSpecificationValues}}
+
+
+
+ 评分
+
+
+
+
+ {{starText}}
+
+
+
+ {{140 - content.length}}
+
+
+
+
+ 图片上传
+ {{picUrls.length}}/{{files.length}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+ 发表
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/commentPost/commentPost.wxss b/wx-mini-program/pages/commentPost/commentPost.wxss
new file mode 100644
index 0000000..dae5457
--- /dev/null
+++ b/wx-mini-program/pages/commentPost/commentPost.wxss
@@ -0,0 +1,246 @@
+page, .container {
+ height: 100%;
+ background: #f4f4f4;
+}
+
+.post-comment {
+ width: 750rpx;
+ height: auto;
+ overflow: hidden;
+ padding: 30rpx;
+ background: #fff;
+}
+
+.post-comment .goods {
+ display: flex;
+ align-items: center;
+ height: 199rpx;
+ margin-left: 31.25rpx;
+}
+
+.post-comment .goods .img {
+ height: 145.83rpx;
+ width: 145.83rpx;
+ background: #f4f4f4;
+}
+
+.post-comment .goods .img image {
+ height: 145.83rpx;
+ width: 145.83rpx;
+}
+
+.post-comment .goods .info {
+ height: 145.83rpx;
+ flex: 1;
+ padding-left: 20rpx;
+}
+
+.post-comment .goods .name {
+ margin-top: 30rpx;
+ display: block;
+ height: 44rpx;
+ line-height: 44rpx;
+ color: #333;
+ font-size: 30rpx;
+}
+
+.post-comment .goods .number {
+ display: block;
+ height: 37rpx;
+ line-height: 37rpx;
+ color: #666;
+ font-size: 25rpx;
+}
+
+.post-comment .goods .status {
+ width: 105rpx;
+ color: #b4282d;
+ font-size: 25rpx;
+}
+
+.post-comment .rater {
+ display: flex;
+ flex-direction: row;
+ height: 55rpx;
+}
+
+.post-comment .rater .rater-title {
+ font-size: 29rpx;
+ padding-right: 10rpx;
+}
+
+.post-comment .rater image {
+ padding-left: 5rpx;
+ height: 50rpx;
+ width: 50rpx;
+}
+
+.post-comment .rater .rater-desc {
+ font-size: 29rpx;
+ padding-left: 10rpx;
+}
+
+.post-comment .input-box {
+ height: 337.5rpx;
+ width: 690rpx;
+ position: relative;
+ background: #fff;
+}
+
+.post-comment .input-box .content {
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: block;
+ background: #fff;
+ font-size: 29rpx;
+ border: 5px solid #f4f4f4;
+ height: 300rpx;
+ width: 650rpx;
+ padding: 20rpx;
+}
+
+.post-comment .input-box .count {
+ position: absolute;
+ bottom: 20rpx;
+ right: 20rpx;
+ display: block;
+ height: 30rpx;
+ width: 50rpx;
+ font-size: 29rpx;
+ color: #999;
+}
+
+.post-comment .btns {
+ height: 108rpx;
+}
+
+.post-comment .close {
+ float: left;
+ height: 108rpx;
+ line-height: 108rpx;
+ text-align: left;
+ color: #666;
+ padding: 0 30rpx;
+}
+
+.post-comment .post {
+ float: right;
+ height: 108rpx;
+ line-height: 108rpx;
+ text-align: right;
+ padding: 0 30rpx;
+}
+
+.weui-uploader {
+ margin-top: 50rpx;
+}
+
+.weui-uploader__hd {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: flex;
+ padding-bottom: 10px;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ align-items: center;
+}
+
+.weui-uploader__title {
+ -webkit-box-flex: 1;
+ -webkit-flex: 1;
+ flex: 1;
+}
+
+.weui-uploader__info {
+ color: #b2b2b2;
+}
+
+.weui-uploader__bd {
+ margin-bottom: -4px;
+ margin-right: -9px;
+ overflow: hidden;
+}
+
+.weui-uploader__file {
+ float: left;
+ margin-right: 9px;
+ margin-bottom: 9px;
+}
+
+.weui-uploader__img {
+ display: block;
+ width: 79px;
+ height: 79px;
+}
+
+.weui-uploader__file_status {
+ position: relative;
+}
+
+.weui-uploader__file_status:before {
+ content: " ";
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ background-color: rgba(0, 0, 0, 0.5);
+}
+
+.weui-uploader__file-content {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ -webkit-transform: translate(-50%, -50%);
+ transform: translate(-50%, -50%);
+ color: #fff;
+}
+
+.weui-uploader__input-box {
+ float: left;
+ position: relative;
+ margin-right: 9px;
+ margin-bottom: 9px;
+ width: 77px;
+ height: 77px;
+ border: 1px solid #d9d9d9;
+}
+
+.weui-uploader__input-box:after, .weui-uploader__input-box:before {
+ content: " ";
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ -webkit-transform: translate(-50%, -50%);
+ transform: translate(-50%, -50%);
+ background-color: #d9d9d9;
+}
+
+.weui-uploader__input-box:before {
+ width: 2px;
+ height: 39.5px;
+}
+
+.weui-uploader__input-box:after {
+ width: 39.5px;
+ height: 2px;
+}
+
+.weui-uploader__input-box:active {
+ border-color: #999;
+}
+
+.weui-uploader__input-box:active:after, .weui-uploader__input-box:active:before {
+ background-color: #999;
+}
+
+.weui-uploader__input {
+ position: absolute;
+ z-index: 1;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ opacity: 0;
+}
diff --git a/wx-mini-program/pages/coupon/coupon.js b/wx-mini-program/pages/coupon/coupon.js
new file mode 100644
index 0000000..03dcff2
--- /dev/null
+++ b/wx-mini-program/pages/coupon/coupon.js
@@ -0,0 +1,149 @@
+var util = require('../../utils/util.js');
+var api = require('../../config/api.js');
+
+var app = getApp();
+
+Page({
+ data: {
+ couponList: [],
+ page: 1,
+ size: 10,
+ count: 0,
+ scrollTop: 0,
+ showPage: false
+ },
+
+
+ /**
+ * 生命周期函数--监听页面加载
+ */
+ onLoad: function (options) {
+ this.getCouponList();
+ },
+
+ /**
+ * 生命周期函数--监听页面初次渲染完成
+ */
+ onReady: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面显示
+ */
+ onShow: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面隐藏
+ */
+ onHide: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面卸载
+ */
+ onUnload: function () {
+
+ },
+
+ /**
+ * 页面相关事件处理函数--监听用户下拉动作
+ */
+ onPullDownRefresh: function () {
+
+ },
+
+ /**
+ * 页面上拉触底事件的处理函数
+ */
+ onReachBottom: function () {
+
+ },
+
+ /**
+ * 用户点击右上角分享
+ */
+ onShareAppMessage: function () {
+
+ },
+ getCouponList: function () {
+
+ let that = this;
+ that.setData({
+ scrollTop: 0,
+ showPage: false,
+ couponList: []
+ });
+ // 页面渲染完成
+ wx.showToast({
+ title: '加载中...',
+ icon: 'loading',
+ duration: 2000
+ });
+
+ util.request(api.CouponList, {
+ page: that.data.page,
+ size: that.data.size
+ }).then(function (res) {
+ if (res.errno === 0) {
+
+ that.setData({
+ scrollTop: 0,
+ couponList: res.data.data,
+ showPage: true,
+ count: res.data.count
+ });
+ }
+ wx.hideToast();
+ });
+
+ },
+ getCoupon(e) {
+ if (!app.globalData.hasLogin) {
+ wx.navigateTo({
+ url: "/pages/auth/login/login"
+ });
+ }
+
+ let couponId = e.currentTarget.dataset.index
+ util.request(api.CouponReceive, {
+ couponId: couponId
+ }, 'POST').then(res => {
+ if (res.errno === 0) {
+ wx.showToast({
+ title: "领取成功"
+ })
+ }
+ else {
+ util.showErrorToast(res.errmsg);
+ }
+ })
+ },
+ nextPage: function (event) {
+ var that = this;
+ if (this.data.page > that.data.count / that.data.size) {
+ return true;
+ }
+
+ that.setData({
+ page: that.data.page + 1
+ });
+
+ this.getCouponList();
+
+ },
+ prevPage: function (event) {
+ if (this.data.page <= 1) {
+ return false;
+ }
+
+ var that = this;
+ that.setData({
+ page: that.data.page - 1
+ });
+ this.getCouponList();
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/coupon/coupon.json b/wx-mini-program/pages/coupon/coupon.json
new file mode 100644
index 0000000..5f02a95
--- /dev/null
+++ b/wx-mini-program/pages/coupon/coupon.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "优惠券专区",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/coupon/coupon.wxml b/wx-mini-program/pages/coupon/coupon.wxml
new file mode 100644
index 0000000..0942eb5
--- /dev/null
+++ b/wx-mini-program/pages/coupon/coupon.wxml
@@ -0,0 +1,26 @@
+
+
+
+
+ {{item.tag}}
+
+
+ {{item.discount}}元
+ 满{{item.min}}元使用
+
+
+ {{item.name}}
+ {{item.desc}}
+ 有效期:{{item.days}}天
+ 有效期:{{item.startTime}} - {{item.endTime}}
+
+
+
+
+
+
+ 上一页
+ 下一页
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/coupon/coupon.wxss b/wx-mini-program/pages/coupon/coupon.wxss
new file mode 100644
index 0000000..914660e
--- /dev/null
+++ b/wx-mini-program/pages/coupon/coupon.wxss
@@ -0,0 +1,171 @@
+page {
+ background: #f4f4f4;
+ min-height: 100%;
+}
+
+.container {
+ background: #f4f4f4;
+ min-height: 100%;
+ padding-top: 30rpx;
+}
+
+.coupon-list {
+ width: 680rpx;
+ height: auto;
+ overflow: hidden;
+}
+
+.item {
+ position: relative;
+ height: 250rpx;
+ width: 600rpx;
+ background: linear-gradient(to right, #d8050f, #e68d08);
+ margin-bottom: 10rpx;
+ margin-left: 10rpx;
+ margin-right: 30rpx;
+ overflow:hidden;
+ border-radius: 10rpx;
+}
+
+.item:before, .item:after {
+ content: '.';
+ width: 0;
+ height: 200%;
+ position: absolute;
+ top: 20rpx;
+}
+
+.item:before {
+ border-right: 20rpx dotted #eeeeee;
+ left: -10rpx;
+ width: 1rpx;
+}
+
+.item:after {
+ border-left: 20rpx dotted #eeeeee;
+ right: -10rpx;
+}
+
+
+.tag {
+ margin-left: 40rpx;
+ height: 32rpx;
+ background: #b8bb12;
+ padding-left: 16rpx;
+ padding-right: 16rpx;
+ position: absolute;
+ left: 20rpx;
+ color: #fff;
+ top: 20rpx;
+ font-size: 20rpx;
+ text-align: center;
+ line-height: 32rpx;
+}
+
+.content {
+ margin-left: 30rpx;
+ display: flex;
+ margin-right: 40rpx;
+ flex-direction: row;
+}
+
+.content .left {
+ padding-top: 50rpx;
+ flex: 1;
+ border-right: 2rpx dashed rgba(230,230,230,.5);
+}
+
+.discount {
+ font-size: 50rpx;
+ color: #e9f814;
+}
+
+.min {
+ color: #fff;
+}
+
+.content .right {
+ padding: 11px 14px;
+ width: 440rpx;
+}
+
+.name {
+ font-size: 44rpx;
+ color: #fff;
+ margin-bottom: 14rpx;
+}
+
+.desc {
+ font-size: 24rpx;
+ color: #fff;
+}
+
+.time {
+ font-size: 24rpx;
+ color: #fff;
+ line-height: 30rpx;
+}
+
+.couponbg{
+ position: absolute;
+ left: 20%;
+ top: 95rpx;
+ height: 290rpx;
+ width: 730rpx;
+ background-color: rgba(255,255,255,.15);
+ transform: rotate(-20deg);
+}
+
+.condition {
+ position: absolute;
+ width: 100%;
+ bottom: 0;
+ left: 0;
+ height: 78rpx;
+ background: rgba(0, 0, 0, 0.08);
+ padding: 24rpx 40rpx;
+ display: flex;
+ flex-direction: row;
+}
+
+.condition .txt {
+ display: block;
+ height: 30rpx;
+ flex: 1;
+ overflow: hidden;
+ font-size: 24rpx;
+ line-height: 30rpx;
+ color: #fff;
+}
+
+.condition .icon {
+ margin-left: 30rpx;
+ width: 24rpx;
+ height: 24rpx;
+}
+
+
+.page {
+ width: 750rpx;
+ height: 108rpx;
+ background: #fff;
+ margin-bottom: 10rpx;
+}
+
+.page view {
+ height: 108rpx;
+ width: 50%;
+ float: left;
+ font-size: 29rpx;
+ color: #333;
+ text-align: center;
+ line-height: 108rpx;
+}
+
+.page .prev {
+ border-right: 1px solid #d9d9d9;
+}
+
+.page .disabled {
+ color: #ccc;
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/goods/goods.js b/wx-mini-program/pages/goods/goods.js
new file mode 100644
index 0000000..2ee5043
--- /dev/null
+++ b/wx-mini-program/pages/goods/goods.js
@@ -0,0 +1,719 @@
+var app = getApp();
+var WxParse = require('../../lib/wxParse/wxParse.js');
+var util = require('../../utils/util.js');
+var api = require('../../config/api.js');
+var user = require('../../utils/user.js');
+
+Page({
+ data: {
+ id: 0,
+ goods: {},
+ groupon: [], //该商品支持的团购规格
+ grouponLink: {}, //参与的团购
+ attribute: [],
+ issueList: [],
+ comment: [],
+ brand: {},
+ specificationList: [],
+ productList: [],
+ relatedGoods: [],
+ cartGoodsCount: 0,
+ userHasCollect: 0,
+ number: 1,
+ checkedSpecText: '规格数量选择',
+ tmpSpecText: '请选择规格数量',
+ checkedSpecPrice: 0,
+ openAttr: false,
+ openShare: false,
+ noCollectImage: '/static/images/icon_like.png',
+ hasCollectImage: '/static/images/icon_like_checked.png',
+ collectImage: '/static/images/icon_like.png',
+ shareImage: '',
+ isGroupon: false, //标识是否是一个参团购买
+ soldout: false,
+ canWrite: false, //用户是否获取了保存相册的权限
+ },
+
+ // 页面分享
+ onShareAppMessage: function() {
+ let that = this;
+ let userInfo = wx.getStorageSync('userInfo');
+ let shareUserId = 1;
+ if (userInfo) {
+ shareUserId = userInfo.userId;
+ }
+ console.log('分享地址:' + '/pages/index/index?goodId=' + this.data.id + '&shareUserId=' + shareUserId);
+ return {
+ title: that.data.goods.name,
+ desc: '好货分享',
+ path: '/pages/index/index?goodId=' + this.data.id + '&shareUserId=' + shareUserId
+ }
+ },
+
+ shareFriendOrCircle: function() {
+ //var that = this;
+ if (this.data.openShare === false) {
+ this.setData({
+ openShare: !this.data.openShare
+ });
+ } else {
+ return false;
+ }
+ },
+ handleSetting: function(e) {
+ var that = this;
+ // console.log(e)
+ if (!e.detail.authSetting['scope.writePhotosAlbum']) {
+ wx.showModal({
+ title: '警告',
+ content: '不授权无法保存',
+ showCancel: false
+ })
+ that.setData({
+ canWrite: false
+ })
+ } else {
+ wx.showToast({
+ title: '保存成功'
+ })
+ that.setData({
+ canWrite: true
+ })
+ }
+ },
+ // 保存分享图
+ saveShare: function() {
+ let that = this;
+ wx.downloadFile({
+ url: that.data.shareImage,
+ success: function(res) {
+ console.log(res)
+ wx.saveImageToPhotosAlbum({
+ filePath: res.tempFilePath,
+ success: function(res) {
+ wx.showModal({
+ title: '存图成功',
+ content: '图片成功保存到相册了,可以分享到朋友圈了',
+ showCancel: false,
+ confirmText: '好的',
+ confirmColor: '#a78845',
+ success: function(res) {
+ if (res.confirm) {
+ console.log('用户点击确定');
+ }
+ }
+ })
+ },
+ fail: function(res) {
+ console.log('fail')
+ }
+ })
+ },
+ fail: function() {
+ console.log('fail')
+ }
+ })
+ },
+
+ //从分享的团购进入
+ getGrouponInfo: function(grouponId) {
+ let that = this;
+ util.request(api.GroupOnJoin, {
+ grouponId: grouponId
+ }).then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ grouponLink: res.data.groupon,
+ id: res.data.goods.id
+ });
+ //获取商品详情
+ that.getGoodsInfo();
+ }
+ });
+ },
+
+ // 获取商品信息
+ getGoodsInfo: function() {
+ let that = this;
+ util.request(api.GoodsDetail, {
+ id: that.data.id
+ }).then(function(res) {
+ if (res.errno === 0) {
+
+ let _specificationList = res.data.specificationList
+ // 如果仅仅存在一种货品,那么商品页面初始化时默认checked
+ if (_specificationList.length == 1) {
+ if (_specificationList[0].valueList.length == 1) {
+ _specificationList[0].valueList[0].checked = true
+
+ // 如果仅仅存在一种货品,那么商品价格应该和货品价格一致
+ // 这里检测一下
+ let _productPrice = res.data.productList[0].price;
+ let _goodsPrice = res.data.info.retailPrice;
+ if (_productPrice != _goodsPrice) {
+ console.error('商品数量价格和货品不一致');
+ }
+
+ that.setData({
+ checkedSpecText: _specificationList[0].valueList[0].value,
+ tmpSpecText: '已选择:' + _specificationList[0].valueList[0].value,
+ });
+ }
+ }
+
+ that.setData({
+ goods: res.data.info,
+ attribute: res.data.attribute,
+ issueList: res.data.issue,
+ comment: res.data.comment,
+ brand: res.data.brand,
+ specificationList: res.data.specificationList,
+ productList: res.data.productList,
+ userHasCollect: res.data.userHasCollect,
+ shareImage: res.data.shareImage,
+ checkedSpecPrice: res.data.info.retailPrice,
+ groupon: res.data.groupon
+ });
+
+ //如果是通过分享的团购参加团购,则团购项目应该与分享的一致并且不可更改
+ if (that.data.isGroupon) {
+ let groupons = that.data.groupon;
+ for (var i = 0; i < groupons.length; i++) {
+ if (groupons[i].id != that.data.grouponLink.rulesId) {
+ groupons.splice(i, 1);
+ }
+ }
+ groupons[0].checked = true;
+ //重设团购规格
+ that.setData({
+ groupon: groupons
+ });
+
+ }
+
+ if (res.data.userHasCollect == 1) {
+ that.setData({
+ collectImage: that.data.hasCollectImage
+ });
+ } else {
+ that.setData({
+ collectImage: that.data.noCollectImage
+ });
+ }
+
+ WxParse.wxParse('goodsDetail', 'html', res.data.info.detail, that);
+ //获取推荐商品
+ that.getGoodsRelated();
+ }
+ });
+ },
+
+ // 获取推荐商品
+ getGoodsRelated: function() {
+ let that = this;
+ util.request(api.GoodsRelated, {
+ id: that.data.id
+ }).then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ relatedGoods: res.data.goodsList,
+ });
+ }
+ });
+ },
+
+ // 团购选择
+ clickGroupon: function(event) {
+ let that = this;
+
+ //参与团购,不可更改选择
+ if (that.data.isGroupon) {
+ return;
+ }
+
+ let specName = event.currentTarget.dataset.name;
+ let specValueId = event.currentTarget.dataset.valueId;
+
+ let _grouponList = this.data.groupon;
+ for (let i = 0; i < _grouponList.length; i++) {
+ if (_grouponList[i].id == specValueId) {
+ if (_grouponList[i].checked) {
+ _grouponList[i].checked = false;
+ } else {
+ _grouponList[i].checked = true;
+ }
+ } else {
+ _grouponList[i].checked = false;
+ }
+ }
+
+ this.setData({
+ groupon: _grouponList,
+ });
+ },
+
+ // 规格选择
+ clickSkuValue: function(event) {
+ let that = this;
+ let specName = event.currentTarget.dataset.name;
+ let specValueId = event.currentTarget.dataset.valueId;
+
+ //判断是否可以点击
+
+ //TODO 性能优化,可在wx:for中添加index,可以直接获取点击的属性名和属性值,不用循环
+ let _specificationList = this.data.specificationList;
+ for (let i = 0; i < _specificationList.length; i++) {
+ if (_specificationList[i].name === specName) {
+ for (let j = 0; j < _specificationList[i].valueList.length; j++) {
+ if (_specificationList[i].valueList[j].id == specValueId) {
+ //如果已经选中,则反选
+ if (_specificationList[i].valueList[j].checked) {
+ _specificationList[i].valueList[j].checked = false;
+ } else {
+ _specificationList[i].valueList[j].checked = true;
+ //选择了,则判断当前是否有图片,且图片内容不能为空,不能为默认lazy图片,则替换
+ that.setSpecificationUrl(_specificationList[i].valueList[j].picUrl);
+ }
+ } else {
+ _specificationList[i].valueList[j].checked = false;
+ }
+ }
+ }
+ }
+ this.setData({
+ specificationList: _specificationList,
+ });
+ //重新计算spec改变后的信息
+ this.changeSpecInfo();
+
+ //重新计算哪些值不可以点击
+ },
+
+ //获取选中的团购信息
+ getCheckedGrouponValue: function() {
+ let checkedValues = {};
+ let _grouponList = this.data.groupon;
+ for (let i = 0; i < _grouponList.length; i++) {
+ if (_grouponList[i].checked) {
+ checkedValues = _grouponList[i];
+ }
+ }
+
+ return checkedValues;
+ },
+
+ setSpecificationUrl: function (picUrl){
+ if (picUrl && picUrl.length > 1 && picUrl.indexOf("lazyload.png") == -1)
+ this.setData({
+ checkSpecificationUrl: picUrl,
+ });
+ },
+
+ //获取选中的规格信息
+ getCheckedSpecValue: function() {
+ let checkedValues = [];
+ let _specificationList = this.data.specificationList;
+ for (let i = 0; i < _specificationList.length; i++) {
+ let _checkedObj = {
+ name: _specificationList[i].name,
+ valueId: 0,
+ valueText: ''
+ };
+ for (let j = 0; j < _specificationList[i].valueList.length; j++) {
+ if (_specificationList[i].valueList[j].checked) {
+ _checkedObj.valueId = _specificationList[i].valueList[j].id;
+ _checkedObj.valueText = _specificationList[i].valueList[j].value;
+ }
+ }
+ checkedValues.push(_checkedObj);
+ }
+
+ return checkedValues;
+ },
+
+ //判断规格是否选择完整
+ isCheckedAllSpec: function() {
+ return !this.getCheckedSpecValue().some(function(v) {
+ if (v.valueId == 0) {
+ return true;
+ }
+ });
+ },
+
+ getCheckedSpecKey: function() {
+ let checkedValue = this.getCheckedSpecValue().map(function(v) {
+ return v.valueText;
+ });
+ return checkedValue;
+ },
+
+ // 规格改变时,重新计算价格及显示信息
+ changeSpecInfo: function() {
+ let checkedNameValue = this.getCheckedSpecValue();
+
+ //设置选择的信息
+ let checkedValue = checkedNameValue.filter(function(v) {
+ if (v.valueId != 0) {
+ return true;
+ } else {
+ return false;
+ }
+ }).map(function(v) {
+ return v.valueText;
+ });
+ if (checkedValue.length > 0) {
+ this.setData({
+ tmpSpecText: checkedValue.join(' ')
+ });
+ } else {
+ this.setData({
+ tmpSpecText: '请选择规格数量'
+ });
+ }
+
+ if (this.isCheckedAllSpec()) {
+ this.setData({
+ checkedSpecText: this.data.tmpSpecText
+ });
+
+ // 规格所对应的货品选择以后
+ let checkedProductArray = this.getCheckedProductItem(this.getCheckedSpecKey());
+ if (!checkedProductArray || checkedProductArray.length <= 0) {
+ this.setData({
+ soldout: true
+ });
+ console.error('规格所对应货品不存在');
+ return;
+ }
+
+ let checkedProduct = checkedProductArray[0];
+ if (checkedProduct.number > 0) {
+ this.setData({
+ checkedSpecPrice: checkedProduct.price,
+ soldout: false
+ });
+ } else {
+ this.setData({
+ checkedSpecPrice: this.data.goods.retailPrice,
+ soldout: true
+ });
+ }
+
+ } else {
+ this.setData({
+ checkedSpecText: '规格数量选择',
+ checkedSpecPrice: this.data.goods.retailPrice,
+ soldout: false
+ });
+ }
+
+ },
+
+ // 获取选中的产品(根据规格)
+ getCheckedProductItem: function(key) {
+ return this.data.productList.filter(function(v) {
+ console.log(key.toString() + "--" + v.specifications.toString());
+ if (v.specifications.toString() == key.toString()) {
+ return true;
+ } else {
+ return false;
+ }
+ });
+ },
+
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ if (options.id) {
+ this.setData({
+ id: parseInt(options.id)
+ });
+ this.getGoodsInfo();
+ }
+
+ if (options.grouponId) {
+ this.setData({
+ isGroupon: true,
+ });
+ this.getGrouponInfo(options.grouponId);
+ }
+ let that = this;
+ wx.getSetting({
+ success: function (res) {
+ console.log(res)
+ //不存在相册授权
+ if (!res.authSetting['scope.writePhotosAlbum']) {
+ wx.authorize({
+ scope: 'scope.writePhotosAlbum',
+ success: function () {
+ that.setData({
+ canWrite: true
+ })
+ },
+ fail: function (err) {
+ that.setData({
+ canWrite: false
+ })
+ }
+ })
+ } else {
+ that.setData({
+ canWrite: true
+ });
+ }
+ }
+ })
+ },
+ onShow: function() {
+ // 页面显示
+ var that = this;
+ util.request(api.CartGoodsCount).then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ cartGoodsCount: res.data
+ });
+ }
+ });
+ },
+
+ //添加或是取消收藏
+ addCollectOrNot: function() {
+ let that = this;
+ util.request(api.CollectAddOrDelete, {
+ type: 0,
+ valueId: this.data.id
+ }, "POST")
+ .then(function(res) {
+ let _res = res;
+ if (_res.errno == 0) {
+ if (_res.data.type == 'add') {
+ that.setData({
+ collectImage: that.data.hasCollectImage
+ });
+ } else {
+ that.setData({
+ collectImage: that.data.noCollectImage
+ });
+ }
+
+ } else {
+ wx.showToast({
+ image: '/static/images/icon_error.png',
+ title: _res.errmsg,
+ mask: true
+ });
+ }
+
+ });
+
+ },
+
+ //立即购买(先自动加入购物车)
+ addFast: function() {
+ var that = this;
+ if (this.data.openAttr == false) {
+ //打开规格选择窗口
+ this.setData({
+ openAttr: !this.data.openAttr
+ });
+ } else {
+
+ //提示选择完整规格
+ if (!this.isCheckedAllSpec()) {
+ wx.showToast({
+ image: '/static/images/icon_error.png',
+ title: '请选择完整规格'
+ });
+ return false;
+ }
+
+ //根据选中的规格,判断是否有对应的sku信息
+ let checkedProductArray = this.getCheckedProductItem(this.getCheckedSpecKey());
+ if (!checkedProductArray || checkedProductArray.length <= 0) {
+ //找不到对应的product信息,提示没有库存
+ wx.showToast({
+ image: '/static/images/icon_error.png',
+ title: '没有库存'
+ });
+ return false;
+ }
+
+ let checkedProduct = checkedProductArray[0];
+ //验证库存
+ if (checkedProduct.number <= 0) {
+ wx.showToast({
+ image: '/static/images/icon_error.png',
+ title: '没有库存'
+ });
+ return false;
+ }
+
+ //验证团购是否有效
+ let checkedGroupon = this.getCheckedGrouponValue();
+
+ //立即购买
+ util.request(api.CartFastAdd, {
+ goodsId: this.data.goods.id,
+ number: this.data.number,
+ productId: checkedProduct.id
+ }, "POST")
+ .then(function(res) {
+ if (res.errno == 0) {
+
+ // 如果storage中设置了cartId,则是立即购买,否则是购物车购买
+ try {
+ wx.setStorageSync('cartId', res.data);
+ wx.setStorageSync('grouponRulesId', checkedGroupon.id);
+ wx.setStorageSync('grouponLinkId', that.data.grouponLink.id);
+ wx.navigateTo({
+ url: '/pages/checkout/checkout'
+ })
+ } catch (e) {}
+
+ } else {
+ wx.showToast({
+ image: '/static/images/icon_error.png',
+ title: res.errmsg,
+ mask: true
+ });
+ }
+ });
+ }
+
+
+ },
+
+ //添加到购物车
+ addToCart: function() {
+ var that = this;
+ if (this.data.openAttr == false) {
+ //打开规格选择窗口
+ this.setData({
+ openAttr: !this.data.openAttr
+ });
+ } else {
+
+ //提示选择完整规格
+ if (!this.isCheckedAllSpec()) {
+ wx.showToast({
+ image: '/static/images/icon_error.png',
+ title: '请选择完整规格'
+ });
+ return false;
+ }
+
+ //根据选中的规格,判断是否有对应的sku信息
+ let checkedProductArray = this.getCheckedProductItem(this.getCheckedSpecKey());
+ if (!checkedProductArray || checkedProductArray.length <= 0) {
+ //找不到对应的product信息,提示没有库存
+ wx.showToast({
+ image: '/static/images/icon_error.png',
+ title: '没有库存'
+ });
+ return false;
+ }
+
+ let checkedProduct = checkedProductArray[0];
+ //验证库存
+ if (checkedProduct.number <= 0) {
+ wx.showToast({
+ image: '/static/images/icon_error.png',
+ title: '没有库存'
+ });
+ return false;
+ }
+
+ //添加到购物车
+ util.request(api.CartAdd, {
+ goodsId: this.data.goods.id,
+ number: this.data.number,
+ productId: checkedProduct.id
+ }, "POST")
+ .then(function(res) {
+ let _res = res;
+ if (_res.errno == 0) {
+ wx.showToast({
+ title: '添加成功'
+ });
+ that.setData({
+ openAttr: !that.data.openAttr,
+ cartGoodsCount: _res.data
+ });
+ if (that.data.userHasCollect == 1) {
+ that.setData({
+ collectImage: that.data.hasCollectImage
+ });
+ } else {
+ that.setData({
+ collectImage: that.data.noCollectImage
+ });
+ }
+ } else {
+ wx.showToast({
+ image: '/static/images/icon_error.png',
+ title: _res.errmsg,
+ mask: true
+ });
+ }
+
+ });
+ }
+
+ },
+
+ cutNumber: function() {
+ this.setData({
+ number: (this.data.number - 1 > 1) ? this.data.number - 1 : 1
+ });
+ },
+ addNumber: function() {
+ this.setData({
+ number: this.data.number + 1
+ });
+ },
+ onHide: function() {
+ // 页面隐藏
+
+ },
+ onUnload: function() {
+ // 页面关闭
+
+ },
+ switchAttrPop: function() {
+ if (this.data.openAttr == false) {
+ this.setData({
+ openAttr: !this.data.openAttr
+ });
+ }
+ },
+ closeAttr: function() {
+ this.setData({
+ openAttr: false,
+ });
+ },
+ closeShare: function() {
+ this.setData({
+ openShare: false,
+ });
+ },
+ openCartPage: function() {
+ wx.switchTab({
+ url: '/pages/cart/cart'
+ });
+ },
+ onReady: function() {
+ // 页面渲染完成
+
+ },
+ // 下拉刷新
+ onPullDownRefresh() {
+ wx.showNavigationBarLoading() //在标题栏中显示加载
+ this.getGoodsInfo();
+ wx.hideNavigationBarLoading() //完成停止加载
+ wx.stopPullDownRefresh() //停止下拉刷新
+ },
+ //根据已选的值,计算其它值的状态
+ setSpecValueStatus: function() {
+
+ },
+
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/goods/goods.json b/wx-mini-program/pages/goods/goods.json
new file mode 100644
index 0000000..7d505f9
--- /dev/null
+++ b/wx-mini-program/pages/goods/goods.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "商品详情",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/goods/goods.wxml b/wx-mini-program/pages/goods/goods.wxml
new file mode 100644
index 0000000..3cf4b95
--- /dev/null
+++ b/wx-mini-program/pages/goods/goods.wxml
@@ -0,0 +1,196 @@
+
+
+
+
+
+
+
+
+ {{goods.name}}
+ 分享
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{goods.brief}}
+
+ ¥{{checkedSpecPrice}}
+ ¥{{goods.counterPrice}}
+
+
+
+
+ {{brand.name}}
+
+
+
+
+
+
+ {{checkedSpecText}}
+
+
+
+
+
+ 评价({{comment.count > 999 ? '999+' : comment.count}})
+ 查看全部
+
+
+
+
+
+
+
+ {{item.nickname}}
+
+ {{item.addTime}}
+
+
+ {{item.content}}
+
+
+
+
+
+
+
+
+ 商品参数
+
+
+ {{item.attribute}}
+ {{item.value}}
+
+
+
+
+
+
+
+
+
+
+
+
+ 常见问题
+
+
+
+
+
+ {{item.question}}
+
+
+ {{item.answer}}
+
+
+
+
+
+
+
+
+
+ 大家都在看
+
+
+
+
+
+ {{item.name}}
+ ¥{{item.retailPrice}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 价格:¥{{checkedSpecPrice}}
+ {{tmpSpecText}}
+
+
+
+
+
+
+
+ {{item.name}}
+
+ {{vitem.value}}
+
+
+
+
+
+ 团购立减
+
+ ¥{{vitem.discount}} ({{vitem.discountMember}}人)
+
+
+
+
+
+
+ 数量
+
+ -
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{cartGoodsCount}}
+
+
+
+ 加入购物车
+ {{isGroupon?'参加团购':'立即购买'}}
+ 商品已售空
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/goods/goods.wxss b/wx-mini-program/pages/goods/goods.wxss
new file mode 100644
index 0000000..52f89e8
--- /dev/null
+++ b/wx-mini-program/pages/goods/goods.wxss
@@ -0,0 +1,938 @@
+.container {
+ margin-bottom: 100rpx;
+}
+
+.goodsimgs {
+ width: 750rpx;
+ height: 750rpx;
+}
+
+.goodsimgs image {
+ width: 750rpx;
+ height: 750rpx;
+}
+
+.commodity_screen {
+ width: 100%;
+ height: 100%;
+ position: fixed;
+ top: 0;
+ left: 0;
+ background: #000;
+ opacity: 0.2;
+ overflow: hidden;
+ z-index: 1000;
+ color: #fff;
+}
+
+.commodity_attr_box {
+ width: 100%;
+ overflow: hidden;
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ z-index: 2000;
+ background: #fff;
+ padding-top: 20rpx;
+}
+
+.goods-info {
+ width: 750rpx;
+ height: 300rpx;
+ overflow: hidden;
+ background: #fff;
+}
+
+.goods-info .c {
+ display: block;
+ width: 718.75rpx;
+ height: 100%;
+ margin-left: 31.25rpx;
+ padding: 18rpx 31.25rpx 38rpx 0;
+ border-bottom: 1px solid #f4f4f4;
+}
+
+.goods-info .c text {
+ display: block;
+ width: 687.5rpx;
+ text-align: left;
+}
+
+.goods_name {
+ /* border: 1px solid black; */
+ height: 90rpx;
+ line-height: 86rpx;
+ border-bottom: 1px solid #fafafa;
+}
+
+.goods_name_left {
+ /* border: 1px solid #757575; */
+ float: left;
+ height: 90rpx;
+ line-height: 86rpx;
+ margin-left: 25rpx;
+ width: 76%;
+ letter-spacing: 1rpx;
+ overflow: hidden;
+ text-overflow:ellipsis;
+ white-space: nowrap;
+}
+
+.goods_name_right {
+ float: right;
+ font-weight: 550;
+ margin-top: 28rpx;
+ width: 18%;
+ height: 90rpx;
+ line-height: 85rpx;
+ padding: 0;
+ margin: 0;
+ margin-right: 0rpx;
+ text-align: center;
+ font-size: 30rpx;
+ color: #f4f4f4;
+ border-top-left-radius: 50rpx;
+ border-bottom-left-radius: 50rpx;
+ border-top-right-radius: 0rpx;
+ border-bottom-right-radius: 0rpx;
+ letter-spacing: 3rpx;
+ /* background-image: linear-gradient(to right, #ff7701 100%); */
+ background-image: linear-gradient(to right, #f3d10e 0%, #f48f18 100%);
+}
+
+.goods-info .desc {
+ height: 43rpx;
+ margin-bottom: 41rpx;
+ line-height: 36rpx;
+}
+
+.goods-info .price {
+ height: 70rpx;
+ align-content: center;
+}
+
+.goods-info .counterPrice {
+ padding-left: 5%;
+ text-decoration: line-through;
+}
+
+.goods-info .retailPrice {
+ float: left;
+ padding-left: 0rpx;
+}
+
+.goods-info .brand {
+ margin-top: 23rpx;
+ min-height: 40rpx;
+ text-align: left;
+}
+
+.goods-info .brand text {
+ display: inline-block;
+ width: auto;
+ padding: 2px 30rpx 2px 10.5rpx;
+ line-height: 35.5rpx;
+ border: 1px solid #f48f18;
+ font-size: 26rpx;
+ color: #f48f18;
+ border-radius: 4px;
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAASCAMAAABVab95AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABFUExURUdwTPSPGPSPGPSPGPSPGPSPGPSPGPSPGPSPGPSPGPSPGPSPGPSPGPSPGPSPGPSPGPSPGPSPGPSPGPSPGPSPGPSPGPSPGPYJSdIAAAAWdFJOUwAWD/DBJz/LB/iy5Omi0N0eMpVL01IOd4F9AAAAVUlEQVQI113OUQ6AIAwDUIbIRBBUtPc/qiZuzriv97G0dXysTo7RRiExstoHlE08BQxRPX+8IHXNuX2qdxRjtoeuESn+wqzOM8ozguo7p6Lp4MAkugBtDwOjtuSdGAAAAABJRU5ErkJggg==') 95% center no-repeat;
+ background-size: 10.75rpx 18.75rpx;
+}
+
+.section-nav {
+ width: 750rpx;
+ height: 108rpx;
+ background: #fff;
+ margin-bottom: 20rpx;
+}
+
+.section-nav .t {
+ float: left;
+ width: 600rpx;
+ height: 108rpx;
+ line-height: 108rpx;
+ margin-left: 31.25rpx;
+}
+
+.section-nav .i {
+ float: right;
+ width: 52rpx;
+ height: 52rpx;
+ margin-right: 16rpx;
+ margin-top: 28rpx;
+}
+
+.section-act .t {
+ float: left;
+ display: flex;
+ align-items: center;
+ width: 600rpx;
+ height: 108rpx;
+ overflow: hidden;
+ line-height: 108rpx;
+ margin-left: 31.25rpx;
+}
+
+.section-act .label {
+ color: #999;
+}
+
+.section-act .tag {
+ display: flex;
+ align-items: center;
+ padding: 0 10rpx;
+ border-radius: 3px;
+ height: 37rpx;
+ width: auto;
+ color: #f48f18;
+ overflow: hidden;
+ border: 1px solid #f48f18;
+ font-size: 25rpx;
+ margin: 0 10rpx;
+}
+
+.section-act .text {
+ display: flex;
+ align-items: center;
+ height: 37rpx;
+ width: auto;
+ overflow: hidden;
+ color: #f48f18;
+ font-size: 29rpx;
+}
+
+.comments {
+ width: 100%;
+ height: auto;
+ padding-left: 30rpx;
+ background: #fff;
+ margin: 20rpx 0;
+}
+
+.comments .h {
+ height: 102.5rpx;
+ line-height: 100.5rpx;
+ width: 718.75rpx;
+ padding-right: 16rpx;
+ border-bottom: 1px solid #dfdfdf;
+}
+
+.comments .h .t {
+ display: block;
+ float: left;
+ width: 50%;
+}
+
+.comments .h .i {
+ display: block;
+ float: right;
+ width: 164rpx;
+ height: 100.5rpx;
+ line-height: 100.5rpx;
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAAAAAA7VNdtAAAA4klEQVRIx+2VPQuCABCG/bVvmgiCfVM0CH2SQdBiEERDNNbk5laTkzREkEMQBRIEhaFprQ0RvNDo7c9w9z53J7zoElIkRT6rVT2xSBfankQCA4pL9hKNIK3I9pM5MhY7MSuDeUIOeS3BjMhcXAVGQEbpadCvZPqnMipnUpirjpxHOhb0oGxILSMTWYc0OZmhQCLPMUoc8hhAdink1oS6o9r3aygeqSEf8qhfqCi3Kto3ShhHxjCktLRFTGJK/iWwoFYsnkK0qUUOh1/M+oncO1C33FFqIH8gT19f99OXlCL/Q97bCIp/pz2QqAAAAABJRU5ErkJggg==') right center no-repeat;
+ background-size: 52rpx;
+}
+
+.comments .b {
+ height: auto;
+ width: 720rpx;
+}
+
+.comments .item {
+ height: auto;
+ width: 720rpx;
+ overflow: hidden;
+}
+
+.comments .info {
+ height: 117rpx;
+ width: 100%;
+ padding: 15rpx 0 15rpx 0;
+}
+
+.comments .user {
+ float: left;
+ width: 40%;
+ height: 87rpx;
+ line-height: 87rpx;
+ font-size: 0;
+}
+
+.comments .user image {
+ display: block;
+ float: left;
+ width: 67rpx;
+ height: 67rpx;
+ margin-right: 27rpx;
+ border-radius: 50%;
+ overflow: hidden;
+}
+
+.comments .user text {
+ display: block;
+ width: auto;
+ height: 66rpx;
+ overflow: hidden;
+ font-size: 29rpx;
+ line-height: 66rpx;
+}
+
+.comments .time {
+ display: block;
+ float: right;
+ width: auto;
+ height: 67rpx;
+ line-height: 67rpx;
+ color: #999;
+ font-size: 28rpx;
+ margin-right: 30rpx;
+}
+
+.comments .content {
+ width: 720rpx;
+ padding-right: 30rpx;
+ line-height: 45.8rpx;
+ font-size: 28rpx;
+ margin-bottom: 15rpx;
+}
+
+.comments .imgs {
+ width: 720rpx;
+ height: auto;
+ margin-bottom: 25rpx;
+}
+
+.comments .imgs .img {
+ height: 150rpx;
+ width: 150rpx;
+ margin-right: 28rpx;
+}
+
+.comments .spec {
+ width: 720rpx;
+ padding-right: 30rpx;
+ line-height: 30rpx;
+ font-size: 24rpx;
+ color: #999;
+ margin-bottom: 30rpx;
+}
+
+.goods-attr {
+ width: 750rpx;
+ height: auto;
+ overflow: hidden;
+ padding: 0 31.25rpx 25rpx 31.25rpx;
+ background: #fff;
+}
+
+.goods-attr .t {
+ width: 687.5rpx;
+ height: 104rpx;
+ line-height: 104rpx;
+}
+
+.goods-attr .item {
+ width: 687.5rpx;
+ height: 65rpx;
+ padding: 10rpx 20rpx;
+ margin-bottom: 3rpx;
+ background: #f7f7f7;
+}
+
+.goods-attr .left {
+ float: left;
+ font-size: 28rpx;
+ width: 134rpx;
+ height: 45rpx;
+ line-height: 45rpx;
+ overflow: hidden;
+ color: #666;
+ font-weight: bold;
+}
+
+.goods-attr .right {
+ float: left;
+ font-size: 28rpx;
+ margin-left: 35rpx;
+ width: 465rpx;
+ height: 45rpx;
+ line-height: 45rpx;
+ overflow: hidden;
+ color: #666;
+}
+
+.detail {
+ width: 750rpx;
+ height: auto;
+ overflow: hidden;
+}
+
+.detail image {
+ width: 750rpx;
+ display: block;
+}
+
+.common-problem {
+ width: 750rpx;
+ height: auto;
+ overflow: hidden;
+}
+
+.common-problem .h {
+ position: relative;
+ height: 145.5rpx;
+ width: 750rpx;
+ padding: 56.25rpx 0;
+ background: #fff;
+ text-align: center;
+}
+
+.common-problem .h .line {
+ display: inline-block;
+ position: absolute;
+ top: 72rpx;
+ left: 0;
+ z-index: 2;
+ height: 1px;
+ margin-left: 225rpx;
+ width: 300rpx;
+ background: #ccc;
+}
+
+.common-problem .h .title {
+ display: inline-block;
+ position: absolute;
+ top: 56.125rpx;
+ left: 0;
+ z-index: 3;
+ height: 33rpx;
+ margin-left: 285rpx;
+ width: 180rpx;
+ background: #fff;
+}
+
+.common-problem .b {
+ width: 750rpx;
+ height: auto;
+ overflow: hidden;
+ padding: 0rpx 30rpx;
+ background: #fff;
+}
+
+.common-problem .item {
+ height: auto;
+ overflow: hidden;
+ padding-bottom: 25rpx;
+}
+
+.common-problem .question-box .spot {
+ float: left;
+ display: block;
+ height: 8rpx;
+ width: 8rpx;
+ background: #b4282d;
+ border-radius: 50%;
+ margin-top: 11rpx;
+}
+
+.common-problem .question-box .question {
+ float: left;
+ line-height: 30rpx;
+ padding-left: 8rpx;
+ display: block;
+ font-size: 26rpx;
+ padding-bottom: 15rpx;
+ color: #303030;
+}
+
+.common-problem .answer {
+ line-height: 36rpx;
+ padding-left: 16rpx;
+ font-size: 26rpx;
+ color: #787878;
+}
+
+.related-goods {
+ width: 750rpx;
+ height: auto;
+ overflow: hidden;
+ padding-bottom: 80rpx;
+}
+
+.related-goods .h {
+ position: relative;
+ height: 145.5rpx;
+ width: 750rpx;
+ padding: 56.25rpx 0;
+ background: #fff;
+ text-align: center;
+ border-bottom: 1px solid #f4f4f4;
+}
+
+.related-goods .h .line {
+ display: inline-block;
+ position: absolute;
+ top: 72rpx;
+ left: 0;
+ z-index: 2;
+ height: 1px;
+ margin-left: 225rpx;
+ width: 300rpx;
+ background: #ccc;
+}
+
+.related-goods .h .title {
+ display: inline-block;
+ position: absolute;
+ top: 56.125rpx;
+ left: 0;
+ z-index: 3;
+ height: 33rpx;
+ margin-left: 285rpx;
+ width: 180rpx;
+ background: #fff;
+}
+
+.related-goods .b {
+ width: 750rpx;
+ height: auto;
+ overflow: hidden;
+}
+
+.related-goods .b .item {
+ float: left;
+ background: #fff;
+ width: 375rpx;
+ height: auto;
+ overflow: hidden;
+ text-align: center;
+ padding: 15rpx 31.25rpx;
+ border-right: 1px solid #f4f4f4;
+ border-bottom: 1px solid #f4f4f4;
+}
+
+.related-goods .item .img {
+ width: 311.45rpx;
+ height: 311.45rpx;
+}
+
+.related-goods .item .name {
+ display: block;
+ width: 311.45rpx;
+ height: 35rpx;
+ margin: 11.5rpx 0 15rpx 0;
+ text-align: center;
+ overflow: hidden;
+ font-size: 30rpx;
+ color: #333;
+}
+
+.related-goods .item .price {
+ display: block;
+ width: 311.45rpx;
+ height: 30rpx;
+ text-align: center;
+ font-size: 30rpx;
+ color: #b4282d;
+}
+
+.bottom-btn {
+ position: fixed;
+ left: 0;
+ bottom: 0;
+ z-index: 10;
+ width: 750rpx;
+ height: 100rpx;
+ display: flex;
+ background: #fff;
+}
+
+.bottom-btn .l {
+ float: left;
+ height: 100rpx;
+ width: 162rpx;
+ border: 1px solid #f4f4f4;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.bottom-btn .l.l-collect {
+ border-right: none;
+ border-left: none;
+ text-align: center;
+ width: 90rpx;
+}
+
+.bottom-btn .l.l-kefu {
+ position: relative;
+ height: 54rpx;
+ width: 63rpx;
+}
+
+.bottom-btn .l.l-cart .box {
+ position: relative;
+ height: 60rpx;
+ width: 60rpx;
+}
+
+.bottom-btn .l.l-cart .cart-count {
+ height: 28rpx;
+ width: 28rpx;
+ z-index: 10;
+ position: absolute;
+ top: 0;
+ right: 0;
+ background: #b4282d;
+ text-align: center;
+ font-size: 18rpx;
+ color: #fff;
+ line-height: 28rpx;
+ border-radius: 50%;
+}
+
+.bottom-btn .l.l-cart .icon {
+ position: absolute;
+ top: 10rpx;
+ left: 0;
+}
+
+.bottom-btn .l.l-kefu .kefu-count {
+ height: 28rpx;
+ width: 28rpx;
+ z-index: 10;
+ position: absolute;
+ top: 0;
+ right: 0;
+ /* background: #b4282d; */
+ text-align: center;
+ font-size: 18rpx;
+ color: #fff;
+ line-height: 28rpx;
+ border-radius: 50%;
+}
+
+.bottom-btn .l.l-kefu .icon {
+ position: absolute;
+ top: 10rpx;
+ left: 0;
+}
+
+.bottom-btn .l .icon {
+ display: block;
+ height: 44rpx;
+ width: 44rpx;
+}
+
+.bottom-btn .c {
+ float: left;
+ background: #b4282d;
+ height: 100rpx;
+ line-height: 96rpx;
+ flex: 1;
+ text-align: center;
+ color: #fff;
+ /* border-top: 2px solid #f4f4f4; *//* border-bottom: 2px solid #f4f4f4; */
+}
+
+.bottom-btn .r {
+ border: 1px solid #f48f18;
+ background: #f48f18;
+ float: left;
+ height: 100rpx;
+ line-height: 96rpx;
+ flex: 1;
+ text-align: center;
+ color: #fff;
+}
+
+.bottom-btn .n {
+ border: 1px solid #c0b8ae;
+ background: #c0b8ae;
+ float: left;
+ height: 100rpx;
+ line-height: 96rpx;
+ flex: 1;
+ text-align: center;
+ color: #fff;
+}
+
+@import "../../lib/wxParse/wxParse.wxss";
+
+.attr-pop-box {
+ width: 100%;
+ height: 100%;
+ position: fixed;
+ background: rgba(0, 0, 0, 0.5);
+ z-index: 8;
+ bottom: 0;
+ /* display: none; */
+}
+
+.attr-pop {
+ width: 100%;
+ height: auto;
+ max-height: 780rpx;
+ padding: 31.25rpx;
+ background: #fff;
+ position: fixed;
+ z-index: 9;
+ bottom: 100rpx;
+ border-top-left-radius: 20rpx;
+ border-bottom-left-radius: 0rpx;
+ border-top-right-radius: 20rpx;
+ border-bottom-right-radius: 0rpx;
+}
+
+.attr-pop .close {
+ position: absolute;
+ width: 48rpx;
+ height: 48rpx;
+ right: 31.25rpx;
+ overflow: hidden;
+ top: 31.25rpx;
+}
+
+.attr-pop .close .icon {
+ width: 48rpx;
+ height: 48rpx;
+}
+
+.attr-pop .img-info {
+ width: 687.5rpx;
+ height: 177rpx;
+ overflow: hidden;
+ margin-bottom: 41.5rpx;
+}
+
+.attr-pop .img {
+ float: left;
+ height: 177rpx;
+ width: 177rpx;
+ background: #f4f4f4;
+ margin-right: 31.25rpx;
+}
+
+.attr-pop .info {
+ float: left;
+ height: 177rpx;
+ display: flex;
+ align-items: center;
+}
+
+.attr-pop .p {
+ font-size: 33rpx;
+ color: #333;
+ height: 33rpx;
+ line-height: 33rpx;
+ margin-bottom: 10rpx;
+}
+
+.attr-pop .a {
+ font-size: 29rpx;
+ color: #333;
+ height: 40rpx;
+ line-height: 40rpx;
+}
+
+.spec-con {
+ width: 100%;
+ height: auto;
+ overflow: hidden;
+}
+
+.spec-con .name {
+ height: 32rpx;
+ line-height: 32rpx;
+ margin-bottom: 22rpx;
+ font-size: 29rpx;
+ color: #333;
+}
+
+.spec-con .values {
+ height: auto;
+ margin-bottom: 31.25rpx;
+ font-size: 0;
+}
+
+.spec-con .value {
+ display: inline-block;
+ height: 62rpx;
+ padding: 0 15rpx;
+ line-height: 56rpx;
+ text-align: center;
+ margin-right: 25rpx;
+ margin-bottom: 16.5rpx;
+ border: 1px solid #999;
+ border-radius:6rpx;
+ font-size: 25rpx;
+ color: #999;
+}
+
+.spec-con .value.disable {
+ border: 1px solid #ccc;
+ color: #ccc;
+}
+
+.spec-con .value.selected {
+ border: 1px solid #f0070e;
+ color: #fff;
+ background: #f0070e;
+}
+
+.number-item .selnum {
+ width: 322rpx;
+ height: 71rpx;
+ border: 1px solid #ccc;
+ display: flex;
+}
+
+.number-item .cut {
+ width: 93.75rpx;
+ height: 100%;
+ text-align: center;
+ line-height: 65rpx;
+}
+
+.number-item .number {
+ flex: 1;
+ height: 100%;
+ text-align: center;
+ line-height: 68.75rpx;
+ border-left: 1px solid #ccc;
+ border-right: 1px solid #ccc;
+ float: left;
+}
+
+.number-item .add {
+ width: 93.75rpx;
+ height: 100%;
+ text-align: center;
+ line-height: 65rpx;
+}
+
+.contact {
+ height: 80rpx;
+ width: 80rpx;
+ border-radius: 100%;
+ position: fixed;
+ bottom: 106rpx;
+ right: 10rpx;
+ font-size: 20rpx;
+ box-sizing: border-box;
+ background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAgAElEQVR4Xu19C5hcRZX/OdXdk4QgBBVkCYjy9AW4oqC88bWAD1wgAXxtUAiSZLrqTkICLsiA60LCZG5VTx7+B1B8++e1qIuPFeXhosACLoso8lLAJApqJiskM+npe/7fwY7/kMz0rXv73tu3u6u+b76e7+uqU+f86v66blWdOgfBFYeAQ2BSBNBh4xBwCEyOgCOIezocAg0QcARxj4dDwBGktc+AUmqGEGLvWq22NwC8GhF3I6IdAWAHRNyBiLZ8TgWAMUTcSEQb+RMA+P/nEfFPQRA8JYR4qlAoPL18+fI/ttaq7ujdzSAJjvPixYtftnnz5rcBwFuJ6O0AsD8iMilelmA3L4qqE+gpAHgcAO4BgAfGxsbuXr169fqk++pmeY4gTYx+uVx+kxDiWCI6AhHfCgAHNCEuqaa/BYD7AOBnQRDcUalU7k9KcDfKcQSJMOoLFix4nRDiOCHE8QBwHADsFqF5q6qOAMAdiHhbEAS3GWMe4gmoVcq0W7+OICEj5nney4noE0R0NiIe2G4DPIG+TxHRF6rV6vCqVat+3wH2pGqCI8jE8KLnee8honOI6GRELKU6Ci0QTkQ1RPw+EQ2vXbv2luuvv77WAjVy36UjyFZDNG/evB17eno+BQDzAeA1uR+95BRcBwArx8bGVrlF/ktBdQQBgHnz5u3e09PjAcC5ALBzcs9d20l6AQC+UCgUli9fvpx3yLq+dDVBlFKvJ6ILEPHjKT8JmwBgHRGtBYA/8P+I+CyfbwAAn3G8+Fer1fhzOp+RCCH4nGRH/h8RXwkAf0dEu/Mn/yEif59muU4I8a+Dg4MPptlJ3mV3JUEWLFjw2mKx+FkAOBMARMKDxETgrdUHAOD+IAgeGBoa+l3CfUBvb++uiHioEOJQAHhL/S/R10IiIkS8kYguMsb8Omkb2kFeVxFEKcW/wpcAwCcSXHg/Q0S3EdHtiPgjY8zTrRr4RYsW7VatVnkL+nhE5M9EzmV4QQ8AXxZCXOz7/ppW2deKfruCIJ7nTSOiywBgURIgE9EjiHgNIt7s+z6fZOey1NdWJxDRPwLAexGRXVmaKkRUKZVKnx4YGOD1SseXjidIuVw+XgjxRQBgl49mCu/0fAMAvqa15tentipz587dYfr06bx1fSoRzWqGLET0OyHEJ33f/4+2AiGGsh1LkCVLluw8NjY2yK9TMXDZ0mQzAHw7CIIvrlu37gedclbQ29u7U6FQOJuIFiDia5vA51oA8LTWfFrfkaUjCSKlfD8AXIWIvOsTuRDRLwBgNSJ+vZMHn4GRUn4QABYi4jGRgfqr0+TvhRBzfd//Tpz2eW/TUQTp7+8XIyMjlwPA4pjAP0RElxpjbuo2fyWl1JFEdAUiHhUHOyJaussuu3y6v78/iNM+r206hiB1n6nrAeCdUcEmol8KIS71fZ/bd7UjH6/ZEPGymET58ZQpU05ZunTphqhjkNf6HUEQKeXBAHALIu4ZEegXiOhiY4zudmJsi5vneScHQeDHWKM8VavVThoaGvplxLHIZfW2J4jnebOJ6P/GQPdWXqg6l4rGyCmlLgYA3iK3LkQ0KoQ4w/f9b1k3ymnFtiaIUkoBgB8FWyJaT0QLK5UKb/26YoFAb2/vnoVCYRgATrSovnWVc7TWV0dsk6vqbUsQpdSVMQ7+bi0Wix8ZGBh4Nlej0CbKSCkXAsDlUbwQ6q+w/9ImJm6nZtsRhHeq1q9f/01EnGULOhH9LwD0GWOusW3j6k2MgFKK/b5uBoC9bDEioquMMXNt6+epXlsRZM6cOVN33nnnmxHxH2xBJKL/LBQKHx4cHHzGto2r1xiB+iHslwDgZFuseJ1ojDnDtn5e6rUNQebOnVvaYYcdvgsA77YFj4j8tWvXnt8pJ+C2dmdVT0q5BAA+h4gFmz7bkSRtQZD6a9V3EPEkm4EAgBcQ8cw8nu6y42QQBPsT0a5CCL6cNZ3vffAnx8cCAL47wo6AfFfkxU9EfG7jxo2PDA8Pc5ysXJX6ucn1iPgKG8Xa7XWrLQgipbzOds1BRE8HQXBiHvbhPc97IxHx6+BBRLQfAOwX1/2l/vDxJSv2HuY/Pme4yxjznzYPZpp1eJdLCMHnUHweFVp4ZjfG9IVWzEGF3BNESvmlCDf+flur1Y5O44KSzVjVZ4d3AcD7EJG3RJv1ILbpluvcDgA/IaJbjTF32jZKsl7dAZLPPTgckk3p11pfalOxlXVyTRClFB9Q8UFVaCGiX5dKpWOy3sLltdH06dNPCILgwwDwQQ4lGqpsihWI6AlEHEbEq33f/3OKXW0nur+/v2dkZISvBJxi0y8inu77/nU2dVtVJ7cEKZfLZwghGGyb8qtisXhcluQol8scTZFvJp4KADNslGxBnRuCIFhVqVRuy7JvKSV7QnN0mNBCRIcZY/4rtGKLKuSSIOVy+VBEvAsRp4ThQkSPbd68+fCswtUopd4HABcCwJFhuuXl+7r7/gohxJd93+dNgNSL7bqRiJ6rVqsH5zWIXe4I4nneTCL6bwDgSB4NCxH9plqtHpEFuEqp0wDgIgA4JEyvHH//FyL6khDiirTvls+aNaswc+ZMvnEY6l1NRD/fsGHDEddee+1o3rDLHUGUUj8HgDdbAMVeo0elvSCXUh6DiJ8HgNdb6NQuVdiL+ZK1a9fqNM+I6oH4eJfN5kflK1rrtMMvRR6fXBFESjmIiBzALWzm+JMQ4jDf958Mqxv3+76+vgOCIGA3+KgOenG7zLwd34MBgDlprgGklK9CRF5jhLqmBEFwZqVS+WbmQDToMDcEUUrxVPyjMHCIqEpE70grrD8HN5g2bdqViDgvTJdO+Z6IVmzYsOH8tF5xlFL8RvBTAJjWCDP2mQuC4I1pvxVEGbdcEGT+/PmvKJVKj9isOwDgw1pr292tKFjw/Ww+6LoJEfeN1LADKvM2OQDMNsb8Txrm8AUsImInx7C3g7uNMe8Iq5fV97kgiJTyVkTkA7Yw8K40xsS9b95QNrtyI+K/AkBPmB6d+j0RjQkhlvi+b9Kw0fZci4guNMZckYYOUWW2nCBSyo8jInuGhpUfa61DSRQmZNvvOW3a2NjYjYj4nqhtO7U+EX23VCrNTiM4nJTye4h4Qhh24+Pj+6xYseI3YfXS/r6lBKlHPORQnQ23dPkWIO8iGWM48HNiZeHCha+s1WrspvHGxIR2iCDeehVCvDvp03jGfHx8/FFE3CUEqpu01nwI29LSUoJIKTnMDLtMNyxBELyvUqmwq3tiRUrJ2WbZbykrf6nEdM9Q0OO1Wu34pBfNHIsLEUPvq3MiVGMMJyhtWWkZQeoeoE9aXN+8Wmt9TpII9fX1HVKr1X6IiLsmKbdDZXG0+uOTju6ulOKYAHMaYcazmDGGbzC2rLSMIEop3tFoeCONY8Bu2rTpwCTvQfT29r6hUCjcnUZq5paNYsodE9Gf6lvrjyXVVf0Q8dF6vpNGYs/SWnOI05aUlhDE8zxOnczv/mHlVK01RzlMpNTzgjA52iE7bSI2JyWEk/8EQXB4kq9bSqmPAMBXQ2aRtcaYmUnZEVVOSwiilOL3ysNCgOGUxaF+PLYGc24QAOB+Q090bWV2YT1+JX5bkgt3KeXdiHh4yLPQa4xZ0Qq8MyeIzYk5n5bXarUDk9rmO++883bp6en5KSK+rhUgd1ifDxaLxSOT2gKurwd/joiNnsV1Gzdu3Ht4eLiaNZatIAi7HDQ8KSWiRA8ElVI/jBLsIetBaMP+vqO15qjwiRSl1FUAcHaIsHla69WJdBhBSKYE8Tzv3UTED2ujsqlare61cuXKP0WwY9KqUspLEfEzSchyMv4/AkTEccYiRbWcDL96JizOqtvIi2HdmjVr9krT+3gi/TIliFKKF+bHhrxvVowxMomHsVwuvwsReTs3UzuT0L0NZIzX7//zpkfTRUppELEc8mycnXXwv8wenHK5vL8Qgrf1GpXxzZs375XEBaiFCxfuXavV+OJVXq/DNv1QtVoAJ88pFosHLV++/I/N6lKfRfj6QiOP34e11m9qtq8o7TMjiFJqaVhiGyK6xhgT9i5qZZ9Sik/eO/YuhxUIGVRKMhiclHIZIp4fMoscm2XklqwIgkopDhgdeo2WwSGiprb1bF0ZMnh+uqILDgXbTELPiCksrtNan54VsJkQxPO8DxDRt22NaoYg9dAzHFjNnXfYAt5kPfZ42LBhw/5xL1xFJMg4Ee2ZtOPqZBBkQhCl1L8BwIdsx6EZgrhdK1uUk63XTLTEiAThN4zLjDGXJGvBxNJSJUj9rgXn8ZgbZScpLkEWLFiwR7FYXJMFcK6P7REoFAqviZOxKypBAGAzEX1u06ZNl6d9eJgaQcrl8gmIeA0i7hH1YYpLkCgBy6Lq5OpbIbBaax35Lr+UchYixomw+HCtVvvY0NAQR8JJpaRBEF6QX0pEF0WZNba2Lg5B6u7zv7UNxZ8Kmk7o5kKhMDPqtm+MGWRrpDcHQXBWpVL5ehrwJ0qQRYsWTa9Wq5z96f3NKBuHIFJKjkeb6L2RZmzo1rZx3ISamEG2hnlAa91wizjOmCRGkN7e3ilCCA6+ECsRfTMzSF9f315BEPDVXVdajAARPT916tQ9o+RKb3IG+ZvFaeQeSYQg9exP37cJM2kzflFnEKUURyPheLmu5AOBBVrrlbaqJEUQ7o9jfBljem37DquXCEGUUuyrPz+sM9vvIxKE1zy8c8X3PVzJAQJEdL8x5q22qiRJEO4TEef4vm8TKSdUxaYJEuF2YKgyWypEIYhSit1JEg3oYK2oqzgpAkT0Ott77EkTBAA2jI+Pv2HFihVrmx2ipghSX5Q/goh7NqvI1u0jEuR6AODI667kCIEoB4cJLdK3tf57WmvbnJaTItcUQaSUn0VETgmQaLElSD3t14ZEO3fCkkLgWa31q2yEpTCDvNhtEuGiYhOkHgDsdzZJbmxAijODRPXxiqqHq980AodqrR8Ik5IWQTjesDGG01ZQmA6TfR+bIGmeWtvOILbpEuKC49o1hwARLTbGsKtRw5IWQeqdflRr/bUwHRIlCJ95FAoFvhLLOb4TL7YEiZBsJ3EdncBwBIjoB8aY0Di8KRPkDq21bebd7YyKNYMopT4GAF8OhyheDRuCLFmyZOfR0dH1cd1Z4mnmWkVBgIhG165du2PYPfI0CUJEJITYK27KuVgEsY3QHQXMqGsQ23wTcXVw7ZJBIAiCIyuVCkeymbSkSRDutJl0CnEIwgdzL4RlC2oGXpsZRCnF9wH6m+nHtU0fAUQ81/f94VYSBABu0VrH8g+MTJByufwmIcRDaUJrQxAp5TcQ8Yw09XCym0fA5jwk7RkEAKy3nLe1OA5BzhJCfKF56CaXYEMQpRRHLLHJnpqmqk52CAKcjMcYw7nlJy0pHRS+pL+4l7kiE0Qp9c8A8C9pPhmWBBnr5nRpaeKfsOwntdYNcz5mMIOwf9Yxvu//JKptkQkipbwcES+I2lGU+mEEqce8+m0Uma5u6xDQWjd8zrIgSBAEp1QqFY6NEKlEJkjSnrsTaRtGEKUUx/ZtuDMSCQVXOVUEhBCvHhwcfGayTrIgiM1mwUT6RSZImifoWxS0IIhVTvVUR90Jt0ZACPHmwcHBBydrkMUaJG4s4TgEGUDEhdboxKgYRpByuXySEOKWGKJdk9Yg8C6t9Y+7YgZRSl0MAJeliXMYQaSUpyLiDWnq4GQnhwARzTbG8LWECUtGM0hDHSbTLfIM4nnePxFRqjnjLAjyUUT8SnJD6CSliUAQBOdVKpXPt3gGOdz3/Xuj2hmZIL29vW8vFAo/i9pRlPphBMmCpFH0dXUbI0BEi4wxy1tJkGKxuGOcrFiRCVLPTvqXNB8KC4LM5qjiaergZCeHQNgMkvYrFhE9YYzZL45FkQnCnUgp70LEI+J0aNMmjCDuHroNirmq0/BORtrbvET0eWPMeXEQiUsQjpr42Tgd2rQJI4iU8ihEjHwqatO3q5M8AkR0sjFm0uj+GRDkA8aYf49jWSyC1PONczagVEoYQTgzahAE7IvlShsgEATBOyuVym0tWoOMzJgxY9f+/v7xOFDFIgh3ZJNvMI5C3CaMIEqp1wDAb+LKd+0yR6Dh3fQ01yA23sSN0IhNECnlPyAiR1NMvIQRpL+/X6xfv36zC1SdOPSpCNy4ceP04eHhjVnPIHyjsVQq7T0wMMDZzWKV2ATh3qSUd7CXZKyeGzQKI0h9Bvs1AByQdN9OXrIIENFzxpjdGklNcQZZprVe0oxFTRHE87w3BkHwYNK/5JYE4UXfB5ox3rVNHwEiutMY0zD1dxqLdM7AWyqV9otz9rE1Kk0RpD6LJO7+bkMQm4yo6Q+/68ECgWGt9blZzyCI+CHf979loV/DKk0TpB7Z/X4AOKhZZba0tyGIUuoTAHBNUn06OekgYONFm/QMQkRfNMbw89F0aZog9VnkQERkkiQSJ8uGIJ7nHURE/9M0Ak5A2ggcpbW+K8MZ5PGNGzce0mhTIIrBiRCkvmh+CwD8CABmRFFgoro2BKn3ycHrXt5sf659agi8sGbNmp0zjIv1bK1WO3RoaOh3SVmUGEFYIV60E9HtAPDKZhS0JYiLbNIMyum3JaJ/N8aEbqQksYvFu2VCiON93384ScsSJciW1y0A+Aki7hpX0QgE+SQiXh23H9cuXQQQUfm+b8J6aXYNQkS/QMT3aq3XhfUV9fvECcIKzJs3b/eenh7O8PPeqApxfVuCuOANcdDNrg0ivsnmF71JgtywcePGf0pqzbEtOqkQZEsn5XL5DETUiGiVJ2JLO1uC1GcsPoc5OLthdz1ZIvCo1vpAm7oxX7E2AcD5UXIh2uiSKUHqs8mOpVLpM4jICeatdrkiEuR8RFwWx3jXJlUElmitrcYlBkGuGx8f95JIsRaGQKozyNadczYoIcS5iDgbABomeIxCkN7e3l2FEH9wUd7DhjrT74NqtbrbypUreZcxtNgQhIjYl+sbQogrfN9/PFRoQhUyI8jW+tbXDqcCwIcA4OhtbYlCEG6rlOLtZQ4F5EoOELDdvdqiagOCPEBEHP/sh43uk6RpcksIsq1Bdfd1TuP8d0S0uxDiXt/377M13N1Rt0Uqm3pR3Tw4U3IQBPMRkbPSPoGI98QJsJCGdbkgSLOGzZkzZ+qMGTM4cl9T5y/N6uHav7gD+ZgxhhfnsfMC5gnHjiAIAyql9BBxME/gdqMuQRB8olKpfLFTbO8YgrhZJBeP5Lo1a9bsFeZakgtNLZXoGIKwvZ7nSSLSlra7askjsCDtc4nkVW4ssaMIUt/RehoA9soaSNcfrNFa79lpOHQcQTzPey+nH+60gcq7PYj4Ht/3b827nlH16ziC1GcRDpR8WlQwXP3YCNygtZ4Vu3WOG3YkQaSU7Pv1OCLumGPsO0W1DcVi8YBmIofkGYiOJEh92/ccRGyYfjjPA9MuuhHR2caYjr363LEEqb9qcbjJhhlW2+VBzKmeN2mt2WWoY0unE2QGEf0KEXfv2BFskWFE9IgQ4i2+77PbeceWjiYIj5rneUcHQcAB7jre1qyeUiJ6XghxiO/7qcVnzsqWsH664qGRUn4WES8KA8N9b43AqVrrm6xrt3HFriAIAKBS6jq39dv8k0pEnzLG/J/mJbWHhG4hCHDA65GREc5K5c5H4j+bl2qt++M3b7+WXUMQHhpHkvgPaDNZmuL32vqWXUWQLXBLKb+JiKe3Hv620eBarfVZbaNtgop2JUEYPynlMCKekyCWHSmKiJYbYxZ1pHEWRnUtQRgbpdQl/OZlgVNXVgnLTtsNoHQ1QeokOZuIeDbpeiy2PPBEVEPEM7TWN3QDCRrZ6B6Kv84kxxERr0siBbjr0IfnGSKaZYy5p0Pti2SWI0gdrvnz57+iVCp9PW641Eio57fydbVa7ZyhoaH/za+K2WrmCLIN3kqpXiK6EhGnZDsULe3tBQAoa62/0FItcti5I8gEg+J53j5BEHwFEY/I4ZglqhLfvgyC4Owkc2okqmCLhTmCNBiAekC6gQ6Nt7WGiKQx5sYWP4O57t4RJGR4PM97eRAEyxDxk7keyWjKrezp6blw2bJlf4nWrPtqO4JYjvmCBQteWywWLwCAOQDQY9ksT9V4nXEVAHDu8MQTzeTJ0CR1aUuCKKVOqVard9hGD08SMKUUxw/mlAtzbdM5JNl/DFkjRLRCCOH7vv/nGO2barJo0aLptVrtfb7vszd125W2IojneYcFQVBBxMMB4BlEPNEmg1Eao7J48eKXjY6OniaE+HA9srxIo5+YMjcDwA+I6GtCiG+36taflPLVAPAfiHggZyQmogsrlcp3Y9rUkmZtQZC+vr4DarXaFYj4j1ujVM8ZcWarQuNv0YVTzpVKpTMB4BREPKolI/nX1HW3IeLXx8bGbly9evX6VunB/ZbL5eOFEHypatusx3chYl9eoreHYZRrgtTj7V4KAH0AUJzIGCIiRLwsL/cUWOeddtrpSEQ8hv+I6O2IODVsIGJ8/xci4oftTiL6yS677HJvf38/zxwtL0qpPiLijY3CZMoQ0VeDIOgbGhp6ruUKN1AgtwSp/wJxIlDbMKLfQsQzW/U60WiQe3t79xVC7IOIBwDAfkS0HwBwFmBOSTcdEacT0Y6IuAPPioj4PBG9UP/cAAD8ED0uhHi8Vqs9hohPGGM4xGquyty5c0vTpk3j8yOrqwREtF4IcYHv+7x5kMt0CbkjCKdUKxQKq2Le/HtUCDF7cHDwwVw9OV2gjJTyQETkG5uHRDWXiO7htAlDQ0O/jNo27fq5IoiU8j0AwL9AzTgN8mvGhVprP6+/SmkPatbyy+XypxBxOc+AcfsmojFE/HTexi0XBKlPzUvZsTYpt3NesJZKpTM6NSRm3AcxyXZLlizZeXR0lL2gT0hKLhHdCQCzjTF/SEpmM3JaThDeoQqCgPfII0/NFob/kYjOMsZwhEVXEkSA14iI+FVE3CNBsVtE8XnNx7XWt6QgO5LIlhJESsmLuaszCDJ9LRFdkJdfpUgjlLPKfC2gWCx+DhHPTVs1IqoYY2Ta/TSS3xKC9Pf394yMjHAmqPOyMr5+ZjJQKpWWDQwMsNuFKxEQqG+5LwSAJQDwsghNm616rxDitMHBQU7SmnnJnCD109WbEfHvM7f2r4dpvweAizo5InnSuCqlPgIAvEacmbRsS3kjAPDRVrxyZUqQcrm8vxDithYC/bfxIKJfIuIirfX3LAep66rxriIiXpnS+jAynq3IoJsZQZRSr+cTX0R8RWRk0m3wEBENbNq06RvDw8PVdLvKv/T+/v7iyMjI6US0sFWzfMM1AaLyfd9khWQmBFFKvQUAfjSBX05Wdob2Q0RrAaAyderUzy9dupRPr7uq9Pb27lQoFObyJSpEzHUyTiK6zBjDIZtSL6kTpFwuH4qIt2ewU5UUWJuI6JpCoTA0ODj4aFJC8yqHX3sRsYyIHDmRXV/aonDcAGPM4rSVTZUg9TXHvXmeOUIAfhgAbkDEG33ffyjtwchKvpTyYEQ8hb2PAeCgrPpNoZ8lWutlKcj9m8jUCFK/WHRfSgdJaWIymezHiYjvb99ojPmvVijQTJ/1uzQvkgIR929GVp7aIuIc3/fZqTWVkgpB+B43Ef0MANh7tRPLs7zhAAB3sru51pqdI/Pkjcr5UA4homMAgN3ujwaA3TpxIAAgAIAPprUFnApBpJQ/Q8S3d+iATGQWBz948V6GEOKn1Wr1iRUrVvCiP5OyYMGCPUql0r5BEBxRJwMTI8vDvEzsDOnkCK01/ygnWhIniJTya4jI11C7vfBi/zcA8CTf3yCiJ4mI73RsCIJglIg2FYvF0Wq1Olqr1TZNnTp1lO+yeJ43bXR0dOqUKVOmIuK08fHxFz+FEHzpagYi7hcEwT4AwPdL9iWi16Z0Iavdxu/P4+Pjb12xYgVjnlhJlCBSys8gIt8AdMUhkDkCRPTYlClTDk0ynFFiBPE8bzYR8YUZVxwCLUOArzkYY96ZlAKJEGThwoV7j4+Ps+tG7AszSRnk5DgEAOByrfWnk0CiaYLMmjWrMHPmzPsA4M1JKORkOASaRYADeQghjvV9n3camypNE0QpxV6eqZ9oNmWla9x1CLDXNiK+XmvNnsCxS1MEUUrxux77WLniEMgjArdord/fjGKxCcKXntavX/9E3h3bmgHHtW1/BIIgOLNSqXwzriWxCaKUugwALo7bsWvnEMgCAX7Vqlar+69ater5OP3FIohS6jUA8Nhk0Q7jKOLaOATSQoCDdxtjeuPIj0sQvhV4XJwOXRuHQNYI8K4WER1cqVR+EbXvyARRSp0IAG0VoTsqKK5+RyJwu9b6+KiWxSHIf+fljnJUY139rkfgXVrrH0dBIRJBPM/7ABF9O0oHrq5DIC8IENHdxph3RNEnEkGUUm72iIKuq5s7BIIgOLFSqXzfVjFrgrjZwxZSVy/nCNyntX6brY7WBFFK/RAA3m0r2NVzCOQVASI6zPbatBVBPM/bh4ieyKvBTi+HQEQEvqS15mzFocWKIEopzrWhQqW5Cg6BNkCAc5EIIfawyfobSpC6z9VziLhTG9juVHQI2CJgFTIolCBKqY8BwJdte3X1HAJtgsCTWut9w3QNJYiU8ntJZhAKU8h97xDICgGbxXpDgiilZhDRHxul883KGNePQyAFBAa11pzzZNLSkCCcnFEIsToFxZxIh0DLESCiPxhjdo9NEKXU7QBwbMstcQo4BFJCgIiONcZw4tAJy6QzyNy5c3eYNm3a80llnU3JPifWIdAUAkS03BizKDJBlFIfAoB/a6p319ghkHMEiOjnxhjOXxNtBlFKVQAg1i2snGPi1HMIbI1AMDY29srVq1evnwiWSV+xpJQPI+IbHJYOgU5HgIhOM8ZwaovtyoQE6e3t3bVQKDzb6cA4+xwCjAARrTLGzLcmiOd5JxPRzQ4+h0CXIPCA1vpQa1mQpwcAAAGDSURBVIIopTicD4f1ccUh0A0IbNZac3qJ7ZIgTfiKpZS6HgBO6wZknI0OgToCb9Ba/2pbNCYkiJTyEUQ80EHnEOgWBBDxdN/3rwslSD2R/BgAiG4Bx9npEACAz2mtLwolSD1FMCeldMUh0E0I3KC1nhVKkHK5fJIQ4pZuQsbZ6hCYLCTQdmsQKeU5iDjsIHMIdBMCRPS0MWbv0BlEKdUPAJd0EzjOVocAEVWNMT02BLkKAM52kDkEug2BYrH4qoGBgZd4kEz0inULIp7UbeA4ex0CQog3Dw4OvmSDajuCKKVcagP3rHQrAtsFt56IIHy76uhuRcjZ3b0IBEFwSqVSeckdqIkI8lMAiBQBu3shdZZ3GAJnaa2v3dqmiQhyDwAc1mGGO3McAjYIeFprHUaQ+wFg0iuINr24Og6BNkWgX2t9aUOC1EP9NAyF0qbGO7UdAg0RIKK7jDGcxeBvJTSyosPUIdDNCDiCdPPoO9tDEXAECYXIVehmBBxBunn0ne2hCPw/LzYGm5FkNNYAAAAASUVORK5CYII=") no-repeat center 11rpx;
+ background-size: 55rpx auto;
+}
+
+.share-pop-box {
+ width: 100%;
+ height: 100%;
+ position: fixed;
+ background: rgba(0, 0, 0, 0.5);
+ z-index: 8;
+ bottom: 0;
+ /* display: none; */
+}
+
+.share-pop {
+ width: 100%;
+ height: auto;
+ max-height: 780rpx;
+ padding: 31.25rpx;
+ background: #fff;
+ position: fixed;
+ z-index: 9;
+ bottom: 100rpx;
+}
+
+.share-pop .close {
+ position: absolute;
+ width: 48rpx;
+ height: 48rpx;
+ right: 31.25rpx;
+ top: 31.25rpx;
+}
+
+.share-pop .close .icon {
+ width: 48rpx;
+ height: 48rpx;
+}
+
+.share-pop .share-info {
+ width: 100%;
+ height: 225rpx;
+ overflow: hidden;
+ margin-bottom: 41.5rpx;
+}
+
+.sharebtn {
+ top: 75rpx;
+ background: none !important;
+ font-size: 32rpx;
+ color: #fff !important;
+ border-radius: 0%;
+ width: 175rpx;
+ height: 150rpx;
+ text-align: center;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ flex-wrap: wrap;
+ float: left;
+ background: #fff;
+ border-bottom: 0px solid #fafafa;
+ margin-left: 15%;
+}
+
+.sharebtn::after {
+ border: none;
+ border-radius: 0%;
+}
+
+.savesharebtn {
+ top: 75rpx;
+ background: none !important;
+ font-size: 32rpx;
+ color: #fff !important;
+ border-radius: 0%;
+ width: 175rpx;
+ height: 150rpx;
+ text-align: center;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ flex-wrap: wrap;
+ float: right;
+ background: #fff;
+ border-bottom: 0px solid #fafafa;
+ margin-right: 15%;
+}
+
+.savesharebtn::after {
+ border: none;
+ border-radius: 0%;
+}
+
+.sharebtn_image {
+ /* border: 1px solid #757575; */
+ width: 128rpx;
+ height: 128rpx;
+ margin-top: 0rpx;
+}
+
+.sharebtn_text {
+ /* border: 1px solid #757575; */
+ width: 150rpx;
+ margin-bottom: 2rpx;
+ height: 20rpx;
+ line-height: 20rpx;
+ font-size: 20rpx;
+ color: #555;
+}
+
+.separate {
+ background: #e0e3da;
+ width: 100%;
+ height: 6rpx;
+}
diff --git a/wx-mini-program/pages/groupon/grouponDetail/grouponDetail.js b/wx-mini-program/pages/groupon/grouponDetail/grouponDetail.js
new file mode 100644
index 0000000..3c8a87f
--- /dev/null
+++ b/wx-mini-program/pages/groupon/grouponDetail/grouponDetail.js
@@ -0,0 +1,289 @@
+var util = require('../../../utils/util.js');
+var api = require('../../../config/api.js');
+
+Page({
+ data: {
+ id: 0,
+ orderId: 0,
+ groupon: {},
+ linkGrouponId: 0,
+ joiners: [],
+ orderInfo: {},
+ orderGoods: [],
+ expressInfo: {},
+ flag: false,
+ handleOption: {}
+ },
+
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ this.setData({
+ id: options.id
+ });
+ this.getOrderDetail();
+ },
+
+ // 页面分享
+ onShareAppMessage: function() {
+ let that = this;
+ return {
+ title: '邀请团购',
+ desc: '聚惠星团购分享',
+ path: '/pages/index/index?grouponId=' + this.data.linkGrouponId
+ }
+ },
+
+ shareGroupon: function() {
+ let that = this;
+ wx.showActionSheet({
+ itemList: ['分享给朋友', '分享到朋友圈'],
+ success: function(res) {
+ if (res.tapIndex == 0) {
+ wx.showModal({
+ title: '提示',
+ content: '点击右上角 "..." 转发给朋友',
+ showCancel: false
+ });
+ } else if (res.tapIndex == 1) {
+ that.saveShare();
+ } else {
+ console.log(res.tapIndex);
+ }
+ },
+ fail: function(res) {
+ console.log(res.errMsg);
+ }
+ })
+ },
+
+ // 保存分享图
+ saveShare: function() {
+ let that = this;
+ wx.downloadFile({
+ url: that.data.groupon.shareUrl,
+ success: function(res) {
+ console.log(res)
+ wx.saveImageToPhotosAlbum({
+ filePath: res.tempFilePath,
+ success: function(res) {
+ wx.showModal({
+ title: '存图成功',
+ content: '图片成功保存到相册了,可以分享到朋友圈了',
+ showCancel: false,
+ confirmText: '好的',
+ confirmColor: '#a78845',
+ success: function(res) {
+ if (res.confirm) {
+ console.log('用户点击确定');
+ }
+ }
+ })
+ },
+ fail: function(res) {
+ console.log('fail')
+ }
+ })
+ },
+ fail: function() {
+ console.log('fail')
+ }
+ })
+ },
+
+ onPullDownRefresh() {
+ wx.showNavigationBarLoading() //在标题栏中显示加载
+ this.getOrderDetail();
+ wx.hideNavigationBarLoading() //完成停止加载
+ wx.stopPullDownRefresh() //停止下拉刷新
+ },
+ detailExpress:function(e){
+ let orderId = e.currentTarget.dataset.index;
+ wx.navigateTo({url:'/pages/ucenter/expressInfo/expressInfo?orderId=' + orderId});
+ },
+ //获取物流信息
+ getOrderExpress: function() {
+ let that = this;
+ util.request(api.ExpressQuery, {
+ expCode: that.data.orderInfo.expCode,
+ expNo: that.data.orderInfo.expNo
+ }, 'POST').then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ expressInfo: res.data
+ });
+ }
+ });
+ },
+ expandDetail: function() {
+ let that = this;
+ this.setData({
+ flag: !that.data.flag
+ })
+ },
+ getOrderDetail: function() {
+ let that = this;
+ util.request(api.GroupOnDetail, {
+ grouponId: that.data.id
+ }).then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ joiners: res.data.joiners,
+ groupon: res.data.groupon,
+ linkGrouponId: res.data.linkGrouponId,
+ orderId: res.data.orderInfo.id,
+ orderInfo: res.data.orderInfo,
+ orderGoods: res.data.orderGoods,
+ handleOption: res.data.orderInfo.handleOption
+ });
+
+ }
+ });
+ },
+ // “去付款”按钮点击效果
+ payOrder: function() {
+ let that = this;
+ util.request(api.OrderPrepay, {
+ orderId: that.data.orderId
+ }, 'POST').then(function(res) {
+ if (res.errno === 0) {
+ const payParam = res.data;
+ console.log("支付过程开始");
+ wx.requestPayment({
+ 'timeStamp': payParam.timeStamp,
+ 'nonceStr': payParam.nonceStr,
+ 'package': payParam.packageValue,
+ 'signType': payParam.signType,
+ 'paySign': payParam.paySign,
+ 'success': function(res) {
+ console.log("支付过程成功");
+ util.redirect('/pages/ucenter/order/order');
+ },
+ 'fail': function(res) {
+ console.log("支付过程失败");
+ util.showErrorToast('支付失败');
+ },
+ 'complete': function(res) {
+ console.log("支付过程结束")
+ }
+ });
+ }
+ });
+
+ },
+ // “取消订单”点击效果
+ cancelOrder: function() {
+ let that = this;
+ let orderInfo = that.data.orderInfo;
+
+ wx.showModal({
+ title: '',
+ content: '确定要取消此订单?',
+ success: function(res) {
+ if (res.confirm) {
+ util.request(api.OrderCancel, {
+ orderId: orderInfo.id
+ }, 'POST').then(function(res) {
+ if (res.errno === 0) {
+ wx.showToast({
+ title: '取消订单成功'
+ });
+ util.redirect('/pages/ucenter/order/order');
+ } else {
+ util.showErrorToast(res.errmsg);
+ }
+ });
+ }
+ }
+ });
+ },
+ // “取消订单并退款”点击效果
+ refundOrder: function() {
+ let that = this;
+ let orderInfo = that.data.orderInfo;
+
+ wx.showModal({
+ title: '',
+ content: '确定要取消此订单?',
+ success: function(res) {
+ if (res.confirm) {
+ util.request(api.OrderRefund, {
+ orderId: orderInfo.id
+ }, 'POST').then(function(res) {
+ if (res.errno === 0) {
+ wx.showToast({
+ title: '取消订单成功'
+ });
+ util.redirect('/pages/ucenter/order/order');
+ } else {
+ util.showErrorToast(res.errmsg);
+ }
+ });
+ }
+ }
+ });
+ },
+ // “删除”点击效果
+ deleteOrder: function() {
+ let that = this;
+ let orderInfo = that.data.orderInfo;
+
+ wx.showModal({
+ title: '',
+ content: '确定要删除此订单?',
+ success: function(res) {
+ if (res.confirm) {
+ util.request(api.OrderDelete, {
+ orderId: orderInfo.id
+ }, 'POST').then(function(res) {
+ if (res.errno === 0) {
+ wx.showToast({
+ title: '删除订单成功'
+ });
+ util.redirect('/pages/ucenter/order/order');
+ } else {
+ util.showErrorToast(res.errmsg);
+ }
+ });
+ }
+ }
+ });
+ },
+ // “确认收货”点击效果
+ confirmOrder: function() {
+ let that = this;
+ let orderInfo = that.data.orderInfo;
+
+ wx.showModal({
+ title: '',
+ content: '确认收货?',
+ success: function(res) {
+ if (res.confirm) {
+ util.request(api.OrderConfirm, {
+ orderId: orderInfo.id
+ }, 'POST').then(function(res) {
+ if (res.errno === 0) {
+ wx.showToast({
+ title: '确认收货成功!'
+ });
+ util.redirect('/pages/ucenter/order/order');
+ } else {
+ util.showErrorToast(res.errmsg);
+ }
+ });
+ }
+ }
+ });
+ },
+ onReady: function() {
+ // 页面渲染完成
+ },
+ onShow: function() {
+ // 页面显示
+ },
+ onHide: function() {
+ // 页面隐藏
+ },
+ onUnload: function() {
+ // 页面关闭
+ }
+});
\ No newline at end of file
diff --git a/wx-mini-program/pages/groupon/grouponDetail/grouponDetail.json b/wx-mini-program/pages/groupon/grouponDetail/grouponDetail.json
new file mode 100644
index 0000000..8488799
--- /dev/null
+++ b/wx-mini-program/pages/groupon/grouponDetail/grouponDetail.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "团购详情",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/groupon/grouponDetail/grouponDetail.wxml b/wx-mini-program/pages/groupon/grouponDetail/grouponDetail.wxml
new file mode 100644
index 0000000..40367a4
--- /dev/null
+++ b/wx-mini-program/pages/groupon/grouponDetail/grouponDetail.wxml
@@ -0,0 +1,75 @@
+
+
+ 下单时间:{{orderInfo.addTime}}
+ 订单编号:{{orderInfo.orderSn}}
+
+ 实付:
+ ¥{{orderInfo.actualPrice}}
+
+
+
+ 查看物流
+
+
+
+
+
+
+
+ 参与团购 ( {{joiners.length}}人)
+ 查看全部
+
+
+
+ {{item.nickname}}
+
+
+
+
+
+ 商品信息
+ {{orderInfo.orderStatusText}}
+
+
+
+
+
+
+
+
+ {{item.goodsName}}
+ x{{item.number}}
+
+ {{item.goodsSpecificationValues}}
+ ¥{{item.retailPrice}}
+
+
+
+
+
+
+
+ {{orderInfo.consignee}}
+ {{orderInfo.mobile}}
+
+ {{orderInfo.address}}
+
+
+
+ 商品合计:
+ ¥{{orderInfo.goodsPrice}}
+
+
+ 运费:
+ ¥{{orderInfo.freightPrice}}
+
+
+
+ 实付:
+ ¥{{orderInfo.actualPrice}}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/groupon/grouponDetail/grouponDetail.wxss b/wx-mini-program/pages/groupon/grouponDetail/grouponDetail.wxss
new file mode 100644
index 0000000..daba57e
--- /dev/null
+++ b/wx-mini-program/pages/groupon/grouponDetail/grouponDetail.wxss
@@ -0,0 +1,402 @@
+page {
+ height: 100%;
+ width: 100%;
+ background: #f4f4f4;
+}
+
+.order-info {
+ padding-top: 25rpx;
+ background: #fff;
+ height: auto;
+ overflow: hidden;
+}
+
+.item-a {
+ padding-left: 31.25rpx;
+ height: 42.5rpx;
+ padding-bottom: 12.5rpx;
+ line-height: 30rpx;
+ font-size: 30rpx;
+ color: #666;
+}
+
+.item-b {
+ padding-left: 31.25rpx;
+ height: 29rpx;
+ line-height: 29rpx;
+ margin-top: 12.5rpx;
+ margin-bottom: 41.5rpx;
+ font-size: 30rpx;
+ color: #666;
+}
+
+.item-c {
+ margin-left: 31.25rpx;
+ border-top: 1px solid #f4f4f4;
+ height: 103rpx;
+ line-height: 103rpx;
+}
+
+.item-c .l {
+ float: left;
+}
+
+.item-c .r {
+ height: 103rpx;
+ float: right;
+ display: flex;
+ align-items: center;
+ padding-right: 16rpx;
+}
+
+.item-c .r .btn {
+ float: right;
+}
+
+.item-c .cost {
+ color: #b4282d;
+}
+
+.item-c .btn {
+ line-height: 66rpx;
+ border-radius: 5rpx;
+ text-align: center;
+ margin: 0 15rpx;
+ padding: 0 20rpx;
+ height: 66rpx;
+}
+
+.item-c .btn.active {
+ background: #ee9e09;
+ color: #fff;
+ font-size: 30rpx;
+}
+
+.item-c .btn.express {
+ background: #85c43f;
+ color: #fff;
+ font-size: 30rpx;
+}
+
+.order-goods {
+ margin-top: 20rpx;
+ background: #fff;
+}
+
+.order-goods .h {
+ height: 93.75rpx;
+ line-height: 93.75rpx;
+ margin-left: 31.25rpx;
+ border-bottom: 1px solid #f4f4f4;
+ padding-right: 31.25rpx;
+}
+
+.order-goods .h .label {
+ float: left;
+ font-size: 30rpx;
+ color: #333;
+}
+
+.order-goods .h .status {
+ float: right;
+ font-size: 30rpx;
+ color: #b4282d;
+}
+
+.order-goods .item {
+ display: flex;
+ align-items: center;
+ height: 192rpx;
+ margin-left: 31.25rpx;
+ padding-right: 31.25rpx;
+ border-bottom: 1px solid #f4f4f4;
+}
+
+.order-goods .item:last-child {
+ border-bottom: none;
+}
+
+.order-goods .item .img {
+ height: 145.83rpx;
+ width: 145.83rpx;
+ background: #f4f4f4;
+}
+
+.order-goods .item .img image {
+ height: 145.83rpx;
+ width: 145.83rpx;
+}
+
+.order-goods .item .info {
+ flex: 1;
+ height: 145.83rpx;
+ margin-left: 20rpx;
+}
+
+.order-goods .item .t {
+ margin-top: 8rpx;
+ height: 63rpx;
+ line-height: 33rpx;
+ margin-bottom: 10.5rpx;
+}
+
+.order-goods .item .t .name {
+ display: block;
+ float: left;
+ height: 63rpx;
+ line-height: 33rpx;
+ color: #333;
+ font-size: 30rpx;
+}
+
+.order-goods .item .t .number {
+ display: block;
+ float: right;
+ height: 63rpx;
+ text-align: right;
+ line-height: 33rpx;
+ color: #333;
+ font-size: 30rpx;
+}
+
+.order-goods .item .attr {
+ height: 29rpx;
+ line-height: 29rpx;
+ color: #666;
+ margin-bottom: 25rpx;
+ font-size: 25rpx;
+}
+
+.order-goods .item .price {
+ display: block;
+ float: left;
+ height: 30rpx;
+ line-height: 30rpx;
+ color: #333;
+ font-size: 30rpx;
+}
+
+.order-goods .item .btn {
+ height: 50rpx;
+ line-height: 50rpx;
+ border-radius: 5rpx;
+ text-align: center;
+ display: block;
+ float: right;
+ margin: 0 15rpx;
+ padding: 0 20rpx;
+}
+
+.order-goods .item .btn.active {
+ background: #b4282d;
+ color: #fff;
+}
+
+.order-bottom {
+ margin-top: 20rpx;
+ padding-left: 31.25rpx;
+ height: auto;
+ overflow: hidden;
+ background: #fff;
+}
+
+.order-bottom .address {
+ height: 128rpx;
+ padding-top: 25rpx;
+ border-bottom: 1px solid #f4f4f4;
+}
+
+.order-bottom .address .t {
+ height: 35rpx;
+ line-height: 35rpx;
+ margin-bottom: 7.5rpx;
+}
+
+.order-bottom .address .name {
+ display: inline-block;
+ height: 35rpx;
+ width: 140rpx;
+ line-height: 35rpx;
+ font-size: 30rpx;
+}
+
+.order-bottom .address .mobile {
+ display: inline-block;
+ height: 35rpx;
+ line-height: 35rpx;
+ font-size: 30rpx;
+}
+
+.order-bottom .address .b {
+ height: 35rpx;
+ line-height: 35rpx;
+ font-size: 30rpx;
+}
+
+.order-bottom .total {
+ height: 106rpx;
+ padding-top: 20rpx;
+ border-bottom: 1px solid #f4f4f4;
+}
+
+.order-bottom .total .t {
+ height: 30rpx;
+ line-height: 30rpx;
+ margin-bottom: 7.5rpx;
+ display: flex;
+}
+
+.order-bottom .total .label {
+ width: 150rpx;
+ display: inline-block;
+ height: 35rpx;
+ line-height: 35rpx;
+ font-size: 30rpx;
+}
+
+.order-bottom .total .txt {
+ flex: 1;
+ display: inline-block;
+ height: 35rpx;
+ line-height: 35rpx;
+ font-size: 30rpx;
+}
+
+.order-bottom .pay-fee {
+ height: 81rpx;
+ line-height: 81rpx;
+}
+
+.order-bottom .pay-fee .label {
+ display: inline-block;
+ width: 140rpx;
+ color: #b4282d;
+}
+
+.order-bottom .pay-fee .txt {
+ display: inline-block;
+ width: 140rpx;
+ color: #b4282d;
+}
+
+.order-express {
+ margin-top: 20rpx;
+ width: 100%;
+ height: 100rpx;
+ background: #fff;
+}
+
+.order-express .expand {
+ /* margin-top: 20rpx; */
+ width: 100%;
+ height: 100rpx;
+ background: #fff;
+ /* border: 10rpx #a78845; */
+}
+
+.order-express .title {
+ float: left;
+ margin-bottom: 20rpx;
+ padding: 10rpx;
+}
+
+.order-express .ti {
+ float: right;
+ width: 52rpx;
+ height: 52rpx;
+ margin-right: 16rpx;
+ margin-top: 28rpx;
+}
+
+.order-express .t {
+ font-size: 29rpx;
+ margin-left: 10.25rpx;
+ color: #a78845;
+}
+
+.order-express .b {
+ font-size: 29rpx;
+ margin-left: 10.25rpx;
+ color: #a78845;
+}
+
+.order-express .traces {
+ padding: 17.5rpx;
+ background: #fff;
+ border-bottom: 1rpx solid #f1e6cdcc;
+}
+
+.order-express .trace {
+ padding-bottom: 17.5rpx;
+ padding-top: 17.5rpx;
+ background: #fff;
+}
+
+.order-express .acceptTime {
+ margin-top: 20rpx;
+ margin-right: 40rpx;
+ text-align: right;
+ font-size: 26rpx;
+}
+
+.order-express .acceptStation {
+ font-size: 26rpx;
+}
+
+.menu-list-pro {
+ margin-top: 20rpx;
+ overflow-x: scroll;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ height: 260rpx;
+ width: 100%;
+ overflow: hidden;
+ border-bottom: 1rpx #cfc9ca;
+ background-color: #fff;
+}
+
+.menu-list-pro .h {
+ height: 93.75rpx;
+ line-height: 93.75rpx;
+ margin-left: 31.25rpx;
+ border-bottom: 1px solid #f4f4f4;
+ padding-right: 31.25rpx;
+}
+
+.menu-list-pro .h .label {
+ float: left;
+ font-size: 30rpx;
+ color: #333;
+}
+
+.menu-list-pro .h .status {
+ float: right;
+ font-size: 30rpx;
+ color: #a78845;
+}
+
+.menu-list-pro .menu-list-item {
+ display: block;
+ float: left;
+ height: 110rpx;
+ width: 80rpx;
+ margin-top: 30rpx;
+ margin-bottom: 30rpx;
+ margin-left: 40rpx;
+}
+
+.menu-list-pro .icon {
+ height: 80rpx;
+ width: 80rpx;
+ border-radius: 12rpx;
+ box-shadow: 0px 4rpx 4rpx 0px #cfc9ca;
+}
+
+.menu-list-pro .txt {
+ display: block;
+ float: left;
+ width: 80rpx;
+ margin-top: 5rpx;
+ font-size: 22rpx;
+ color: #a78845;
+}
diff --git a/wx-mini-program/pages/groupon/grouponList/grouponList.js b/wx-mini-program/pages/groupon/grouponList/grouponList.js
new file mode 100644
index 0000000..d4f82b9
--- /dev/null
+++ b/wx-mini-program/pages/groupon/grouponList/grouponList.js
@@ -0,0 +1,132 @@
+// pages/groupon/grouponList/grouponList.js
+var util = require('../../../utils/util.js');
+var api = require('../../../config/api.js');
+var app = getApp();
+
+Page({
+
+ /**
+ * 页面的初始数据
+ */
+ data: {
+ grouponList: [],
+ page: 1,
+ size: 10,
+ count: 0,
+ scrollTop: 0,
+ showPage: false
+ },
+
+ /**
+ * 生命周期函数--监听页面加载
+ */
+ onLoad: function(options) {
+ this.getGrouponList();
+ },
+
+ /**
+ * 生命周期函数--监听页面初次渲染完成
+ */
+ onReady: function() {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面显示
+ */
+ onShow: function() {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面隐藏
+ */
+ onHide: function() {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面卸载
+ */
+ onUnload: function() {
+
+ },
+
+ /**
+ * 页面相关事件处理函数--监听用户下拉动作
+ */
+ onPullDownRefresh: function() {
+
+ },
+
+ /**
+ * 页面上拉触底事件的处理函数
+ */
+ onReachBottom: function() {
+
+ },
+
+ /**
+ * 用户点击右上角分享
+ */
+ onShareAppMessage: function() {
+
+ },
+ getGrouponList: function() {
+
+ let that = this;
+ that.setData({
+ scrollTop: 0,
+ showPage: false,
+ grouponList: []
+ });
+ // 页面渲染完成
+ wx.showToast({
+ title: '加载中...',
+ icon: 'loading',
+ duration: 2000
+ });
+
+ util.request(api.GroupOnList, {
+ page: that.data.page,
+ size: that.data.size
+ }).then(function(res) {
+ if (res.errno === 0) {
+
+ that.setData({
+ scrollTop: 0,
+ grouponList: res.data.data,
+ showPage: true,
+ count: res.data.count
+ });
+ }
+ wx.hideToast();
+ });
+
+ },
+ nextPage: function(event) {
+ var that = this;
+ if (this.data.page > that.data.count / that.data.size) {
+ return true;
+ }
+
+
+ that.setData({
+ page: that.data.page + 1
+ });
+
+ this.getGrouponList();
+
+ },
+ prevPage: function(event) {
+ if (this.data.page <= 1) {
+ return false;
+ }
+
+ var that = this;
+ that.setData({
+ page: that.data.page - 1
+ });
+ this.getGrouponList();
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/groupon/grouponList/grouponList.json b/wx-mini-program/pages/groupon/grouponList/grouponList.json
new file mode 100644
index 0000000..72185a6
--- /dev/null
+++ b/wx-mini-program/pages/groupon/grouponList/grouponList.json
@@ -0,0 +1,7 @@
+{
+ "navigationBarTitleText": "团购专区",
+ "enablePullDownRefresh": false,
+ "usingComponents": {
+ "zan-capsule": "/lib/zanui-weapp/capsule/index"
+ }
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/groupon/grouponList/grouponList.wxml b/wx-mini-program/pages/groupon/grouponList/grouponList.wxml
new file mode 100644
index 0000000..2e738e5
--- /dev/null
+++ b/wx-mini-program/pages/groupon/grouponList/grouponList.wxml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+ {{item.goods.name}}
+
+
+
+
+ {{item.goods.brief}}
+
+ ¥{{item.groupon_price}}
+ ¥{{item.goods.counterPrice}}
+
+
+
+
+
+
+
+ 上一页
+ 下一页
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/groupon/grouponList/grouponList.wxss b/wx-mini-program/pages/groupon/grouponList/grouponList.wxss
new file mode 100644
index 0000000..d48267a
--- /dev/null
+++ b/wx-mini-program/pages/groupon/grouponList/grouponList.wxss
@@ -0,0 +1,110 @@
+page, .container {
+ width: 750rpx;
+ height: 100%;
+ overflow: hidden;
+ background: #f4f4f4;
+}
+
+.groupon-list {
+ width: 750rpx;
+ height: 100%;
+ overflow: hidden;
+ background: #f4f4f4;
+}
+
+.groupon-list .item {
+ height: 244rpx;
+ width: 100%;
+ background: #fff;
+ margin-bottom: 20rpx;
+}
+
+.groupon-list .img {
+ margin-top: 12rpx;
+ margin-right: 10rpx;
+ float: left;
+ width: 220rpx;
+ height: 220rpx;
+}
+
+.groupon-list .right {
+ float: left;
+ height: 244rpx;
+ width: 476rpx;
+ display: flex;
+ flex-flow: row nowrap;
+}
+
+.groupon-list .text {
+ display: flex;
+ flex-wrap: nowrap;
+ flex-direction: column;
+ justify-content: center;
+ overflow: hidden;
+ height: 244rpx;
+ width: 476rpx;
+}
+
+.groupon-list .name {
+ float: left;
+ width: 330rpx;
+ display: block;
+ line-height: 42rpx;
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 2;
+ overflow: hidden;
+}
+
+.groupon-list .capsule-tag {
+ float: right;
+ padding-right: 0rpx;
+ padding-top: 8rpx;
+}
+
+.groupon-list .zan-capsule + .zan-capsule {
+ margin-left: 6px;
+}
+
+.groupon-list .desc {
+ margin-top: 20rpx;
+ width: 476rpx;
+ display: block;
+ line-height: 38rpx;
+}
+
+.groupon-list .price {
+ width: 476rpx;
+ display: flex;
+ line-height: 50rpx;
+}
+
+.groupon-list .counterPrice {
+ margin-left: 30rpx;
+ text-decoration: line-through;
+}
+
+.page {
+ width: 750rpx;
+ height: 108rpx;
+ background: #fff;
+ margin-bottom: 20rpx;
+}
+
+.page view {
+ height: 108rpx;
+ width: 50%;
+ float: left;
+ font-size: 29rpx;
+ color: #333;
+ text-align: center;
+ line-height: 108rpx;
+}
+
+.page .prev {
+ border-right: 1px solid #d9d9d9;
+}
+
+.page .disabled {
+ color: #ccc;
+}
diff --git a/wx-mini-program/pages/groupon/myGroupon/myGroupon.js b/wx-mini-program/pages/groupon/myGroupon/myGroupon.js
new file mode 100644
index 0000000..85f2397
--- /dev/null
+++ b/wx-mini-program/pages/groupon/myGroupon/myGroupon.js
@@ -0,0 +1,52 @@
+var util = require('../../../utils/util.js');
+var api = require('../../../config/api.js');
+
+Page({
+ data: {
+ orderList: [],
+ showType: 0
+ },
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ },
+
+ onPullDownRefresh() {
+ wx.showNavigationBarLoading() //在标题栏中显示加载
+ this.getOrderList();
+ wx.hideNavigationBarLoading() //完成停止加载
+ wx.stopPullDownRefresh() //停止下拉刷新
+ },
+
+ getOrderList() {
+ let that = this;
+ util.request(api.GroupOnMy, {
+ showType: that.data.showType
+ }).then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ orderList: res.data.data
+ });
+ }
+ });
+ },
+ switchTab: function(event) {
+ let showType = event.currentTarget.dataset.index;
+ this.setData({
+ showType: showType
+ });
+ this.getOrderList();
+ },
+ onReady: function() {
+ // 页面渲染完成
+ },
+ onShow: function() {
+ // 页面显示
+ this.getOrderList();
+ },
+ onHide: function() {
+ // 页面隐藏
+ },
+ onUnload: function() {
+ // 页面关闭
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/groupon/myGroupon/myGroupon.json b/wx-mini-program/pages/groupon/myGroupon/myGroupon.json
new file mode 100644
index 0000000..d93d78b
--- /dev/null
+++ b/wx-mini-program/pages/groupon/myGroupon/myGroupon.json
@@ -0,0 +1,7 @@
+{
+ "navigationBarTitleText": "我的团购",
+ "enablePullDownRefresh": false,
+ "usingComponents": {
+ "zan-capsule": "../../../lib/zanui-weapp/capsule/index"
+ }
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/groupon/myGroupon/myGroupon.wxml b/wx-mini-program/pages/groupon/myGroupon/myGroupon.wxml
new file mode 100644
index 0000000..f0592de
--- /dev/null
+++ b/wx-mini-program/pages/groupon/myGroupon/myGroupon.wxml
@@ -0,0 +1,52 @@
+
+
+
+ 发起的团购
+
+
+ 参加的团购
+
+
+
+
+
+ 尚未参加任何团购
+
+
+
+
+
+
+ 订单编号:{{item.orderSn}}
+ {{item.orderStatusText}}
+
+
+ 团购立减:¥{{item.rules.discount}}
+ 参与时间:{{item.groupon.addTime}}
+
+
+ 团购要求:{{item.rules.discountMember}}人
+ 当前参与:{{item.joinerCount}}
+
+
+
+
+
+
+ {{gitem.goodsName}}
+ 共{{gitem.number}}件商品
+
+
+
+
+ 实付:¥{{item.actualPrice}}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/groupon/myGroupon/myGroupon.wxss b/wx-mini-program/pages/groupon/myGroupon/myGroupon.wxss
new file mode 100644
index 0000000..6f15865
--- /dev/null
+++ b/wx-mini-program/pages/groupon/myGroupon/myGroupon.wxss
@@ -0,0 +1,222 @@
+page {
+ height: 100%;
+ width: 100%;
+ background: #f4f4f4;
+}
+
+.capsule-tag {
+ float: right;
+ /* padding-right: 10rpx; */
+}
+
+.zan-capsule + .zan-capsule {
+ margin-left: 5px;
+}
+
+.orders-switch {
+ width: 100%;
+ background: #fff;
+ height: 84rpx;
+}
+
+.orders-switch .item {
+ display: inline-block;
+ height: 82rpx;
+ width: 50%;
+ padding: 0 15rpx;
+ text-align: center;
+}
+
+.orders-switch .item .txt {
+ display: inline-block;
+ height: 82rpx;
+ padding: 0 20rpx;
+ line-height: 82rpx;
+ color: #9a9ba1;
+ font-size: 30rpx;
+ width: 100%;
+}
+
+.orders-switch .item.active .txt {
+ color: #85c43f;
+ border-bottom: 3rpx solid #85c43f;
+}
+
+.no-order {
+ width: 100%;
+ height: auto;
+ margin: 0 auto;
+}
+
+.no-order .c {
+ width: 100%;
+ height: auto;
+ margin-top: 200rpx;
+}
+
+.no-order .c image {
+ margin: 0 auto;
+ display: block;
+ text-align: center;
+ width: 258rpx;
+ height: 258rpx;
+}
+
+.no-order .c text {
+ margin: 0 auto;
+ display: block;
+ width: 258rpx;
+ height: 29rpx;
+ line-height: 29rpx;
+ text-align: center;
+ font-size: 29rpx;
+ color: #999;
+}
+
+.orders {
+ height: auto;
+ width: 100%;
+ overflow: hidden;
+}
+
+.order {
+ margin-top: 20rpx;
+ background: #fff;
+}
+
+.order .h {
+ height: 83.3rpx;
+ line-height: 83.3rpx;
+ margin-left: 31.25rpx;
+ padding-right: 31.25rpx;
+ border-bottom: 1px solid #f4f4f4;
+ font-size: 30rpx;
+ color: #333;
+}
+
+.order .h .l {
+ float: left;
+}
+
+
+.order .h .r {
+ float: right;
+ color: #b4282d;
+ font-size: 26rpx;
+}
+
+.order .i {
+ height: 56rpx;
+ line-height: 56rpx;
+ margin-left: 31.25rpx;
+ padding-right: 31.25rpx;
+ border-bottom: 1px solid #f4f4f4;
+}
+
+.order .i .l {
+ float: left;
+ color: #a78845;
+ font-size: 26rpx;
+}
+
+.order .i .r {
+ float: right;
+ color: #a78845;
+ font-size: 26rpx;
+}
+
+.order .j {
+ height: 56rpx;
+ line-height: 56rpx;
+ margin-left: 31.25rpx;
+ padding-right: 31.25rpx;
+}
+
+.order .j .l {
+ float: left;
+ font-size: 26rpx;
+ color: #a78845;
+}
+
+.order .j .r {
+ float: right;
+ color: #a78845;
+ font-size: 26rpx;
+}
+
+.order .goods {
+ display: flex;
+ align-items: center;
+ height: 199rpx;
+ margin-left: 31.25rpx;
+}
+
+.order .goods .img {
+ height: 145.83rpx;
+ width: 145.83rpx;
+ background: #f4f4f4;
+}
+
+.order .goods .img image {
+ height: 145.83rpx;
+ width: 145.83rpx;
+}
+
+.order .goods .info {
+ height: 145.83rpx;
+ flex: 1;
+ padding-left: 20rpx;
+}
+
+.order .goods .name {
+ margin-top: 30rpx;
+ display: block;
+ height: 84rpx;
+ line-height: 44rpx;
+ color: #333;
+ font-size: 30rpx;
+}
+
+.order .goods .number {
+ display: block;
+ height: 37rpx;
+ line-height: 37rpx;
+ color: #666;
+ font-size: 25rpx;
+}
+
+.order .goods .status {
+ width: 105rpx;
+ color: #a78845;
+ font-size: 25rpx;
+}
+
+.order .b {
+ height: 103rpx;
+ line-height: 103rpx;
+ margin-left: 31.25rpx;
+ padding-right: 31.25rpx;
+ border-top: 1px solid #f4f4f4;
+ font-size: 30rpx;
+ color: #333;
+}
+
+.order .b .l {
+ float: left;
+}
+
+.order .b .r {
+ float: right;
+}
+
+.order .b .btn {
+ margin-top: 19rpx;
+ height: 64.5rpx;
+ line-height: 64.5rpx;
+ text-align: center;
+ padding: 0 20rpx;
+ border-radius: 5rpx;
+ font-size: 28rpx;
+ color: #fff;
+ background: #a78845;
+}
diff --git a/wx-mini-program/pages/hotGoods/hotGoods.js b/wx-mini-program/pages/hotGoods/hotGoods.js
new file mode 100644
index 0000000..c2b246e
--- /dev/null
+++ b/wx-mini-program/pages/hotGoods/hotGoods.js
@@ -0,0 +1,132 @@
+var util = require('../../utils/util.js');
+var api = require('../../config/api.js');
+var app = getApp();
+
+Page({
+ data: {
+ bannerInfo: {
+ 'imgUrl': 'http://yanxuan.nosdn.127.net/8976116db321744084774643a933c5ce.png',
+ 'name': '大家都在买的'
+ },
+ categoryFilter: false,
+ filterCategory: [],
+ goodsList: [],
+ categoryId: 0,
+ currentSortType: 'default',
+ currentSort: 'browse',
+ currentSortOrder: 'desc',
+ page: 1,
+ size: 200
+ },
+ getCategoryList: function() {
+ var that = this;
+
+ util.request(api.GoodsFilter, {
+ isHot: 1
+ })
+ .then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ filterCategory: res.data.filterCategoryList,
+ });
+ }
+ });
+ },
+ getGoodsList: function() {
+ var that = this;
+
+ util.request(api.GoodsList, {
+ isHot: true,
+ page: that.data.page,
+ size: that.data.size,
+ order: that.data.currentSortOrder,
+ sort: that.data.currentSort,
+ categoryId: that.data.categoryId
+ })
+ .then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ goodsList: res.data.goodsList,
+ filterCategory: res.data.filterCategoryList
+ });
+ }
+ });
+
+ },
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ this.getGoodsList();
+ },
+ onReady: function() {
+ // 页面渲染完成
+ },
+ onShow: function() {
+ // 页面显示
+
+ },
+ onHide: function() {
+ // 页面隐藏
+
+ },
+ onUnload: function() {
+ // 页面关闭
+
+ },
+ openSortFilter: function(event) {
+ let currentId = event.currentTarget.id;
+ let tmpSortOrder = 'asc';
+ switch (currentId) {
+ case 'categoryFilter':
+ this.setData({
+ categoryFilter: !this.data.categoryFilter,
+ currentSortType: 'category',
+ currentSort: 'add_time',
+ currentSortOrder: 'desc'
+ });
+ break;
+ case 'priceSort':
+ if (this.data.currentSortOrder == 'asc') {
+ tmpSortOrder = 'desc';
+ }
+ this.setData({
+ currentSortType: 'price',
+ currentSort: 'retail_price',
+ currentSortOrder: tmpSortOrder,
+ categoryFilter: false
+ });
+
+ this.getGoodsList();
+ break;
+ case 'salesSort':
+ if (this.data.currentSortOrder == 'asc') {
+ tmpSortOrder = 'desc';
+ }
+ this.setData({
+ currentSortType: 'sales',
+ currentSort: 'sales',
+ currentSortOrder: tmpSortOrder,
+ categoryFilter: false
+ });
+ this.getGoodsList();
+ break;
+ default:
+ //综合排序
+ this.setData({
+ currentSortType: 'default',
+ currentSort: 'add_time',
+ currentSortOrder: 'desc',
+ categoryFilter: false,
+ categoryId: 0,
+ });
+ this.getGoodsList();
+ }
+ },
+ selectCategory: function(event) {
+ let currentIndex = event.target.dataset.categoryIndex;
+ this.setData({
+ 'categoryFilter': false,
+ 'categoryId': this.data.filterCategory[currentIndex].id
+ });
+ this.getGoodsList();
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/hotGoods/hotGoods.json b/wx-mini-program/pages/hotGoods/hotGoods.json
new file mode 100644
index 0000000..7e7e7f1
--- /dev/null
+++ b/wx-mini-program/pages/hotGoods/hotGoods.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "人气推荐",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/hotGoods/hotGoods.wxml b/wx-mini-program/pages/hotGoods/hotGoods.wxml
new file mode 100644
index 0000000..0285da0
--- /dev/null
+++ b/wx-mini-program/pages/hotGoods/hotGoods.wxml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+ {{bannerInfo.name}}
+
+
+
+
+
+
+
+
+ 综合
+
+
+ 价格
+
+
+ 销量
+
+
+
+ {{item.name}}
+
+
+
+
+
+
+
+ {{iitem.name}}
+ ¥{{iitem.retailPrice}}
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/hotGoods/hotGoods.wxss b/wx-mini-program/pages/hotGoods/hotGoods.wxss
new file mode 100644
index 0000000..d0b1d34
--- /dev/null
+++ b/wx-mini-program/pages/hotGoods/hotGoods.wxss
@@ -0,0 +1,177 @@
+page {
+ background: #f4f4f4;
+}
+
+.brand-info .name {
+ width: 100%;
+ height: 278rpx;
+ position: relative;
+}
+
+.brand-info .img {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 278rpx;
+}
+
+.brand-info .info-box {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 278rpx;
+ text-align: center;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.brand-info .info {
+ display: block;
+}
+
+.brand-info .txt {
+ display: block;
+ height: 40rpx;
+ font-size: 37.5rpx;
+ color: #fff;
+}
+
+.brand-info .line {
+ margin: 0 auto;
+ margin-top: 16rpx;
+ display: block;
+ height: 2rpx;
+ width: 145rpx;
+ background: #fff;
+}
+
+.sort {
+ position: relative;
+ background: #fff;
+ width: 100%;
+ height: 78rpx;
+}
+
+.sort-box {
+ background: #fff;
+ width: 100%;
+ height: 78rpx;
+ overflow: hidden;
+ padding: 0 30rpx;
+ display: flex;
+ border-bottom: 1px solid #d9d9d9;
+}
+
+.sort-box .item {
+ height: 78rpx;
+ line-height: 78rpx;
+ text-align: center;
+ flex: 1;
+ color: #333;
+ font-size: 30rpx;
+}
+
+.sort-box .item .txt {
+ display: block;
+ width: 100%;
+ height: 100%;
+ color: #333;
+}
+
+.sort-box .item.active .txt {
+ color: #b4282d;
+}
+
+.sort-box .item.by-price {
+ background: url(//yanxuan.nosdn.127.net/hxm/yanxuan-wap/p/20161201/style/img/icon-normal/no-3127092a69.png) 155rpx center no-repeat;
+ background-size: 15rpx 21rpx;
+}
+
+.sort-box .item.by-price.active.asc {
+ background: url(http://yanxuan.nosdn.127.net/hxm/yanxuan-wap/p/20161201/style/img/icon-normal/up-636b92c0a5.png) 155rpx center no-repeat;
+ background-size: 15rpx 21rpx;
+}
+
+.sort-box .item.by-price.active.desc {
+ background: url(http://yanxuan.nosdn.127.net/hxm/yanxuan-wap/p/20161201/style/img/icon-normal/down-95e035f3e5.png) 155rpx center no-repeat;
+ background-size: 15rpx 21rpx;
+}
+
+.sort-box-category {
+ background: #fff;
+ width: 100%;
+ height: auto;
+ overflow: hidden;
+ padding: 40rpx 40rpx 0 0;
+ border-bottom: 1px solid #d9d9d9;
+}
+
+.sort-box-category .item {
+ height: 54rpx;
+ line-height: 54rpx;
+ text-align: center;
+ float: left;
+ padding: 0 16rpx;
+ margin: 0 0 40rpx 40rpx;
+ border: 1px solid #666;
+ color: #333;
+ font-size: 24rpx;
+}
+
+.sort-box-category .item.active {
+ color: #b4282d;
+ border: 1px solid #b4282d;
+}
+
+.cate-item .b {
+ width: 750rpx;
+ height: auto;
+ overflow: hidden;
+ border-top: 1rpx solid #f4f4f4;
+ margin-top: 20rpx;
+}
+
+.cate-item .b .item {
+ float: left;
+ background: #fff;
+ width: 375rpx;
+ padding-bottom: 33.333rpx;
+ border-bottom: 1rpx solid #f4f4f4;
+ height: auto;
+ overflow: hidden;
+ text-align: center;
+}
+
+.cate-item .b .item-b {
+ border-right: 1rpx solid #f4f4f4;
+}
+
+.cate-item .item .img {
+ margin-top: 10rpx;
+ width: 302rpx;
+ height: 302rpx;
+}
+
+.cate-item .item .name {
+ display: block;
+ width: 365.625rpx;
+ height: 35rpx;
+ padding: 0 20rpx;
+ overflow: hidden;
+ margin: 11.5rpx 0 22rpx 0;
+ text-align: center;
+ font-size: 30rpx;
+ color: #333;
+}
+
+.cate-item .item .price {
+ display: block;
+ width: 365.625rpx;
+ height: 30rpx;
+ text-align: center;
+ font-size: 30rpx;
+ color: #b4282d;
+}
diff --git a/wx-mini-program/pages/index/index.js b/wx-mini-program/pages/index/index.js
new file mode 100644
index 0000000..52339f2
--- /dev/null
+++ b/wx-mini-program/pages/index/index.js
@@ -0,0 +1,195 @@
+const util = require('../../utils/util.js');
+const api = require('../../config/api.js');
+const user = require('../../utils/user.js');
+
+//获取应用实例
+const app = getApp();
+
+Page({
+ data: {
+ newGoods: [],
+ hotGoods: [],
+ topics: [],
+ brands: [],
+ groupons: [],
+ floorGoods: [],
+ banner: [],
+ channel: [],
+ coupon: [],
+ articles:[],
+ goodsCount: 0,
+ indicatorDots: false,
+ window: false,
+ colseCoupon:false
+ },
+
+ onShareAppMessage: function() {
+ let userInfo = wx.getStorageSync('userInfo');
+ let shareUserId = 1;
+ if (userInfo){
+ shareUserId = userInfo.userId;
+ }
+ console.log('/pages/index/index?shareUserId=' + shareUserId);
+ return {
+ title: '聚惠星',
+ desc: '长沙市聚惠星科技与您共约',
+ path: '/pages/index/index?shareUserId=' + shareUserId
+ }
+ },
+
+ onPullDownRefresh() {
+ wx.showNavigationBarLoading() //在标题栏中显示加载
+ this.getIndexData();
+ wx.hideNavigationBarLoading() //完成停止加载
+ wx.stopPullDownRefresh() //停止下拉刷新
+ },
+
+ getIndexData: function() {
+ let that = this;
+ util.request(api.IndexUrl).then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ newGoods: res.data.newGoodsList,
+ hotGoods: res.data.hotGoodsList,
+ topics: res.data.topicList,
+ brands: res.data.brandList,
+ floorGoods: res.data.floorGoodsList,
+ banner: res.data.banner,
+ articles: res.data.articles,
+ groupons: res.data.grouponList,
+ channel: res.data.channel,
+ coupon: res.data.couponList
+ });
+ }
+ });
+ util.request(api.GoodsCount).then(function (res) {
+ that.setData({
+ goodsCount: res.data.goodsCount
+ });
+ });
+ },
+ onLoad: function(options) {
+ this.setData({
+ colseCoupon: false
+ });
+ //如果有分享用户,则设置
+ if (options.shareUserId){
+ wx.setStorageSync('shareUserId', options.shareUserId);
+ }
+
+ // 页面初始化 options为页面跳转所带来的参数
+ if (options.scene) {
+ //这个scene的值存在则证明首页的开启来源于朋友圈分享的图,同时可以通过获取到的goodId的值跳转导航到对应的详情页
+ var scene = decodeURIComponent(options.scene);
+ console.log("scene:" + scene);
+
+ let info_arr = [];
+ info_arr = scene.split(',');
+ let _type = info_arr[0];
+ let id = info_arr[1];
+
+ if (_type == 'goods') {
+ wx.navigateTo({
+ url: '../goods/goods?id=' + id
+ });
+ } else if (_type == 'groupon') {
+ wx.navigateTo({
+ url: '../goods/goods?grouponId=' + id
+ });
+ } else {
+ wx.navigateTo({
+ url: '../index/index'
+ });
+ }
+ }
+
+ // 页面初始化 options为页面跳转所带来的参数
+ if (options.grouponId) {
+ //这个pageId的值存在则证明首页的开启来源于用户点击来首页,同时可以通过获取到的pageId的值跳转导航到对应的详情页
+ wx.navigateTo({
+ url: '../goods/goods?grouponId=' + options.grouponId
+ });
+ }
+
+ // 页面初始化 options为页面跳转所带来的参数
+ if (options.goodId) {
+ //这个goodId的值存在则证明首页的开启来源于分享,同时可以通过获取到的goodId的值跳转导航到对应的详情页
+ wx.navigateTo({
+ url: '../goods/goods?id=' + options.goodId
+ });
+ }
+
+ // 页面初始化 options为页面跳转所带来的参数
+ if (options.orderId) {
+ //这个orderId的值存在则证明首页的开启来源于订单模版通知,同时可以通过获取到的pageId的值跳转导航到对应的详情页
+ wx.navigateTo({
+ url: '../ucenter/orderDetail/orderDetail?id=' + options.orderId
+ });
+ }
+
+ this.getIndexData();
+ },
+ onReady: function() {
+ // 页面渲染完成
+ let that = this;
+ let userInfo = wx.getStorageSync('userInfo');
+ if (!that.data.colseCoupon && userInfo && that.data.coupon.length > 0) {
+ that.setData({ window: true });
+ }
+ },
+ onShow: function() {
+ // 每次页面显示,需获取是否用户登录,如果用户登录,则查询用户是否有优惠券,有则弹出优惠券领取窗口
+ let that = this;
+ let userInfo = wx.getStorageSync('userInfo');
+ if (userInfo){
+ util.request(api.GetUserCoupon, null, 'GET').then(res => {
+ if (res.errno === 0) {
+ that.setData({
+ coupon: res.data.couponList
+ });
+
+ if (!that.data.colseCoupon && userInfo && that.data.coupon.length > 0) {
+ that.setData({ window: true });
+ } else {
+ that.setData({window:false});
+ }
+ }
+ })
+ }
+
+
+ },
+ onHide: function() {
+ // 页面隐藏
+ },
+ onUnload: function() {
+ // 页面关闭
+ },
+ onColse: function () {
+ this.setData({
+ window: false,
+ colseCoupon:true
+ });
+ },
+ getCoupon(e) {
+ if (!app.globalData.hasLogin) {
+ wx.navigateTo({
+ url: "/pages/auth/login/login"
+ });
+ }
+
+ let couponId = e.currentTarget.dataset.index
+ util.request(api.CouponReceive, {
+ couponId: couponId
+ }, 'POST').then(res => {
+ if (res.errno === 0) {
+ wx.showToast({
+ title: "领取成功"
+ })
+ }
+ else{
+ util.showErrorToast(res.errmsg);
+ }
+ })
+ },
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/index/index.json b/wx-mini-program/pages/index/index.json
new file mode 100644
index 0000000..75d42ce
--- /dev/null
+++ b/wx-mini-program/pages/index/index.json
@@ -0,0 +1,8 @@
+{
+ "navigationBarTitleText": "首页",
+ "usingComponents": {
+ "zan-capsule": "../../lib/zanui-weapp/capsule/index",
+ "coupon-window": "../../lib/coupon-window/index",
+ "home": "../../lib/home/index"
+ }
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/index/index.wxml b/wx-mini-program/pages/index/index.wxml
new file mode 100644
index 0000000..9d84311
--- /dev/null
+++ b/wx-mini-program/pages/index/index.wxml
@@ -0,0 +1,197 @@
+
+
+
+
+
+ 商品搜索, 共{{goodsCount}}款供您选择...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 最新
+ {{item.title}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.name}}
+
+
+
+ 更多分类
+
+
+
+
+
+
+ 团购专区
+ 邀请好友一起团购,享受折扣减免
+
+ 更多
+
+
+
+
+
+
+
+
+
+
+ {{item.goods.name}}
+
+
+
+
+ {{item.goods.brief}}
+
+
+ 团购价: ¥{{item.groupon_price}}
+
+ ¥{{item.goods.counterPrice}}
+
+
+
+
+
+
+
+
+
+
+
+ 活动专场
+
+
+
+
+
+
+
+
+
+ {{item.title}}
+ ¥{{item.price}}元起
+
+ {{item.subtitle}}
+
+
+
+
+
+
+
+
+
+ 品牌厂商直供
+ 知名品牌厂商直供,好品质,更优惠
+
+ 更多
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全网 · 新品首发NEW~
+ 全网最新上架上架
+
+ 更多
+
+
+
+
+
+
+ {{item.name}}
+ ¥{{item.retailPrice}}
+
+
+
+
+
+
+
+
+
+ 人气推荐 根据销量、搜索、好评等综合得出
+
+ 更多
+
+
+
+
+
+
+
+
+
+ {{item.name}}
+ {{item.brief}}
+ ¥{{item.retailPrice}}
+
+
+
+
+
+
+
+
+
+ {{item.name}}
+
+
+
+
+
+
+ {{iitem.name}}
+ ¥{{iitem.retailPrice}}
+
+
+
+
+
+ {{'更多'+item.name+'好物 >'}}
+
+
+
+
+
diff --git a/wx-mini-program/pages/index/index.wxss b/wx-mini-program/pages/index/index.wxss
new file mode 100644
index 0000000..6e3fa7e
--- /dev/null
+++ b/wx-mini-program/pages/index/index.wxss
@@ -0,0 +1,592 @@
+.banner {
+ width: 750rpx;
+ height: 312rpx;
+}
+
+.banner image {
+ width: 100%;
+ height: 312rpx;
+}
+
+.m-menu {
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ padding-bottom: 0rpx;
+ padding-top: 30rpx;
+}
+
+.m-menu .item {
+ width: 150rpx;
+ height: 136rpx;
+}
+
+.m-menu image {
+ display: block;
+ width: 64rpx;
+ height: 64rpx;
+ margin: 0 auto;
+ margin-bottom: 16rpx;
+}
+
+.m-menu text {
+ display: block;
+ text-align: center;
+ margin: 0 auto;
+ line-height: 1;
+}
+
+.a-section {
+ width: 750rpx;
+ height: auto;
+ overflow: hidden;
+ background: #fff;
+ margin-top: 20rpx;
+}
+
+.a-section .h {
+ display: flex;
+ flex-flow: row nowrap;
+ align-items: center;
+ justify-content: center;
+ height: 130rpx;
+}
+
+.a-section .h .txt {
+ padding-right: 30rpx;
+ background-size: 16.656rpx 27rpx;
+ display: inline-block;
+ height: 36rpx;
+ line-height: 36rpx;
+}
+
+.a-brand .b {
+ width: 750rpx;
+ height: auto;
+ overflow: hidden;
+ position: relative;
+}
+
+.a-brand .wrap {
+ position: relative;
+}
+
+.a-brand .img {
+ position: absolute;
+ left: 0;
+ top: 0;
+}
+
+.a-brand .mt {
+ position: absolute;
+ z-index: 2;
+ padding: 27rpx 31rpx;
+ left: 0;
+ top: 0;
+}
+
+.a-brand .mt .brand {
+ display: block;
+ font-size: 33rpx;
+ height: 43rpx;
+ color: #fff;
+}
+
+.a-brand .mt .price, .a-brand .mt .unit {
+ font-size: 25rpx;
+ color: #fff;
+}
+
+.a-brand .item-1 {
+ float: left;
+ width: 375rpx;
+ height: 252rpx;
+ overflow: hidden;
+ border-top: 1rpx solid #fff;
+ margin-left: 1rpx;
+}
+
+.a-brand .item-1:nth-child(2n+1) {
+ margin-left: 0;
+ width: 374rpx;
+}
+
+.a-brand .item-1 .img {
+ width: 375rpx;
+ height: 253rpx;
+}
+
+.a-coupon {
+ width: 750rpx;
+ height: auto;
+ overflow: hidden;
+}
+
+.a-coupon .b .item {
+ position: relative;
+ height: 220rpx;
+ width: 700rpx;
+ background: linear-gradient(to right, #d8050f, #e68d08);
+ margin-bottom: 10rpx;
+ margin-left: 30rpx;
+ margin-right: 30rpx;
+ overflow:hidden;
+ border-radius: 10rpx;
+}
+
+.a-coupon .b .item:before, .a-coupon .b .item:after {
+ content: '.';
+ width: 0;
+ height: 200%;
+ position: absolute;
+ top: 20rpx;
+}
+
+.a-coupon .b .item:before {
+ border-right: 20rpx dotted #eeeeee;
+ left: -10rpx;
+ width: 1rpx;
+}
+
+.a-coupon .b .item:after {
+ border-left: 20rpx dotted #eeeeee;
+ right: -10rpx;
+}
+
+
+.a-coupon .b .tag {
+ margin-left: 40rpx;
+ height: 32rpx;
+ background: #b8bb12;
+ padding-left: 16rpx;
+ padding-right: 16rpx;
+ position: absolute;
+ left: 20rpx;
+ color: #fff;
+ top: 20rpx;
+ font-size: 20rpx;
+ text-align: center;
+ line-height: 32rpx;
+}
+
+.a-coupon .b .content {
+ margin-left: 40rpx;
+ display: flex;
+ margin-right: 40rpx;
+ flex-direction: row;
+}
+
+.a-coupon .b .content .left {
+ padding-top: 50rpx;
+ flex: 1;
+ border-right: 2rpx dashed rgba(230,230,230,.5);
+}
+
+.a-coupon .b .discount {
+ font-size: 50rpx;
+ color: #e9f814;
+}
+
+.a-coupon .b .min {
+ color: #fff;
+}
+
+.a-coupon .b .content .right {
+ padding: 21px 14px;
+ width: 430rpx;
+}
+
+.a-coupon .b .name {
+ font-size: 44rpx;
+ color: #fff;
+ margin-bottom: 14rpx;
+}
+
+.a-coupon .b .desc {
+ font-size: 24rpx;
+ color: #fff;
+}
+
+.a-coupon .b .time {
+ font-size: 24rpx;
+ color: #fff;
+ line-height: 30rpx;
+}
+
+.couponbg{
+ position: absolute;
+ left: 20%;
+ top: 95rpx;
+ height: 290rpx;
+ width: 730rpx;
+ background-color: rgba(255,255,255,.15);
+ transform: rotate(-20deg);
+}
+
+.a-groupon {
+ width: 750rpx;
+ height: auto;
+ overflow: hidden;
+}
+
+.a-groupon .b .item {
+ border-top: 1px solid #d9d9d9;
+ margin: 0 20rpx;
+ padding-top: 10rpx;
+ height: 264rpx;
+ vertical-align: middle;
+ width: 710rpx;
+}
+
+.a-groupon .b .img {
+ margin-top: 12rpx;
+ margin-right: 10rpx;
+ float: left;
+ width: 220rpx;
+ height: 220rpx;
+}
+
+.a-groupon .b .right {
+ float: left;
+ height: 244rpx;
+ width: 476rpx;
+ display: flex;
+ flex-flow: row nowrap;
+}
+
+.a-groupon .b .text {
+ display: flex;
+ flex-wrap: nowrap;
+ flex-direction: column;
+ justify-content: center;
+ overflow: hidden;
+ height: 244rpx;
+ width: 476rpx;
+}
+
+.a-groupon .b .name {
+ float: left;
+ width: 330rpx;
+ display: block;
+ line-height: 42rpx;
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 2;
+ overflow: hidden;
+}
+
+.a-groupon .capsule-tag {
+ float: right;
+ padding-right: 0rpx;
+ padding-top: 8rpx;
+}
+
+.a-groupon .zan-capsule + .zan-capsule {
+ margin-left: 6px;
+}
+
+.a-groupon .b .desc {
+ margin-top: 20rpx;
+ width: 476rpx;
+ display: block;
+ line-height: 38rpx;
+}
+
+.a-groupon .b .price {
+ width: 476rpx;
+ display: flex;
+ line-height: 50rpx;
+}
+
+.a-groupon .b .counterPrice {
+ margin-left: 30rpx;
+ text-decoration: line-through;
+}
+
+.a-new .b {
+ width: 750rpx;
+ height: auto;
+ overflow: hidden;
+ padding: 0 31rpx 45rpx 31rpx;
+}
+
+.a-new .b .item {
+ float: left;
+ width: 324rpx;
+ background: #f9f9f9;
+ margin: 11rpx;
+}
+
+.a-new .b .item-b {
+ margin-left: 42rpx;
+}
+
+.a-new .b .img {
+ width: 324rpx;
+ height: 324rpx;
+}
+
+.a-new .b .name {
+ text-align: center;
+ display: block;
+ width: 324rpx;
+ height: 42rpx;
+ padding: 10rpx;
+ margin-bottom: 20rpx;
+ overflow: hidden;
+}
+
+.a-new .b .price {
+ display: block;
+ text-align: center;
+ line-height: 30rpx;
+ padding-bottom: 25rpx;
+}
+
+.a-popular {
+ width: 750rpx;
+ height: auto;
+ overflow: hidden;
+ background: #f4f4f4
+}
+
+.a-popular .b .item {
+ border-bottom: 1px solid #f4f4f4;
+ margin: 0 10rpx;
+ margin-bottom: -2rpx;
+ height: 280rpx;
+ width: 690rpx;
+}
+
+.a-popular .b .img {
+ margin-top: 10rpx;
+ margin-right: 15rpx;
+ float: left;
+ width: 230rpx;
+ height: 230rpx;
+}
+
+.a-popular .b .right {
+ float: left;
+ height: 264rpx;
+ width: 436rpx;
+ display: flex;
+ flex-flow: row nowrap;
+}
+
+.a-popular .b .text {
+ display: flex;
+ flex-wrap: nowrap;
+ flex-direction: column;
+ justify-content: center;
+ overflow: hidden;
+ height: 264rpx;
+ width: 436rpx;
+}
+
+.a-popular .b .name {
+ width: 436rpx;
+ display: block;
+ line-height: 40rpx;
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 2;
+ overflow: hidden;
+}
+
+.a-popular .b .desc {
+ margin-top: 18rpx;
+ width: 436rpx;
+ display: block;
+ line-height: 38rpx;
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 2;
+ overflow: hidden;
+}
+
+.a-popular .b .price {
+ margin-top: 18rpx;
+ width: 436rpx;
+ display: block;
+ line-height: 30rpx;
+}
+
+.a-topic .b {
+ height: 533rpx;
+ width: 750rpx;
+ padding: 0 0 48rpx 0;
+}
+
+.a-topic .b .list {
+ height: 533rpx;
+ width: 750rpx;
+ white-space: nowrap;
+}
+
+.a-topic .b .item {
+ display: inline-block;
+ height: 533rpx;
+ width: 680.5rpx;
+ margin-left: 30rpx;
+ overflow: hidden;
+}
+
+.a-topic .b .item:last-child {
+ margin-right: 30rpx;
+}
+
+.a-topic .b .img {
+ height: 387.5rpx;
+ width: 680.5rpx;
+ margin-bottom: 30rpx;
+}
+
+.a-topic .b .np {
+ height: 55rpx;
+ text-align: center;
+}
+
+.a-topic .b .np .price {
+ padding-left: 40rpx;
+}
+
+.a-topic .b .desc {
+ display: block;
+ height: 30rpx;
+ text-align: center;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.good-grid {
+ width: 750rpx;
+ height: auto;
+ overflow: hidden;
+}
+
+.good-grid .h {
+ display: flex;
+ flex-flow: row nowrap;
+ align-items: center;
+ justify-content: center;
+ height: 130rpx;
+}
+
+.good-grid .b {
+ width: 750rpx;
+ padding: 0 6.25rpx;
+ height: auto;
+ overflow: hidden;
+}
+
+.good-grid .b .item {
+ float: left;
+ background: #fff;
+ width: 365rpx;
+ margin-bottom: 6.25rpx;
+ height: 452rpx;
+ overflow: hidden;
+ text-align: center;
+}
+
+.good-grid .b .item .a {
+ height: 452rpx;
+ width: 100%;
+}
+
+.good-grid .b .item-b {
+ margin-left: 6.25rpx;
+}
+
+.good-grid .item .img {
+ margin-top: 20rpx;
+ width: 302rpx;
+ height: 302rpx;
+}
+
+.good-grid .item .name {
+ display: block;
+ width: 365.625rpx;
+ padding: 0 20rpx;
+ overflow: hidden;
+ height: 35rpx;
+ margin: 11.5rpx 0 22rpx 0;
+ text-align: center;
+}
+
+.good-grid .item .price {
+ display: block;
+ width: 365.625rpx;
+ height: 30rpx;
+ text-align: center;
+}
+
+.good-grid .t {
+ height: 100rpx;
+ background: #fff;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+.search {
+ height: 100rpx;
+ width: 100%;
+ padding: 0 30rpx;
+ background: #fff;
+ display: flex;
+ align-items: center;
+}
+
+.search .input {
+ width: 690rpx;
+ height: 70rpx;
+ border-radius: 20rpx;
+ display: flex;
+ padding-top: 18rpx;
+ padding-left: 20rpx;
+ align-items: left;
+ vertical-align: middle;
+ justify-content: left;
+}
+
+.search .icon {
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAMAAABF0y+mAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAA8UExURUdwTGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjQWelcAAAATdFJOUwDUDlMW8DUFcdHpnc3cSLkosSd78uTdAAAAvUlEQVQoz4WS6QLDEBCE131L0nn/d23J0VCV+bP4LLsM0S6Tg1NQLmRDnYz1OOVti18OcFZLI7Utw/XGtEIS10wkKH3NVoWF3/byBerMNQ5be4vZ4I4Vi8S7+niC3bd55L54yvA1VSDSryJqheE4oZVFKMFBD6AGK0FBDiCHKgEwA/hZfsxkszun1U77nL7Q9G3nvzL6z1sH2ndOANi3eRmrhzjx6qGo2Z327pMNJSMO34paSkc7PdJI/2lc3naRCwMB9sl5AAAAAElFTkSuQmCC') center no-repeat;
+ background-size: 100%;
+ width: 34rpx;
+ height: 34rpx;
+}
+
+.search .txt {
+ height: 42rpx;
+ line-height: 42rpx;
+ padding-left: 10rpx;
+}
+
+.container .news{height:77rpx;border-bottom:1rpx solid #eee;padding:0 30rpx;box-shadow:0 10rpx 30rpx #f5f5f5; background: #fff;}
+.container .news .pictrue{width:124rpx;height:28rpx;border-right:1rpx solid #ddd;padding-right:23rpx;box-sizing: content-box;}
+.container .news .pictrue image{width:100%;height:100%;}
+.container .news .swiperTxt{width:523rpx;height:100%;line-height:77rpx;overflow:hidden;}
+.container .news .swiperTxt .text{width:480rpx;}
+.container .news .swiperTxt .text .label{font-size:20rpx;color:#ff4c48;width:64rpx;height:30rpx;border-radius:40rpx;text-align:center;line-height:28rpx;border:2rpx solid #ff4947;}
+.container .news .swiperTxt .text .newsTitle{width:397rpx;}
+.container .news .swiperTxt .iconfont{font-size:28rpx;color:#888;}
+.container .news .swiperTxt swiper{height:100%;}
+
+.container .a-section .title{height:120rpx;border-top:0rpx solid #eee;padding-top:14rpx;margin:0 30rpx;}
+.container .a-section .title .text{width:530rpx;}
+.container .a-section .title .text .name{margin-bottom:5rpx;position:relative;}
+.container .a-section .title .text .name .new{position:absolute;top:6rpx;left:210rpx;font-size:20rpx;font-weight:bold;}
+.container .a-section .title .more .iconfont{margin-left:9rpx;font-size:26rpx;vertical-align:3rpx;}
+
+.container .a-section .hot-bg{width:100%;height:215rpx;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAu4AAADXCAMAAAByKSS0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4MGE2NWE3Zi0yNWE4LTZmNGQtYTMxMy00MTZhMTBmYmE0ODQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzAzNzI0OTY3QTU4MTFFOTlFNzhFREU5RTk4NzY5N0QiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzAzNzI0OTU3QTU4MTFFOTlFNzhFREU5RTk4NzY5N0QiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MzA2YjgyZTgtYmI3ZC1jZDQ0LWI1ZGYtZDg2MTY0N2ExZTgyIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjgwYTY1YTdmLTI1YTgtNmY0ZC1hMzEzLTQxNmExMGZiYTQ4NCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PiPwrBwAAAGAUExURf2cSv/58f2gTfVSIPyWFv/t1v2gFfZZMfyeFf2jFP7QkP2qU+atUfuHLvdpHPuSFvl2G/7YpfycFfZaHvuFMfyaFf7Hc/qKGOqwU/yYFv2kFPdrHPqoK+iuUvuQF/dmHfhxG/qFGPdjHfuOF/huHPh0G/diHfhsHPZeHvhyG/uMF/VVH/ZcHvZZH/ZgHvl4Gv2zWfqIGPl6GvuJMPqGGPVWH/2lO/qCGfl+Gfl8GvuwdO2yVPl8J/qBMfuINf21RvqAGeuxU/7kuvqENfqIOPZdNPp9MfuUFv2lUOusR/qFOPG1VPqBNf2wV/uMMP68VP2lG/y+jv2+Xv2vNvZgNfqVVfuNNu+zVPVWKPZhHvZbM/ZYLPuaJva4VPuZOf3cwP2lF/dsHPCwSfGsO/ulXvynIPl9IPqII/uMG/ycG/mIQPqFIPl4H/h1If2tVfuMI/hzIvmBJPuRIvqHG/qeY/mAG/qCGvmAGfVXH/VTIPhvHPZYMPyZFvuLGPl9Gv///yfqZwMAAACAdFJOU/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AOAVLZwAAEzJJREFUeNrsnYl7E8cBxSciRPGhJE4U1wGZltxN0sTURBBbkjEyDr5lGSTV4nBxhCm4gDnjuJB/vbOHVrO7s6d2pZ3Z94Qp6de0n9ufX9++fbNLTg1Yx7q+t+hnTb+r+gerT3r6QdW3Zv2o6F+Kvlb0eVd/NekDVmep/v0N1Ze6/qD6W1d/p/qK0UdUPzH6p65fqN5SXdb1+vXrK1cuMTqv6yLVBV1/6eoN1XeKvujqHKsPu/pV1bsmfabqf4o+VfQxo/fNes+mEZvOJECFmZkNRY8fPx6juk6VuZ5RRKwqhv9PIcOB3YH2333Q/m3MtFthD0T7pfC0nwtI+/+iov1MQmg34a7yruFuAv6O8nVrTwzcg9P+STDaPw9C+5cJoP2LaGl/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');background-repeat:no-repeat;background-size:100% 100%;box-sizing:border-box;padding:14rpx;margin-bottom:0;}
+.container .a-section .hot-bg .title{height:87rpx;}
+.container .a-section .hot-bg .title .text{width:575rpx;font-size:24rpx;color:#fff;}
+.container .a-section .hot-bg .title .text .label{font-size:30rpx;font-weight:bold;margin-right:20rpx;color:#fff;}
+.container .a-section .hot-bg .title .more{font-size:26rpx;color:#fff;}
+.container .a-section .hot-bg .title .more .iconfont{font-size:25rpx;vertical-align:2rpx;
+margin-left:10rpx;color:#fff;}
+.container .a-popular .b {width:96%;height:auto;border-radius:20rpx;background-color:#fff;margin:-100rpx auto 0 auto;box-sizing:border-box;box-shadow: 0 0 30rpx -10rpx #aaa;}
+
+
diff --git a/wx-mini-program/pages/logs/logs.js b/wx-mini-program/pages/logs/logs.js
new file mode 100644
index 0000000..b2b967d
--- /dev/null
+++ b/wx-mini-program/pages/logs/logs.js
@@ -0,0 +1,15 @@
+//logs.js
+const util = require('../../utils/util.js')
+
+Page({
+ data: {
+ logs: []
+ },
+ onLoad: function () {
+ this.setData({
+ logs: (wx.getStorageSync('logs') || []).map(log => {
+ return util.formatTime(new Date(log))
+ })
+ })
+ }
+})
diff --git a/wx-mini-program/pages/logs/logs.json b/wx-mini-program/pages/logs/logs.json
new file mode 100644
index 0000000..022c287
--- /dev/null
+++ b/wx-mini-program/pages/logs/logs.json
@@ -0,0 +1,5 @@
+{
+ "navigationBarTitleText": "查看启动日志",
+ "enablePullDownRefresh": false,
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/logs/logs.wxml b/wx-mini-program/pages/logs/logs.wxml
new file mode 100644
index 0000000..b5a85ac
--- /dev/null
+++ b/wx-mini-program/pages/logs/logs.wxml
@@ -0,0 +1,6 @@
+
+
+
+ {{index + 1}}. {{log}}
+
+
diff --git a/wx-mini-program/pages/logs/logs.wxss b/wx-mini-program/pages/logs/logs.wxss
new file mode 100644
index 0000000..94d4b88
--- /dev/null
+++ b/wx-mini-program/pages/logs/logs.wxss
@@ -0,0 +1,8 @@
+.log-list {
+ display: flex;
+ flex-direction: column;
+ padding: 40rpx;
+}
+.log-item {
+ margin: 10rpx;
+}
diff --git a/wx-mini-program/pages/newGoods/newGoods.js b/wx-mini-program/pages/newGoods/newGoods.js
new file mode 100644
index 0000000..aea4879
--- /dev/null
+++ b/wx-mini-program/pages/newGoods/newGoods.js
@@ -0,0 +1,118 @@
+var util = require('../../utils/util.js');
+var api = require('../../config/api.js');
+var app = getApp();
+
+Page({
+ data: {
+ bannerInfo: {
+ 'imgUrl': 'http://yanxuan.nosdn.127.net/8976116db321744084774643a933c5ce.png',
+ 'name': '大家都在买的'
+ },
+ categoryFilter: false,
+ filterCategory: [],
+ goodsList: [],
+ categoryId: 0,
+ currentSortType: 'default',
+ currentSort: 'add_time',
+ currentSortOrder: 'desc',
+ page: 1,
+ size: 200
+ },
+ getGoodsList: function() {
+ var that = this;
+
+ util.request(api.GoodsList, {
+ isNew: true,
+ page: that.data.page,
+ size: that.data.size,
+ order: that.data.currentSortOrder,
+ sort: that.data.currentSort,
+ categoryId: that.data.categoryId
+ })
+ .then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ goodsList: res.data.goodsList,
+ filterCategory: res.data.filterCategoryList
+ });
+ }
+ });
+ },
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ this.getGoodsList();
+ },
+ onReady: function() {
+ // 页面渲染完成
+ },
+ onShow: function() {
+ // 页面显示
+
+ },
+ onHide: function() {
+ // 页面隐藏
+
+ },
+ onUnload: function() {
+ // 页面关闭
+
+ },
+ openSortFilter: function(event) {
+ let currentId = event.currentTarget.id;
+ let tmpSortOrder = 'asc';
+ switch (currentId) {
+ case 'categoryFilter':
+ this.setData({
+ categoryFilter: !this.data.categoryFilter,
+ currentSortType: 'category',
+ currentSort: 'add_time',
+ currentSortOrder: 'desc'
+ });
+ break;
+ case 'priceSort':
+ if (this.data.currentSortOrder == 'asc') {
+ tmpSortOrder = 'desc';
+ }
+ this.setData({
+ currentSortType: 'price',
+ currentSort: 'retail_price',
+ currentSortOrder: tmpSortOrder,
+ categoryFilter: false
+ });
+
+ this.getGoodsList();
+ break;
+ case 'salesSort':
+ if (this.data.currentSortOrder == 'asc') {
+ tmpSortOrder = 'desc';
+ }
+ this.setData({
+ currentSortType: 'sales',
+ currentSort: 'sales',
+ currentSortOrder: tmpSortOrder,
+ categoryFilter: false
+ });
+ this.getGoodsList();
+ break;
+ default:
+ //综合排序
+ this.setData({
+ currentSortType: 'default',
+ currentSort: 'add_time',
+ currentSortOrder: 'desc',
+ categoryFilter: false,
+ categoryId: 0
+ });
+ this.getGoodsList();
+ }
+ },
+ selectCategory: function(event) {
+ let currentIndex = event.target.dataset.categoryIndex;
+ this.setData({
+ 'categoryFilter': false,
+ 'categoryId': this.data.filterCategory[currentIndex].id
+ });
+ this.getGoodsList();
+
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/newGoods/newGoods.json b/wx-mini-program/pages/newGoods/newGoods.json
new file mode 100644
index 0000000..3802cc0
--- /dev/null
+++ b/wx-mini-program/pages/newGoods/newGoods.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "新品首发",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/newGoods/newGoods.wxml b/wx-mini-program/pages/newGoods/newGoods.wxml
new file mode 100644
index 0000000..0285da0
--- /dev/null
+++ b/wx-mini-program/pages/newGoods/newGoods.wxml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+ {{bannerInfo.name}}
+
+
+
+
+
+
+
+
+ 综合
+
+
+ 价格
+
+
+ 销量
+
+
+
+ {{item.name}}
+
+
+
+
+
+
+
+ {{iitem.name}}
+ ¥{{iitem.retailPrice}}
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/newGoods/newGoods.wxss b/wx-mini-program/pages/newGoods/newGoods.wxss
new file mode 100644
index 0000000..d0b1d34
--- /dev/null
+++ b/wx-mini-program/pages/newGoods/newGoods.wxss
@@ -0,0 +1,177 @@
+page {
+ background: #f4f4f4;
+}
+
+.brand-info .name {
+ width: 100%;
+ height: 278rpx;
+ position: relative;
+}
+
+.brand-info .img {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 278rpx;
+}
+
+.brand-info .info-box {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 278rpx;
+ text-align: center;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.brand-info .info {
+ display: block;
+}
+
+.brand-info .txt {
+ display: block;
+ height: 40rpx;
+ font-size: 37.5rpx;
+ color: #fff;
+}
+
+.brand-info .line {
+ margin: 0 auto;
+ margin-top: 16rpx;
+ display: block;
+ height: 2rpx;
+ width: 145rpx;
+ background: #fff;
+}
+
+.sort {
+ position: relative;
+ background: #fff;
+ width: 100%;
+ height: 78rpx;
+}
+
+.sort-box {
+ background: #fff;
+ width: 100%;
+ height: 78rpx;
+ overflow: hidden;
+ padding: 0 30rpx;
+ display: flex;
+ border-bottom: 1px solid #d9d9d9;
+}
+
+.sort-box .item {
+ height: 78rpx;
+ line-height: 78rpx;
+ text-align: center;
+ flex: 1;
+ color: #333;
+ font-size: 30rpx;
+}
+
+.sort-box .item .txt {
+ display: block;
+ width: 100%;
+ height: 100%;
+ color: #333;
+}
+
+.sort-box .item.active .txt {
+ color: #b4282d;
+}
+
+.sort-box .item.by-price {
+ background: url(//yanxuan.nosdn.127.net/hxm/yanxuan-wap/p/20161201/style/img/icon-normal/no-3127092a69.png) 155rpx center no-repeat;
+ background-size: 15rpx 21rpx;
+}
+
+.sort-box .item.by-price.active.asc {
+ background: url(http://yanxuan.nosdn.127.net/hxm/yanxuan-wap/p/20161201/style/img/icon-normal/up-636b92c0a5.png) 155rpx center no-repeat;
+ background-size: 15rpx 21rpx;
+}
+
+.sort-box .item.by-price.active.desc {
+ background: url(http://yanxuan.nosdn.127.net/hxm/yanxuan-wap/p/20161201/style/img/icon-normal/down-95e035f3e5.png) 155rpx center no-repeat;
+ background-size: 15rpx 21rpx;
+}
+
+.sort-box-category {
+ background: #fff;
+ width: 100%;
+ height: auto;
+ overflow: hidden;
+ padding: 40rpx 40rpx 0 0;
+ border-bottom: 1px solid #d9d9d9;
+}
+
+.sort-box-category .item {
+ height: 54rpx;
+ line-height: 54rpx;
+ text-align: center;
+ float: left;
+ padding: 0 16rpx;
+ margin: 0 0 40rpx 40rpx;
+ border: 1px solid #666;
+ color: #333;
+ font-size: 24rpx;
+}
+
+.sort-box-category .item.active {
+ color: #b4282d;
+ border: 1px solid #b4282d;
+}
+
+.cate-item .b {
+ width: 750rpx;
+ height: auto;
+ overflow: hidden;
+ border-top: 1rpx solid #f4f4f4;
+ margin-top: 20rpx;
+}
+
+.cate-item .b .item {
+ float: left;
+ background: #fff;
+ width: 375rpx;
+ padding-bottom: 33.333rpx;
+ border-bottom: 1rpx solid #f4f4f4;
+ height: auto;
+ overflow: hidden;
+ text-align: center;
+}
+
+.cate-item .b .item-b {
+ border-right: 1rpx solid #f4f4f4;
+}
+
+.cate-item .item .img {
+ margin-top: 10rpx;
+ width: 302rpx;
+ height: 302rpx;
+}
+
+.cate-item .item .name {
+ display: block;
+ width: 365.625rpx;
+ height: 35rpx;
+ padding: 0 20rpx;
+ overflow: hidden;
+ margin: 11.5rpx 0 22rpx 0;
+ text-align: center;
+ font-size: 30rpx;
+ color: #333;
+}
+
+.cate-item .item .price {
+ display: block;
+ width: 365.625rpx;
+ height: 30rpx;
+ text-align: center;
+ font-size: 30rpx;
+ color: #b4282d;
+}
diff --git a/wx-mini-program/pages/payResult/payResult.js b/wx-mini-program/pages/payResult/payResult.js
new file mode 100644
index 0000000..86a328d
--- /dev/null
+++ b/wx-mini-program/pages/payResult/payResult.js
@@ -0,0 +1,97 @@
+var util = require('../../utils/util.js');
+var api = require('../../config/api.js');
+
+var app = getApp();
+var lastTime = null;
+Page({
+ data: {
+ status: false,
+ orderId: 0
+ },
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ this.setData({
+ orderId: options.orderId,
+ status: options.status === '1' ? true : false
+ })
+ },
+ onReady: function() {
+
+ },
+ onShow: function() {
+ // 页面显示
+
+ },
+ onHide: function() {
+ // 页面隐藏
+
+ },
+ onUnload: function() {
+ // 页面关闭
+
+ },
+ payOrder() {
+ let that = this;
+ // 模拟支付成功,同理,后台也仅仅是返回一个成功的消息而已
+ // wx.showModal({
+ // title: '目前不能微信支付',
+ // content: '点击确定模拟支付成功,点击取消模拟未支付成功',
+ // success: function (res) {
+ // if (res.confirm) {
+ // util.request(api.OrderPrepay, { orderId: that.data.orderId }, 'POST').then(res => {
+ // if (res.errno === 0) {
+ // that.setData({
+ // status: true
+ // });
+ // }
+ // else {
+ // util.showErrorToast('支付失败');
+ // }
+ // });
+ // }
+ // else if (res.cancel) {
+ // util.showErrorToast('支付失败');
+ // }
+
+ // }
+ // });
+
+ util.jhxLoadShow("重新付款,请稍后...");
+ let nowTime = + new Date();
+ if (nowTime - lastTime > 5000 || !lastTime) { //5秒内避免重复提交订单
+ lastTime = nowTime;
+ } else {
+ return false;
+ }
+
+ util.request(api.OrderPrepay, {
+ orderId: that.data.orderId
+ }, 'POST').then(function(res) {
+
+ if (res.errno === 0) {
+ const payParam = res.data;
+ console.log("支付过程开始")
+ wx.requestPayment({
+ 'timeStamp': payParam.timeStamp,
+ 'nonceStr': payParam.nonceStr,
+ 'package': payParam.packageValue,
+ 'signType': payParam.signType,
+ 'paySign': payParam.paySign,
+ 'success': function(res) {
+ console.log("支付过程成功")
+ that.setData({
+ status: true
+ });
+ },
+ 'fail': function(res) {
+ console.log("支付过程失败")
+ util.showErrorToast('支付失败');
+ },
+ 'complete': function(res) {
+ console.log("支付过程结束")
+ }
+ });
+ }
+ });
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/payResult/payResult.json b/wx-mini-program/pages/payResult/payResult.json
new file mode 100644
index 0000000..d0ba80f
--- /dev/null
+++ b/wx-mini-program/pages/payResult/payResult.json
@@ -0,0 +1,5 @@
+{
+ "navigationBarTitleText": "付款结果",
+ "enablePullDownRefresh": false,
+ "navigationBarBackgroundColor": "#85c43f"
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/payResult/payResult.wxml b/wx-mini-program/pages/payResult/payResult.wxml
new file mode 100644
index 0000000..ab27c18
--- /dev/null
+++ b/wx-mini-program/pages/payResult/payResult.wxml
@@ -0,0 +1,24 @@
+
+
+
+ 付款成功
+
+ 查看订单
+ 继续逛
+
+
+
+ 付款失败
+
+ 请在
+ 半小时 内完成付款
+ 否则订单将会被系统取消
+
+
+ 查看订单
+ 重新付款
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/payResult/payResult.wxss b/wx-mini-program/pages/payResult/payResult.wxss
new file mode 100644
index 0000000..3811ad4
--- /dev/null
+++ b/wx-mini-program/pages/payResult/payResult.wxss
@@ -0,0 +1,59 @@
+page {
+ min-height: 100%;
+ width: 100%;
+ background: #fff;
+}
+
+.container {
+ height: 100%;
+ background: #fff;
+}
+
+.pay-result {
+ background: #fff;
+}
+
+.pay-result .msg {
+ text-align: center;
+ margin: 100rpx auto;
+ color: #2bab25;
+ font-size: 36rpx;
+}
+
+.pay-result .btns {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.pay-result .btn {
+ text-align: center;
+ height: 80rpx;
+ margin: 0 20rpx;
+ width: 200rpx;
+ line-height: 78rpx;
+ border: 1px solid #868686;
+ color: #000;
+ border-radius: 5rpx;
+}
+
+.pay-result .error .msg {
+ color: #b4282d;
+ margin-bottom: 60rpx;
+}
+
+.pay-result .error .tips {
+ color: #7f7f7f;
+ margin-bottom: 70rpx;
+}
+
+.pay-result .error .tips .p {
+ font-size: 24rpx;
+ line-height: 42rpx;
+ text-align: center;
+}
+
+.pay-result .error .tips .p {
+ line-height: 42rpx;
+ text-align: center;
+}
diff --git a/wx-mini-program/pages/search/search.js b/wx-mini-program/pages/search/search.js
new file mode 100644
index 0000000..88a4c61
--- /dev/null
+++ b/wx-mini-program/pages/search/search.js
@@ -0,0 +1,195 @@
+var util = require('../../utils/util.js');
+var api = require('../../config/api.js');
+
+var app = getApp()
+Page({
+ data: {
+ keywrod: '',
+ searchStatus: false,
+ goodsList: [],
+ helpKeyword: [],
+ historyKeyword: [],
+ categoryFilter: false,
+ currentSort: 'name',
+ currentSortType: 'default',
+ currentSortOrder: 'desc',
+ filterCategory: [],
+ defaultKeyword: {},
+ hotKeyword: [],
+ page: 1,
+ size: 20,
+ categoryId: 0
+ },
+ //事件处理函数
+ closeSearch: function() {
+ wx.navigateBack()
+ },
+ clearKeyword: function() {
+ this.setData({
+ keyword: '',
+ searchStatus: false
+ });
+ },
+ onLoad: function() {
+
+ this.getSearchKeyword();
+ },
+
+ getSearchKeyword() {
+ let that = this;
+ util.request(api.SearchIndex).then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ historyKeyword: res.data.historyKeywordList,
+ defaultKeyword: res.data.defaultKeyword,
+ hotKeyword: res.data.hotKeywordList
+ });
+ }
+ });
+ },
+
+ inputChange: function(e) {
+ this.setData({
+ keyword: e.detail.value,
+ searchStatus: false
+ });
+
+ if (e.detail.value) {
+ this.getHelpKeyword();
+ }
+ },
+ getHelpKeyword: function() {
+ let that = this;
+ util.request(api.SearchHelper, {
+ keyword: that.data.keyword
+ }).then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ helpKeyword: res.data
+ });
+ }
+ });
+ },
+ inputFocus: function() {
+ this.setData({
+ searchStatus: false,
+ goodsList: []
+ });
+
+ if (this.data.keyword) {
+ this.getHelpKeyword();
+ }
+ },
+ clearHistory: function() {
+ this.setData({
+ historyKeyword: []
+ })
+
+ util.request(api.SearchClearHistory, {}, 'POST')
+ .then(function(res) {
+ console.log('清除成功');
+ });
+ },
+ getGoodsList: function() {
+ let that = this;
+ util.request(api.GoodsList, {
+ keyword: that.data.keyword,
+ page: that.data.page,
+ size: that.data.size,
+ sort: that.data.currentSort,
+ order: that.data.currentSortOrder,
+ categoryId: that.data.categoryId
+ }).then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ searchStatus: true,
+ categoryFilter: false,
+ goodsList: res.data.goodsList,
+ filterCategory: res.data.filterCategoryList
+ });
+ }
+
+ //重新获取关键词
+ that.getSearchKeyword();
+ });
+ },
+ onKeywordTap: function(event) {
+
+ this.getSearchResult(event.target.dataset.keyword);
+
+ },
+ getSearchResult(keyword) {
+ if (keyword === '') {
+ keyword = this.data.defaultKeyword.keyword;
+ }
+ this.setData({
+ keyword: keyword,
+ page: 1,
+ categoryId: 0,
+ goodsList: []
+ });
+
+ this.getGoodsList();
+ },
+ openSortFilter: function(event) {
+ let currentId = event.currentTarget.id;
+ switch (currentId) {
+ case 'categoryFilter':
+ this.setData({
+ categoryFilter: !this.data.categoryFilter,
+ currentSortType: 'category',
+ currentSort: 'add_time',
+ currentSortOrder: 'desc'
+ });
+ break;
+ case 'priceSort':
+ let tmpSortOrder = 'asc';
+ if (this.data.currentSortOrder == 'asc') {
+ tmpSortOrder = 'desc';
+ }
+ this.setData({
+ currentSortType: 'price',
+ currentSort: 'retail_price',
+ currentSortOrder: tmpSortOrder,
+ categoryFilter: false
+ });
+
+ this.getGoodsList();
+ break;
+ default:
+ //综合排序
+ this.setData({
+ currentSortType: 'default',
+ currentSort: 'name',
+ currentSortOrder: 'desc',
+ categoryFilter: false,
+ categoryId: 0,
+ });
+ this.getGoodsList();
+ }
+ },
+ selectCategory: function(event) {
+ let currentIndex = event.target.dataset.categoryIndex;
+ let filterCategory = this.data.filterCategory;
+ let currentCategory = null;
+ for (let key in filterCategory) {
+ if (key == currentIndex) {
+ filterCategory[key].selected = true;
+ currentCategory = filterCategory[key];
+ } else {
+ filterCategory[key].selected = false;
+ }
+ }
+ this.setData({
+ filterCategory: filterCategory,
+ categoryFilter: false,
+ categoryId: currentCategory.id,
+ page: 1,
+ goodsList: []
+ });
+ this.getGoodsList();
+ },
+ onKeywordConfirm(event) {
+ this.getSearchResult(event.detail.value);
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/search/search.json b/wx-mini-program/pages/search/search.json
new file mode 100644
index 0000000..16a5815
--- /dev/null
+++ b/wx-mini-program/pages/search/search.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "搜索",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/search/search.wxml b/wx-mini-program/pages/search/search.wxml
new file mode 100644
index 0000000..e146bf5
--- /dev/null
+++ b/wx-mini-program/pages/search/search.wxml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+ 取消
+
+
+
+
+ 历史记录
+
+
+
+ {{item.keyword}}
+
+
+
+
+ 热门搜索
+
+
+ {{item.keyword}}
+
+
+
+ {{item}}
+
+
+
+
+
+
+
+ 综合
+
+
+ 价格
+
+
+ 分类
+
+
+
+ {{item.name}}
+
+
+
+
+
+
+ {{iitem.name}}
+ ¥{{iitem.retailPrice}}
+
+
+
+
+
+
+
+ 您寻找的商品还未上架
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/search/search.wxss b/wx-mini-program/pages/search/search.wxss
new file mode 100644
index 0000000..47c50c0
--- /dev/null
+++ b/wx-mini-program/pages/search/search.wxss
@@ -0,0 +1,335 @@
+page {
+ min-height: 100%;
+ background-color: #f4f4f4;
+}
+
+.container {
+ min-height: 100%;
+ background-color: #f4f4f4;
+}
+
+.search-header {
+ position: fixed;
+ top: 0;
+ width: 750rpx;
+ height: 91rpx;
+ display: flex;
+ background: #fff;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.15);
+ padding: 0 31.25rpx;
+ font-size: 29rpx;
+ color: #333;
+}
+
+.search-header .input-box {
+ position: relative;
+ margin-top: 16rpx;
+ float: left;
+ width: 0;
+ flex: 1;
+ height: 59rpx;
+ line-height: 59rpx;
+ padding: 0 20rpx;
+ background: #f4f4f4;
+}
+
+.search-header .icon {
+ position: absolute;
+ top: 14rpx;
+ left: 20rpx;
+ width: 31rpx;
+ height: 31rpx;
+}
+
+.search-header .del {
+ position: absolute;
+ top: 3rpx;
+ right: 10rpx;
+ width: 53rpx;
+ height: 53rpx;
+ z-index: 10;
+}
+
+.search-header .keywrod {
+ position: absolute;
+ top: 0;
+ left: 40rpx;
+ width: 506rpx;
+ height: 59rpx;
+ padding-left: 30rpx;
+}
+
+.search-header .right {
+ margin-top: 24rpx;
+ margin-left: 31rpx;
+ margin-right: 6rpx;
+ width: 58rpx;
+ height: 43rpx;
+ line-height: 43rpx;
+ float: right;
+}
+
+.no-search {
+ height: auto;
+ overflow: hidden;
+ margin-top: 91rpx;
+}
+
+.search-keywords {
+ background: #fff;
+ width: 750rpx;
+ height: auto;
+ overflow: hidden;
+ margin-bottom: 20rpx;
+}
+
+.search-keywords .h {
+ padding: 0 31.25rpx;
+ height: 93rpx;
+ line-height: 93rpx;
+ width: 100%;
+ color: #999;
+ font-size: 29rpx;
+}
+
+.search-keywords .title {
+ display: block;
+ width: 120rpx;
+ float: left;
+}
+
+.search-keywords .icon {
+ margin-top: 19rpx;
+ float: right;
+ display: block;
+ margin-left: 511rpx;
+ height: 55rpx;
+ width: 55rpx;
+}
+
+.search-keywords .b {
+ width: 750rpx;
+ height: auto;
+ overflow: hidden;
+ padding-left: 31.25rpx;
+}
+
+.search-keywords .item {
+ display: inline-block;
+ width: auto;
+ height: 48rpx;
+ line-height: 48rpx;
+ padding: 0 15rpx;
+ border: 1px solid #999;
+ margin: 0 31.25rpx 31.25rpx 0;
+ font-size: 24rpx;
+ color: #333;
+}
+
+.search-keywords .item.active {
+ color: #b4282d;
+ border: 1px solid #b4282d;
+}
+
+.shelper-list {
+ width: 750rpx;
+ height: auto;
+ overflow: hidden;
+ background: #fff;
+ padding: 0 31.25rpx;
+}
+
+.shelper-list .item {
+ height: 93rpx;
+ width: 687.5rpx;
+ line-height: 93rpx;
+ font-size: 24rpx;
+ color: #333;
+ border-bottom: 1px solid #f4f4f4;
+}
+
+.sort {
+ position: fixed;
+ top: 91rpx;
+ background: #fff;
+ width: 100%;
+ height: 78rpx;
+}
+
+.sort-box {
+ background: #fff;
+ width: 100%;
+ height: 78rpx;
+ overflow: hidden;
+ padding: 0 30rpx;
+ display: flex;
+ border-bottom: 1px solid #d9d9d9;
+}
+
+.sort-box .item {
+ height: 78rpx;
+ line-height: 78rpx;
+ text-align: center;
+ flex: 1;
+ color: #333;
+ font-size: 30rpx;
+}
+
+.sort-box .item .txt {
+ display: block;
+ width: 100%;
+ height: 100%;
+ color: #333;
+}
+
+.sort-box .item.active .txt {
+ color: #b4282d;
+}
+
+.sort-box .item.by-price {
+ background: url(//yanxuan.nosdn.127.net/hxm/yanxuan-wap/p/20161201/style/img/icon-normal/no-3127092a69.png) 155rpx center no-repeat;
+ background-size: 15rpx 21rpx;
+}
+
+.sort-box .item.by-price.active.asc {
+ background: url(http://yanxuan.nosdn.127.net/hxm/yanxuan-wap/p/20161201/style/img/icon-normal/up-636b92c0a5.png) 155rpx center no-repeat;
+ background-size: 15rpx 21rpx;
+}
+
+.sort-box .item.by-price.active.desc {
+ background: url(http://yanxuan.nosdn.127.net/hxm/yanxuan-wap/p/20161201/style/img/icon-normal/down-95e035f3e5.png) 155rpx center no-repeat;
+ background-size: 15rpx 21rpx;
+}
+
+.sort-box-category {
+ background: #fff;
+ width: 100%;
+ height: auto;
+ overflow: hidden;
+ padding: 40rpx 40rpx 0 0;
+ border-bottom: 1px solid #d9d9d9;
+}
+
+.sort-box-category .item {
+ height: 54rpx;
+ line-height: 54rpx;
+ text-align: center;
+ float: left;
+ padding: 0 16rpx;
+ margin: 0 0 40rpx 40rpx;
+ border: 1px solid #666;
+ color: #333;
+ font-size: 24rpx;
+}
+
+.sort-box-category .item.active {
+ color: #b4282d;
+ border: 1px solid #b4282d;
+}
+
+.cate-item {
+ margin-top: 175rpx;
+ height: auto;
+ overflow: hidden;
+}
+
+.cate-item .h {
+ height: 145rpx;
+ width: 750rpx;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+
+.cate-item .h .name {
+ display: block;
+ height: 35rpx;
+ margin-bottom: 18rpx;
+ font-size: 30rpx;
+ color: #333;
+}
+
+.cate-item .h .desc {
+ display: block;
+ height: 24rpx;
+ font-size: 24rpx;
+ color: #999;
+}
+
+.cate-item .b {
+ width: 750rpx;
+ padding: 0 6.25rpx;
+ height: auto;
+ overflow: hidden;
+}
+
+.cate-item .list-filter {
+ height: 80rpx;
+ width: 100%;
+ background: #fff;
+ margin-bottom: 6.25rpx;
+}
+
+.cate-item .b .item {
+ float: left;
+ background: #fff;
+ width: 365rpx;
+ margin-bottom: 6.25rpx;
+ padding-bottom: 33.333rpx;
+ height: auto;
+ overflow: hidden;
+ text-align: center;
+}
+
+.cate-item .b .item-b {
+ margin-left: 6.25rpx;
+}
+
+.cate-item .item .img {
+ width: 302rpx;
+ height: 302rpx;
+}
+
+.cate-item .item .name {
+ display: block;
+ width: 365.625rpx;
+ height: 35rpx;
+ margin: 11.5rpx 0 22rpx 0;
+ text-align: center;
+ overflow: hidden;
+ padding: 0 20rpx;
+ font-size: 30rpx;
+ color: #333;
+}
+
+.cate-item .item .price {
+ display: block;
+ width: 365.625rpx;
+ height: 30rpx;
+ text-align: center;
+ font-size: 30rpx;
+ color: #b4282d;
+}
+
+.search-result-empty {
+ width: 100%;
+ height: 100%;
+ padding-top: 300rpx;
+}
+
+.search-result-empty .icon {
+ margin: 0 auto;
+ display: block;
+ width: 240rpx;
+ height: 240rpx;
+}
+
+.search-result-empty .text {
+ display: block;
+ width: 100%;
+ height: 40rpx;
+ font-size: 28rpx;
+ text-align: center;
+ color: #999;
+}
diff --git a/wx-mini-program/pages/topic/topic.js b/wx-mini-program/pages/topic/topic.js
new file mode 100644
index 0000000..d479701
--- /dev/null
+++ b/wx-mini-program/pages/topic/topic.js
@@ -0,0 +1,86 @@
+var util = require('../../utils/util.js');
+var api = require('../../config/api.js');
+var app = getApp()
+Page({
+ data: {
+ topicList: [],
+ page: 1,
+ size: 10,
+ count: 0,
+ scrollTop: 0,
+ showPage: false
+ },
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ this.getTopic();
+ },
+ onReady: function() {
+ // 页面渲染完成
+ },
+ onShow: function() {
+ // 页面显示
+ },
+ onHide: function() {
+ // 页面隐藏
+ },
+ onUnload: function() {
+ // 页面关闭
+ },
+ nextPage: function(event) {
+ var that = this;
+ if (this.data.page > that.data.count / that.data.size) {
+ return true;
+ }
+
+
+ that.setData({
+ page: that.data.page + 1
+ });
+
+ this.getTopic();
+
+ },
+ getTopic: function() {
+
+ let that = this;
+ that.setData({
+ scrollTop: 0,
+ showPage: false,
+ topicList: []
+ });
+ // 页面渲染完成
+ wx.showToast({
+ title: '加载中...',
+ icon: 'loading',
+ duration: 2000
+ });
+
+ util.request(api.TopicList, {
+ page: that.data.page,
+ size: that.data.size
+ }).then(function(res) {
+ if (res.errno === 0) {
+
+ that.setData({
+ scrollTop: 0,
+ topicList: res.data.data,
+ showPage: true,
+ count: res.data.count
+ });
+ }
+ wx.hideToast();
+ });
+
+ },
+ prevPage: function(event) {
+ if (this.data.page <= 1) {
+ return false;
+ }
+
+ var that = this;
+ that.setData({
+ page: that.data.page - 1
+ });
+ this.getTopic();
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/topic/topic.json b/wx-mini-program/pages/topic/topic.json
new file mode 100644
index 0000000..4be2732
--- /dev/null
+++ b/wx-mini-program/pages/topic/topic.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "活动专场",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/topic/topic.wxml b/wx-mini-program/pages/topic/topic.wxml
new file mode 100644
index 0000000..b0eb6cd
--- /dev/null
+++ b/wx-mini-program/pages/topic/topic.wxml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ {{item.title}}
+ {{item.subtitle}}
+ {{item.price}}元起
+
+
+
+ 上一页
+ 下一页
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/topic/topic.wxss b/wx-mini-program/pages/topic/topic.wxss
new file mode 100644
index 0000000..00f4deb
--- /dev/null
+++ b/wx-mini-program/pages/topic/topic.wxss
@@ -0,0 +1,94 @@
+page ,.container{
+ width: 750rpx;
+ height: 100%;
+ overflow: hidden;
+ background: #f4f4f4;
+}
+.topic-list{
+ width: 750rpx;
+ height: 100%;
+ overflow: hidden;
+ background: #f4f4f4;
+}
+
+.topic-list .item{
+ width: 100%;
+ height: 625rpx;
+ overflow: hidden;
+ background: #fff;
+ margin-bottom: 20rpx;
+}
+
+.topic-list .img{
+ width: 100%;
+ height: 415rpx;
+}
+
+.topic-list .info{
+ width: 100%;
+ height: 210rpx;
+ overflow: hidden;
+}
+
+.topic-list .title{
+ display: block;
+ text-align: center;
+ width: 100%;
+ height: 33rpx;
+ line-height: 35rpx;
+ color: #333;
+ overflow: hidden;
+ font-size: 35rpx;
+ margin-top: 30rpx;
+}
+
+.topic-list .desc{
+ display: block;
+ text-align: center;
+ position: relative;
+ width: auto;
+ height: 24rpx;
+ line-height: 24rpx;
+ overflow: hidden;
+ color: #999;
+ font-size: 24rpx;
+ margin-top: 16rpx;
+ margin-bottom: 30rpx;
+}
+
+.topic-list .price{
+ display: block;
+ text-align: center;
+ width: 100%;
+ height: 27rpx;
+ line-height: 27rpx;
+ overflow: hidden;
+ color: #b4282d;
+ font-size: 27rpx;
+}
+
+
+.page{
+ width: 750rpx;
+ height: 108rpx;
+ background: #fff;
+ margin-bottom: 20rpx;
+}
+
+.page view{
+ height: 108rpx;
+ width: 50%;
+ float: left;
+ font-size: 29rpx;
+ color: #333;
+ text-align: center;
+ line-height: 108rpx;
+}
+
+.page .prev{
+ border-right: 1px solid #D9D9D9;
+}
+
+.page .disabled{
+ color: #ccc;
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/topicComment/topicComment.js b/wx-mini-program/pages/topicComment/topicComment.js
new file mode 100644
index 0000000..4602af4
--- /dev/null
+++ b/wx-mini-program/pages/topicComment/topicComment.js
@@ -0,0 +1,119 @@
+var app = getApp();
+var util = require('../../utils/util.js');
+
+var api = require('../../config/api.js');
+
+Page({
+ data: {
+ comments: [],
+ allCommentList: [],
+ picCommentList: [],
+ type: 0,
+ valueId: 0,
+ showType: 0,
+ allCount: 0,
+ hasPicCount: 0,
+ allPage: 1,
+ picPage: 1,
+ size: 20
+ },
+ getCommentCount: function() {
+ let that = this;
+ util.request(api.CommentCount, {
+ valueId: that.data.valueId,
+ type: that.data.type
+ }).then(function(res) {
+ if (res.errno === 0) {
+
+ that.setData({
+ allCount: res.data.allCount,
+ hasPicCount: res.data.hasPicCount
+ });
+ }
+ });
+ },
+ getCommentList: function() {
+ let that = this;
+ util.request(api.CommentList, {
+ valueId: that.data.valueId,
+ type: that.data.type,
+ size: that.data.size,
+ page: (that.data.showType == 0 ? that.data.allPage : that.data.picPage),
+ showType: that.data.showType
+ }).then(function(res) {
+ if (res.errno === 0) {
+
+ if (that.data.showType == 0) {
+ that.setData({
+ allCommentList: that.data.allCommentList.concat(res.data.data),
+ allPage: res.data.currentPage,
+ comments: that.data.allCommentList.concat(res.data.data)
+ });
+ } else {
+ that.setData({
+ picCommentList: that.data.picCommentList.concat(res.data.data),
+ picPage: res.data.currentPage,
+ comments: that.data.picCommentList.concat(res.data.data)
+ });
+ }
+ }
+ });
+ },
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ this.setData({
+ type: options.type,
+ valueId: options.valueId
+ });
+ this.getCommentCount();
+ this.getCommentList();
+ },
+ onReady: function() {
+ // 页面渲染完成
+
+ },
+ onShow: function() {
+ // 页面显示
+
+ },
+ onHide: function() {
+ // 页面隐藏
+
+ },
+ onUnload: function() {
+ // 页面关闭
+
+ },
+ switchTab: function() {
+ this.setData({
+ showType: this.data.showType == 1 ? 0 : 1
+ });
+
+ this.getCommentList();
+ },
+ onReachBottom: function() {
+ console.log('onPullDownRefresh');
+ if (this.data.showType == 0) {
+
+ if (this.data.allCount / this.data.size < this.data.allPage) {
+ return false;
+ }
+
+ this.setData({
+ 'allPage': this.data.allPage + 1
+ });
+ } else {
+ if (this.data.hasPicCount / this.data.size < this.data.picPage) {
+ return false;
+ }
+
+ this.setData({
+ 'picPage': this.data.picPage + 1
+ });
+ }
+
+
+
+ this.getCommentList();
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/topicComment/topicComment.json b/wx-mini-program/pages/topicComment/topicComment.json
new file mode 100644
index 0000000..e45de35
--- /dev/null
+++ b/wx-mini-program/pages/topicComment/topicComment.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "评论",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/topicComment/topicComment.wxml b/wx-mini-program/pages/topicComment/topicComment.wxml
new file mode 100644
index 0000000..dc395fa
--- /dev/null
+++ b/wx-mini-program/pages/topicComment/topicComment.wxml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+ {{item.userInfo.nickName}}
+
+ {{item.addTime}}
+
+ {{item.content}}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/topicComment/topicComment.wxss b/wx-mini-program/pages/topicComment/topicComment.wxss
new file mode 100644
index 0000000..94273c1
--- /dev/null
+++ b/wx-mini-program/pages/topicComment/topicComment.wxss
@@ -0,0 +1,107 @@
+.comments {
+ width: 100%;
+ height: auto;
+ padding-left: 30rpx;
+ background: #fff;
+ margin: 20rpx 0;
+}
+
+.comments .b {
+ height: auto;
+ width: 720rpx;
+}
+
+.comments .b.no-h {
+ margin-top: 0;
+}
+
+.comments .item {
+ height: auto;
+ width: 720rpx;
+ overflow: hidden;
+ border-bottom: 1px solid #d9d9d9;
+ padding-bottom: 25rpx;
+}
+
+.comments .info {
+ height: 127rpx;
+ width: 100%;
+ padding: 33rpx 0 27rpx 0;
+}
+
+.comments .user {
+ float: left;
+ width: auto;
+ height: 67rpx;
+ line-height: 67rpx;
+ font-size: 0;
+}
+
+.comments .user image {
+ float: left;
+ width: 67rpx;
+ height: 67rpx;
+ margin-right: 17rpx;
+ border-radius: 50%;
+}
+
+.comments .user text {
+ display: inline-block;
+ width: auto;
+ height: 66rpx;
+ overflow: hidden;
+ font-size: 29rpx;
+ line-height: 66rpx;
+}
+
+.comments .time {
+ display: block;
+ float: right;
+ width: auto;
+ height: 67rpx;
+ line-height: 67rpx;
+ color: #7f7f7f;
+ font-size: 25rpx;
+ margin-right: 30rpx;
+}
+
+.comments .comment {
+ width: 720rpx;
+ padding-right: 30rpx;
+ line-height: 45.8rpx;
+ font-size: 29rpx;
+ margin-bottom: 16rpx;
+}
+
+.comments .imgs {
+ width: 720rpx;
+ height: 150rpx;
+ margin-bottom: 25rpx;
+}
+
+.comments .imgs .img {
+ height: 150rpx;
+ width: 150rpx;
+ margin-right: 28rpx;
+}
+
+.comments .customer-service {
+ width: 690rpx;
+ height: auto;
+ overflow: hidden;
+ margin-top: 23rpx;
+ background: rgba(0, 0, 0, 0.03);
+ padding: 21rpx;
+}
+
+.comments .customer-service .u {
+ font-size: 24rpx;
+ color: #333;
+ line-height: 37.5rpx;
+}
+
+.comments .customer-service .c {
+ font-size: 24rpx;
+ color: #999;
+ line-height: 37.5rpx;
+}
diff --git a/wx-mini-program/pages/topicCommentPost/topicCommentPost.js b/wx-mini-program/pages/topicCommentPost/topicCommentPost.js
new file mode 100644
index 0000000..78ad3ae
--- /dev/null
+++ b/wx-mini-program/pages/topicCommentPost/topicCommentPost.js
@@ -0,0 +1,177 @@
+// 上传组件 基于https://github.com/Tencent/weui-wxss/tree/master/src/example/uploader
+var app = getApp();
+var util = require('../../utils/util.js');
+var api = require('../../config/api.js');
+Page({
+ data: {
+ valueId: 0,
+ topic: {},
+ content: '',
+ stars: [0, 1, 2, 3, 4],
+ star: 5,
+ starText: '十分满意',
+ hasPicture: false,
+ picUrls: [],
+ files: []
+ },
+ chooseImage: function(e) {
+ if (this.data.files.length >= 5) {
+ util.showErrorToast('只能上传五张图片')
+ return false;
+ }
+
+ var that = this;
+ wx.chooseImage({
+ count: 1,
+ sizeType: ['original', 'compressed'],
+ sourceType: ['album', 'camera'],
+ success: function(res) {
+ that.setData({
+ files: that.data.files.concat(res.tempFilePaths)
+ });
+ that.upload(res);
+ }
+ })
+ },
+ upload: function(res) {
+ var that = this;
+ const uploadTask = wx.uploadFile({
+ url: api.StorageUpload,
+ filePath: res.tempFilePaths[0],
+ name: 'file',
+ success: function(res) {
+ var _res = JSON.parse(res.data);
+ if (_res.errno === 0) {
+ var url = _res.data.url
+ that.data.picUrls.push(url)
+ that.setData({
+ hasPicture: true,
+ picUrls: that.data.picUrls
+ })
+ }
+ },
+ fail: function(e) {
+ wx.showModal({
+ title: '错误',
+ content: '上传失败',
+ showCancel: false
+ })
+ },
+ })
+
+ uploadTask.onProgressUpdate((res) => {
+ console.log('上传进度', res.progress)
+ console.log('已经上传的数据长度', res.totalBytesSent)
+ console.log('预期需要上传的数据总长度', res.totalBytesExpectedToSend)
+ })
+
+ },
+ previewImage: function(e) {
+ wx.previewImage({
+ current: e.currentTarget.id, // 当前显示图片的http链接
+ urls: this.data.files // 需要预览的图片http链接列表
+ })
+ },
+ selectRater: function(e) {
+ var star = e.currentTarget.dataset.star + 1;
+ var starText;
+ if (star == 1) {
+ starText = '很差';
+ } else if (star == 2) {
+ starText = '不太满意';
+ } else if (star == 3) {
+ starText = '满意';
+ } else if (star == 4) {
+ starText = '比较满意';
+ } else {
+ starText = '十分满意'
+ }
+ this.setData({
+ star: star,
+ starText: starText
+ })
+
+ },
+ onLoad: function(options) {
+ if (parseInt(options.type) !== 1) {
+ return;
+ }
+
+ var that = this;
+ that.setData({
+ valueId: options.valueId
+ });
+ this.getTopic();
+ },
+ getTopic: function() {
+ let that = this;
+ util.request(api.TopicDetail, {
+ id: that.data.valueId
+ }).then(function(res) {
+ if (res.errno === 0) {
+
+ that.setData({
+ topic: res.data.topic
+ });
+
+ }
+ });
+ },
+ onClose: function() {
+ wx.navigateBack();
+ },
+ onPost: function() {
+ let that = this;
+
+ if (!this.data.content) {
+ util.showErrorToast('请填写评论')
+ return false;
+ }
+
+ util.request(api.CommentPost, {
+ type: 1,
+ valueId: that.data.valueId,
+ content: that.data.content,
+ star: that.data.star,
+ hasPicture: that.data.hasPicture,
+ picUrls: that.data.picUrls
+ }, 'POST').then(function(res) {
+ if (res.errno === 0) {
+ wx.showToast({
+ title: '评论成功',
+ complete: function() {
+ wx.navigateBack();
+ }
+ })
+ }
+ });
+ },
+ bindInputValue(event) {
+
+ let value = event.detail.value;
+
+ //判断是否超过140个字符
+ if (value && value.length > 140) {
+ return false;
+ }
+
+ this.setData({
+ content: event.detail.value,
+ })
+ },
+ onReady: function() {
+
+ },
+ onShow: function() {
+ // 页面显示
+
+ },
+ onHide: function() {
+ // 页面隐藏
+
+ },
+ onUnload: function() {
+ // 页面关闭
+
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/topicCommentPost/topicCommentPost.json b/wx-mini-program/pages/topicCommentPost/topicCommentPost.json
new file mode 100644
index 0000000..e45de35
--- /dev/null
+++ b/wx-mini-program/pages/topicCommentPost/topicCommentPost.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "评论",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/topicCommentPost/topicCommentPost.wxml b/wx-mini-program/pages/topicCommentPost/topicCommentPost.wxml
new file mode 100644
index 0000000..7bd5649
--- /dev/null
+++ b/wx-mini-program/pages/topicCommentPost/topicCommentPost.wxml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+ {{topic.title}}
+
+ {{topic.subtitle}}
+
+
+
+ 评分
+
+
+
+
+ {{starText}}
+
+
+
+ {{140 - content.length}}
+
+
+
+
+ 图片上传
+ {{picUrls.length}}/{{files.length}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+ 发表
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/topicCommentPost/topicCommentPost.wxss b/wx-mini-program/pages/topicCommentPost/topicCommentPost.wxss
new file mode 100644
index 0000000..dae5457
--- /dev/null
+++ b/wx-mini-program/pages/topicCommentPost/topicCommentPost.wxss
@@ -0,0 +1,246 @@
+page, .container {
+ height: 100%;
+ background: #f4f4f4;
+}
+
+.post-comment {
+ width: 750rpx;
+ height: auto;
+ overflow: hidden;
+ padding: 30rpx;
+ background: #fff;
+}
+
+.post-comment .goods {
+ display: flex;
+ align-items: center;
+ height: 199rpx;
+ margin-left: 31.25rpx;
+}
+
+.post-comment .goods .img {
+ height: 145.83rpx;
+ width: 145.83rpx;
+ background: #f4f4f4;
+}
+
+.post-comment .goods .img image {
+ height: 145.83rpx;
+ width: 145.83rpx;
+}
+
+.post-comment .goods .info {
+ height: 145.83rpx;
+ flex: 1;
+ padding-left: 20rpx;
+}
+
+.post-comment .goods .name {
+ margin-top: 30rpx;
+ display: block;
+ height: 44rpx;
+ line-height: 44rpx;
+ color: #333;
+ font-size: 30rpx;
+}
+
+.post-comment .goods .number {
+ display: block;
+ height: 37rpx;
+ line-height: 37rpx;
+ color: #666;
+ font-size: 25rpx;
+}
+
+.post-comment .goods .status {
+ width: 105rpx;
+ color: #b4282d;
+ font-size: 25rpx;
+}
+
+.post-comment .rater {
+ display: flex;
+ flex-direction: row;
+ height: 55rpx;
+}
+
+.post-comment .rater .rater-title {
+ font-size: 29rpx;
+ padding-right: 10rpx;
+}
+
+.post-comment .rater image {
+ padding-left: 5rpx;
+ height: 50rpx;
+ width: 50rpx;
+}
+
+.post-comment .rater .rater-desc {
+ font-size: 29rpx;
+ padding-left: 10rpx;
+}
+
+.post-comment .input-box {
+ height: 337.5rpx;
+ width: 690rpx;
+ position: relative;
+ background: #fff;
+}
+
+.post-comment .input-box .content {
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: block;
+ background: #fff;
+ font-size: 29rpx;
+ border: 5px solid #f4f4f4;
+ height: 300rpx;
+ width: 650rpx;
+ padding: 20rpx;
+}
+
+.post-comment .input-box .count {
+ position: absolute;
+ bottom: 20rpx;
+ right: 20rpx;
+ display: block;
+ height: 30rpx;
+ width: 50rpx;
+ font-size: 29rpx;
+ color: #999;
+}
+
+.post-comment .btns {
+ height: 108rpx;
+}
+
+.post-comment .close {
+ float: left;
+ height: 108rpx;
+ line-height: 108rpx;
+ text-align: left;
+ color: #666;
+ padding: 0 30rpx;
+}
+
+.post-comment .post {
+ float: right;
+ height: 108rpx;
+ line-height: 108rpx;
+ text-align: right;
+ padding: 0 30rpx;
+}
+
+.weui-uploader {
+ margin-top: 50rpx;
+}
+
+.weui-uploader__hd {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: flex;
+ padding-bottom: 10px;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ align-items: center;
+}
+
+.weui-uploader__title {
+ -webkit-box-flex: 1;
+ -webkit-flex: 1;
+ flex: 1;
+}
+
+.weui-uploader__info {
+ color: #b2b2b2;
+}
+
+.weui-uploader__bd {
+ margin-bottom: -4px;
+ margin-right: -9px;
+ overflow: hidden;
+}
+
+.weui-uploader__file {
+ float: left;
+ margin-right: 9px;
+ margin-bottom: 9px;
+}
+
+.weui-uploader__img {
+ display: block;
+ width: 79px;
+ height: 79px;
+}
+
+.weui-uploader__file_status {
+ position: relative;
+}
+
+.weui-uploader__file_status:before {
+ content: " ";
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ background-color: rgba(0, 0, 0, 0.5);
+}
+
+.weui-uploader__file-content {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ -webkit-transform: translate(-50%, -50%);
+ transform: translate(-50%, -50%);
+ color: #fff;
+}
+
+.weui-uploader__input-box {
+ float: left;
+ position: relative;
+ margin-right: 9px;
+ margin-bottom: 9px;
+ width: 77px;
+ height: 77px;
+ border: 1px solid #d9d9d9;
+}
+
+.weui-uploader__input-box:after, .weui-uploader__input-box:before {
+ content: " ";
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ -webkit-transform: translate(-50%, -50%);
+ transform: translate(-50%, -50%);
+ background-color: #d9d9d9;
+}
+
+.weui-uploader__input-box:before {
+ width: 2px;
+ height: 39.5px;
+}
+
+.weui-uploader__input-box:after {
+ width: 39.5px;
+ height: 2px;
+}
+
+.weui-uploader__input-box:active {
+ border-color: #999;
+}
+
+.weui-uploader__input-box:active:after, .weui-uploader__input-box:active:before {
+ background-color: #999;
+}
+
+.weui-uploader__input {
+ position: absolute;
+ z-index: 1;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ opacity: 0;
+}
diff --git a/wx-mini-program/pages/topicDetail/topicDetail.js b/wx-mini-program/pages/topicDetail/topicDetail.js
new file mode 100644
index 0000000..41c4541
--- /dev/null
+++ b/wx-mini-program/pages/topicDetail/topicDetail.js
@@ -0,0 +1,88 @@
+var app = getApp();
+var WxParse = require('../../lib/wxParse/wxParse.js');
+var util = require('../../utils/util.js');
+var api = require('../../config/api.js');
+
+Page({
+ data: {
+ id: 0,
+ topic: {},
+ topicList: [],
+ commentCount: 0,
+ commentList: [],
+ topicGoods: []
+ },
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ var that = this;
+ that.setData({
+ id: options.id
+ });
+
+ util.request(api.TopicDetail, {
+ id: that.data.id
+ }).then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ topic: res.data.topic,
+ topicGoods: res.data.goods
+ });
+
+ WxParse.wxParse('topicDetail', 'html', res.data.topic.content, that);
+ }
+ });
+
+ util.request(api.TopicRelated, {
+ id: that.data.id
+ }).then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ topicList: res.data
+ });
+ }
+ });
+ },
+ getCommentList() {
+ let that = this;
+ util.request(api.CommentList, {
+ valueId: that.data.id,
+ type: 1,
+ showType: 0,
+ page: 1,
+ size: 5
+ }).then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ commentList: res.data.data,
+ commentCount: res.data.count
+ });
+ }
+ });
+ },
+ postComment() {
+ if (!app.globalData.hasLogin) {
+ wx.navigateTo({
+ url: "/pages/auth/login/login"
+ });
+ } else {
+ wx.navigateTo({
+ url: '/pages/topicCommentPost/topicCommentPost?valueId=' + this.data.id + '&type=1',
+ })
+ }
+ },
+ onReady: function() {
+
+ },
+ onShow: function() {
+ // 页面显示
+ this.getCommentList();
+ },
+ onHide: function() {
+ // 页面隐藏
+
+ },
+ onUnload: function() {
+ // 页面关闭
+
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/topicDetail/topicDetail.json b/wx-mini-program/pages/topicDetail/topicDetail.json
new file mode 100644
index 0000000..3783fae
--- /dev/null
+++ b/wx-mini-program/pages/topicDetail/topicDetail.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "活动专场详情",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/topicDetail/topicDetail.wxml b/wx-mini-program/pages/topicDetail/topicDetail.wxml
new file mode 100644
index 0000000..d01f494
--- /dev/null
+++ b/wx-mini-program/pages/topicDetail/topicDetail.wxml
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.name}}
+ {{item.brief}}
+
+ ¥{{item.retailPrice}}
+ ¥{{item.counterPrice}}
+
+
+
+
+
+
+
+
+
+
+
+ 精选留言
+
+
+
+
+
+
+
+
+ {{item.userInfo.nickName}}
+
+ {{item.addTime}}
+
+
+ {{item.content}}
+
+
+
+
+ 查看更多
+
+
+
+
+
+ 等你来留言
+
+
+
+
+
+ 活动推荐
+
+
+
+
+ {{item.title}}
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/topicDetail/topicDetail.wxss b/wx-mini-program/pages/topicDetail/topicDetail.wxss
new file mode 100644
index 0000000..59a9002
--- /dev/null
+++ b/wx-mini-program/pages/topicDetail/topicDetail.wxss
@@ -0,0 +1,270 @@
+.content {
+ width: 100%;
+ height: auto;
+ font-size: 0;
+}
+
+.content image {
+ display: inline-block;
+ width: 100%;
+}
+
+.comments {
+ width: 100%;
+ height: auto;
+ padding-left: 30rpx;
+ background: #fff;
+ margin-top: 20rpx;
+}
+
+.comments .h {
+ height: 93rpx;
+ line-height: 93rpx;
+ width: 720rpx;
+ padding-right: 30rpx;
+ border-bottom: 1px solid #d9d9d9;
+}
+
+.comments .h .t {
+ display: block;
+ float: left;
+ width: 50%;
+ font-size: 29rpx;
+ color: #333;
+}
+
+.comments .h .i {
+ display: block;
+ float: right;
+ margin-top: 30rpx;
+ width: 33rpx;
+ height: 33rpx;
+}
+
+.comments .b {
+ height: auto;
+ width: 720rpx;
+}
+
+.comments .item {
+ height: auto;
+ width: 720rpx;
+ overflow: hidden;
+ border-bottom: 1px solid #d9d9d9;
+}
+
+.comments .info {
+ height: 127rpx;
+ width: 100%;
+ padding: 33rpx 0 27rpx 0;
+}
+
+.comments .user {
+ float: left;
+ width: auto;
+ height: 67rpx;
+ line-height: 67rpx;
+ font-size: 0;
+}
+
+.comments .user .avatar {
+ display: block;
+ float: left;
+ width: 67rpx;
+ height: 67rpx;
+ margin-right: 17rpx;
+ border-radius: 50%;
+}
+
+.comments .user .nickname {
+ display: block;
+ width: auto;
+ float: left;
+ height: 66rpx;
+ overflow: hidden;
+ font-size: 29rpx;
+ line-height: 66rpx;
+}
+
+.comments .time {
+ display: block;
+ float: right;
+ width: auto;
+ height: 67rpx;
+ line-height: 67rpx;
+ color: #7f7f7f;
+ font-size: 25rpx;
+ margin-right: 30rpx;
+}
+
+.comments .comment {
+ width: 720rpx;
+ padding-right: 30rpx;
+ line-height: 45.8rpx;
+ margin-bottom: 30rpx;
+ font-size: 29rpx;
+ color: #333;
+}
+
+.comments .load {
+ width: 720rpx;
+ height: 108rpx;
+ line-height: 108rpx;
+ text-align: center;
+ font-size: 38.5rpx;
+}
+
+.no-comments {
+ height: 297rpx;
+}
+
+.no-comments .txt {
+ height: 43rpx;
+ line-height: 43rpx;
+ display: block;
+ width: 100%;
+ text-align: center;
+ font-size: 29rpx;
+ color: #7f7f7f;
+}
+
+.no-comments .icon {
+ margin: 48rpx auto 18rpx auto;
+ height: 130rpx;
+ display: block;
+ width: 115rpx;
+}
+
+.sv-goods {
+ width: 750rpx;
+ height: auto;
+ overflow: hidden;
+ background: #fff
+}
+
+.sv-goods .b .item {
+ border-bottom: 1px solid #f4f4f4;
+ margin: 0 10rpx;
+ margin-bottom: -2rpx;
+ height: 270rpx;
+ width: 690rpx;
+}
+
+.sv-goods .b .img {
+ margin-top: 10rpx;
+ margin-right: 15rpx;
+ float: left;
+ width: 230rpx;
+ height: 230rpx;
+}
+
+.sv-goods .b .right {
+ float: left;
+ height: 264rpx;
+ width: 436rpx;
+ display: flex;
+ flex-flow: row nowrap;
+}
+
+.sv-goods .b .text {
+ display: flex;
+ flex-wrap: nowrap;
+ flex-direction: column;
+ justify-content: center;
+ overflow: hidden;
+ height: 264rpx;
+ width: 436rpx;
+}
+
+.sv-goods .b .name {
+ width: 436rpx;
+ display: block;
+ line-height: 40rpx;
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 2;
+ overflow: hidden;
+}
+
+.sv-goods .b .desc {
+ margin-top: 18rpx;
+ width: 436rpx;
+ display: block;
+ line-height: 38rpx;
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 2;
+ overflow: hidden;
+}
+
+.sv-goods .b .price {
+ margin-top: 18rpx;
+ width: 436rpx;
+ display: block;
+ line-height: 30rpx;
+}
+
+.sv-goods .text .price {
+ height: 70rpx;
+ align-content: center;
+}
+
+.sv-goods .text .counterPrice {
+ padding-left: 5%;
+ text-decoration: line-through;
+}
+
+.sv-goods .text .retailPrice {
+ float: left;
+ padding-left: 0rpx;
+}
+
+.rec-box {
+ width: 690rpx;
+ height: auto;
+ margin: 0 30rpx;
+}
+
+.rec-box .h {
+ position: relative;
+ width: 690rpx;
+ height: 96rpx;
+ /*border-bottom: 1px solid #d0d0d0;*/
+ margin-bottom: 32rpx;
+}
+
+.rec-box .h .txt {
+ display: inline-block;
+ position: absolute;
+ background: #f4f4f4;
+ top: 59rpx;
+ left: 200rpx;
+ width: 290rpx;
+ height: 45rpx;
+ line-height: 45rpx;
+ font-size: 30rpx;
+ color: #999;
+ text-align: center;
+}
+
+.rec-box .b .item {
+ width: 690rpx;
+ height: 397rpx;
+ padding: 24rpx 24rpx 30rpx 24rpx;
+ background: #fff;
+ margin-bottom: 30rpx;
+}
+
+.rec-box .b .item .img {
+ height: 278rpx;
+ width: 642rpx;
+}
+
+.rec-box .b .item .title {
+ display: block;
+ margin-top: 30rpx;
+ height: 30rpx;
+ width: 642rpx;
+ font-size: 28rpx;
+}
+@import "../../lib/wxParse/wxParse.wxss";
diff --git a/wx-mini-program/pages/ucenter/address/address.js b/wx-mini-program/pages/ucenter/address/address.js
new file mode 100644
index 0000000..6c4ffb2
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/address/address.js
@@ -0,0 +1,91 @@
+var util = require('../../../utils/util.js');
+var api = require('../../../config/api.js');
+var app = getApp();
+
+Page({
+ data: {
+ addressList: [],
+ },
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ },
+ onReady: function() {
+ // 页面渲染完成
+ },
+ onShow: function() {
+ // 页面显示
+ this.getAddressList();
+ },
+ getAddressList() {
+ let that = this;
+ util.request(api.AddressList).then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ addressList: res.data
+ });
+ }
+ });
+ },
+ addressAddOrUpdate(event) {
+ console.log(event)
+
+ //返回之前,先取出上一页对象,并设置addressId
+ var pages = getCurrentPages();
+ var prevPage = pages[pages.length - 2];
+
+ if (prevPage.route == "pages/checkout/checkout") {
+ try {
+ wx.setStorageSync('addressId', event.currentTarget.dataset.addressId);
+ } catch (e) {
+
+ }
+
+ let addressId = event.currentTarget.dataset.addressId;
+ if (addressId && addressId != 0) {
+ wx.navigateBack();
+ } else {
+ wx.navigateTo({
+ url: '/pages/ucenter/addressAdd/addressAdd?id=' + addressId
+ })
+ }
+
+ } else {
+ wx.navigateTo({
+ url: '/pages/ucenter/addressAdd/addressAdd?id=' + event.currentTarget.dataset.addressId
+ })
+ }
+ },
+ deleteAddress(event) {
+ console.log(event.target)
+ let that = this;
+ wx.showModal({
+ title: '',
+ content: '确定要删除地址?',
+ success: function(res) {
+ if (res.confirm) {
+ let addressId = event.target.dataset.addressId;
+ util.request(api.AddressDelete, {
+ id: addressId
+ }, 'POST').then(function(res) {
+ if (res.errno === 0) {
+ that.getAddressList();
+ wx.removeStorage({
+ key: 'addressId',
+ success: function(res) {},
+ })
+ }
+ });
+ console.log('用户点击确定')
+ }
+ }
+ })
+ return false;
+
+ },
+ onHide: function() {
+ // 页面隐藏
+ },
+ onUnload: function() {
+ // 页面关闭
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/address/address.json b/wx-mini-program/pages/ucenter/address/address.json
new file mode 100644
index 0000000..85717d1
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/address/address.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "地址管理",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/address/address.wxml b/wx-mini-program/pages/ucenter/address/address.wxml
new file mode 100644
index 0000000..204a088
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/address/address.wxml
@@ -0,0 +1,22 @@
+
+
+
+
+ {{item.name}}
+ 默认
+
+
+ {{item.mobile}}
+ {{item.detailedAddress}}
+
+
+
+
+
+
+
+
+ 收货地址在哪里
+
+ 新建
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/address/address.wxss b/wx-mini-program/pages/ucenter/address/address.wxss
new file mode 100644
index 0000000..31c89c0
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/address/address.wxss
@@ -0,0 +1,112 @@
+page {
+ height: 100%;
+ width: 100%;
+ background: #f4f4f4;
+}
+
+.container {
+ height: 100%;
+ width: 100%;
+}
+
+.address-list {
+ padding-left: 31.25rpx;
+ background: #fff url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAKCAMAAADfAc3wAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAYUExURc2AgICg1v///+rw+ffq6tKMjI2p2ouo2QT3I5MAAAA9SURBVCjPpcs5EgAgCARB5ND//9jEYwlZJp1q0ZTNAS3L10OgcGlYlYZNuGoRly3guv2YsA8z9mLKHsxZ3e5sBBsNqhCTAAAAAElFTkSuQmCC') 0 0 repeat-x;
+ background-size: auto 10.5rpx;
+ margin-bottom: 10rpx;
+}
+
+.address-list .item {
+ height: 156.55rpx;
+ align-items: center;
+ display: flex;
+ border-bottom: 1rpx solid #dcd9d9;
+}
+
+.address-list .l {
+ width: 125rpx;
+ height: 80rpx;
+ overflow: hidden;
+}
+
+.address-list .name {
+ width: 125rpx;
+ height: 43rpx;
+ font-size: 29rpx;
+ color: #333;
+ margin-bottom: 5.2rpx;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+}
+
+.address-list .default {
+ width: 62.5rpx;
+ height: 33rpx;
+ line-height: 28rpx;
+ text-align: center;
+ font-size: 20rpx;
+ color: #b4282d;
+ border: 1rpx solid #b4282d;
+ visibility: visible;
+}
+
+.address-list .c {
+ flex: 1;
+ height: auto;
+ overflow: hidden;
+}
+
+.address-list .mobile {
+ height: 29rpx;
+ font-size: 29rpx;
+ line-height: 29rpx;
+ overflow: hidden;
+ color: #333;
+ margin-bottom: 6.25rpx;
+}
+
+.address-list .address {
+ height: 37rpx;
+ font-size: 25rpx;
+ line-height: 37rpx;
+ overflow: hidden;
+ color: #666;
+}
+
+.address-list .r {
+ width: 52rpx;
+ height: auto;
+ overflow: hidden;
+ margin-right: 16.5rpx;
+}
+
+.address-list .del {
+ display: block;
+ width: 52rpx;
+ height: 52rpx;
+}
+
+.add-address{background-color:#85c43f;font-size:32rpx;color:#fff;width:690rpx;height:90rpx;border-radius:50rpx;text-align:center;line-height:90rpx;margin:76rpx auto 0 auto;}
+
+.empty-view {
+ height: 60%;
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+
+.empty-view .icon {
+ height: 248rpx;
+ width: 258rpx;
+ margin-bottom: 10rpx;
+}
+
+.empty-view .text {
+ width: auto;
+ font-size: 28rpx;
+ line-height: 35rpx;
+ color: #999;
+}
diff --git a/wx-mini-program/pages/ucenter/addressAdd/addressAdd.js b/wx-mini-program/pages/ucenter/addressAdd/addressAdd.js
new file mode 100644
index 0000000..fbbb29b
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/addressAdd/addressAdd.js
@@ -0,0 +1,372 @@
+var util = require('../../../utils/util.js');
+var api = require('../../../config/api.js');
+var check = require('../../../utils/check.js');
+
+var app = getApp();
+Page({
+ data: {
+ address: {
+ id: 0,
+ provinceId: 0,
+ cityId: 0,
+ areaId: 0,
+ address: '',
+ name: '',
+ mobile: '',
+ isDefault: 0,
+ provinceName: '',
+ cityName: '',
+ areaName: ''
+ },
+ addressId: 0,
+ openSelectRegion: false,
+ selectRegionList: [{
+ id: 0,
+ name: '省份',
+ pid: 1,
+ type: 1
+ },
+ {
+ id: 0,
+ name: '城市',
+ pid: 1,
+ type: 2
+ },
+ {
+ id: 0,
+ name: '区县',
+ pid: 1,
+ type: 3
+ }
+ ],
+ regionType: 1,
+ regionList: [],
+ selectRegionDone: false
+ },
+ bindinputMobile(event) {
+ let address = this.data.address;
+ address.mobile = event.detail.value;
+ this.setData({
+ address: address
+ });
+ },
+ bindinputName(event) {
+ let address = this.data.address;
+ address.name = event.detail.value;
+ this.setData({
+ address: address
+ });
+ },
+ bindinputAddress(event) {
+ let address = this.data.address;
+ address.address = event.detail.value;
+ this.setData({
+ address: address
+ });
+ },
+ bindIsDefault() {
+ let address = this.data.address;
+ address.isDefault = !address.isDefault;
+ this.setData({
+ address: address
+ });
+ },
+ getAddressDetail() {
+ let that = this;
+ util.request(api.AddressDetail, {
+ id: that.data.addressId
+ }).then(function(res) {
+ if (res.errno === 0) {
+ if (res.data) {
+ that.setData({
+ address: res.data
+ });
+ }
+ }
+ });
+ },
+ setRegionDoneStatus() {
+ let that = this;
+ let doneStatus = that.data.selectRegionList.every(item => {
+ return item.id != 0;
+ });
+
+ that.setData({
+ selectRegionDone: doneStatus
+ })
+
+ },
+ chooseRegion() {
+ let that = this;
+ this.setData({
+ openSelectRegion: !this.data.openSelectRegion
+ });
+
+ //设置区域选择数据
+ let address = this.data.address;
+ if (address.provinceId > 0 && address.cityId > 0 && address.areaId > 0) {
+ let selectRegionList = this.data.selectRegionList;
+ selectRegionList[0].id = address.provinceId;
+ selectRegionList[0].name = address.provinceName;
+ selectRegionList[0].pid = 0;
+
+ selectRegionList[1].id = address.cityId;
+ selectRegionList[1].name = address.cityName;
+ selectRegionList[1].pid = address.provinceId;
+
+ selectRegionList[2].id = address.areaId;
+ selectRegionList[2].name = address.areaName;
+ selectRegionList[2].pid = address.cityId;
+
+ this.setData({
+ selectRegionList: selectRegionList,
+ regionType: 3
+ });
+
+ this.getRegionList(address.cityId);
+ } else {
+ this.setData({
+ selectRegionList: [{
+ id: 0,
+ name: '省份',
+ pid: 0,
+ type: 1
+ },
+ {
+ id: 0,
+ name: '城市',
+ pid: 0,
+ type: 2
+ },
+ {
+ id: 0,
+ name: '区县',
+ pid: 0,
+ type: 3
+ }
+ ],
+ regionType: 1
+ })
+ this.getRegionList(0);
+ }
+
+ this.setRegionDoneStatus();
+
+ },
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ console.log(options)
+ if (options.id && options.id != 0) {
+ this.setData({
+ addressId: options.id
+ });
+ this.getAddressDetail();
+ }
+ },
+ onReady: function() {
+
+ },
+ selectRegionType(event) {
+ let that = this;
+ let regionTypeIndex = event.target.dataset.regionTypeIndex;
+ let selectRegionList = that.data.selectRegionList;
+
+ //判断是否可点击
+ if (regionTypeIndex + 1 == this.data.regionType || (regionTypeIndex - 1 >= 0 && selectRegionList[regionTypeIndex - 1].id <= 0)) {
+ return false;
+ }
+
+ this.setData({
+ regionType: regionTypeIndex + 1
+ })
+
+ let selectRegionItem = selectRegionList[regionTypeIndex];
+
+ this.getRegionList(selectRegionItem.pid);
+
+ this.setRegionDoneStatus();
+
+ },
+ selectRegion(event) {
+ let that = this;
+ let regionIndex = event.target.dataset.regionIndex;
+ let regionItem = this.data.regionList[regionIndex];
+ let regionType = regionItem.type;
+ let selectRegionList = this.data.selectRegionList;
+ selectRegionList[regionType - 1] = regionItem;
+
+
+ if (regionType != 3) {
+ this.setData({
+ selectRegionList: selectRegionList,
+ regionType: regionType + 1
+ })
+ this.getRegionList(regionItem.id);
+ } else {
+ this.setData({
+ selectRegionList: selectRegionList
+ })
+ }
+
+ //重置下级区域为空
+ selectRegionList.map((item, index) => {
+ if (index > regionType - 1) {
+ item.id = 0;
+ item.name = index == 1 ? '城市' : '区县';
+ item.pid = 0;
+ }
+ return item;
+ });
+
+ this.setData({
+ selectRegionList: selectRegionList
+ })
+
+
+ that.setData({
+ regionList: that.data.regionList.map(item => {
+
+ //标记已选择的
+ if (that.data.regionType == item.type && that.data.selectRegionList[that.data.regionType - 1].id == item.id) {
+ item.selected = true;
+ } else {
+ item.selected = false;
+ }
+
+ return item;
+ })
+ });
+
+ this.setRegionDoneStatus();
+
+ },
+ doneSelectRegion() {
+ if (this.data.selectRegionDone === false) {
+ return false;
+ }
+
+ let address = this.data.address;
+ let selectRegionList = this.data.selectRegionList;
+ address.provinceId = selectRegionList[0].id;
+ address.cityId = selectRegionList[1].id;
+ address.areaId = selectRegionList[2].id;
+ address.provinceName = selectRegionList[0].name;
+ address.cityName = selectRegionList[1].name;
+ address.areaName = selectRegionList[2].name;
+
+ this.setData({
+ address: address,
+ openSelectRegion: false
+ });
+
+ },
+ cancelSelectRegion() {
+ this.setData({
+ openSelectRegion: false,
+ regionType: this.data.regionDoneStatus ? 3 : 1
+ });
+
+ },
+ getRegionList(regionId) {
+ let that = this;
+ let regionType = that.data.regionType;
+ util.request(api.RegionList, {
+ pid: regionId
+ }).then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ regionList: res.data.map(item => {
+
+ //标记已选择的
+ if (regionType == item.type && that.data.selectRegionList[regionType - 1].id == item.id) {
+ item.selected = true;
+ } else {
+ item.selected = false;
+ }
+
+ return item;
+ })
+ });
+ }
+ });
+ },
+ cancelAddress() {
+ wx.navigateBack();
+ },
+ saveAddress() {
+ console.log(this.data.address)
+ let address = this.data.address;
+
+ if (address.name == '') {
+ util.showErrorToast('请输入姓名');
+
+ return false;
+ }
+
+ if (address.mobile == '') {
+ util.showErrorToast('请输入手机号码');
+ return false;
+ }
+
+
+ if (address.areaId == 0) {
+ util.showErrorToast('请输入省市区');
+ return false;
+ }
+
+ if (address.address == '') {
+ util.showErrorToast('请输入详细地址');
+ return false;
+ }
+
+ if (!check.isValidPhone(address.mobile)) {
+ util.showErrorToast('手机号不正确');
+ return false;
+ }
+
+ let that = this;
+ util.request(api.AddressSave, {
+ id: address.id,
+ name: address.name,
+ mobile: address.mobile,
+ provinceId: address.provinceId,
+ cityId: address.cityId,
+ areaId: address.areaId,
+ address: address.address,
+ isDefault: address.isDefault
+ }, 'POST').then(function(res) {
+ if (res.errno === 0) {
+ //返回之前,先取出上一页对象,并设置addressId
+ var pages = getCurrentPages();
+ var prevPage = pages[pages.length - 2];
+ console.log(prevPage);
+ if (prevPage.route == "pages/checkout/checkout") {
+ prevPage.setData({
+ addressId: res.data
+ })
+
+ try {
+ wx.setStorageSync('addressId', res.data);
+ } catch (e) {
+
+ }
+ console.log("set address");
+ }
+ wx.navigateBack();
+ }
+ });
+
+ },
+ onShow: function() {
+ // 页面显示
+
+ },
+ onHide: function() {
+ // 页面隐藏
+
+ },
+ onUnload: function() {
+ // 页面关闭
+
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/addressAdd/addressAdd.json b/wx-mini-program/pages/ucenter/addressAdd/addressAdd.json
new file mode 100644
index 0000000..cd0d27b
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/addressAdd/addressAdd.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "编辑地址",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/addressAdd/addressAdd.wxml b/wx-mini-program/pages/ucenter/addressAdd/addressAdd.wxml
new file mode 100644
index 0000000..faa714e
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/addressAdd/addressAdd.wxml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 设为默认地址
+
+
+
+
+
+
+
+
+
+
+
+ {{item.name}}
+
+ 确定
+
+
+
+ {{item.name}}
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/addressAdd/addressAdd.wxss b/wx-mini-program/pages/ucenter/addressAdd/addressAdd.wxss
new file mode 100644
index 0000000..b2ec1a3
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/addressAdd/addressAdd.wxss
@@ -0,0 +1,174 @@
+page {
+ height: 100%;
+ background: #f4f4f4;
+}
+
+.add-address .add-form {
+ background: #fff;
+ width: 100%;
+ height: auto;
+ overflow: hidden;
+}
+
+.add-address .form-item {
+ height: 116rpx;
+ padding-left: 31.25rpx;
+ border-bottom: 1px solid #d9d9d9;
+ display: flex;
+ align-items: center;
+ padding-right: 31.25rpx;
+}
+
+.add-address .input {
+ flex: 1;
+ height: 44rpx;
+ line-height: 44rpx;
+ overflow: hidden;
+}
+
+.add-address .form-default {
+ border-bottom: 1px solid #d9d9d9;
+ height: 96rpx;
+ background: #fafafa;
+ padding-top: 28rpx;
+ font-size: 28rpx;
+}
+
+.default-input {
+ margin: 0 auto;
+ display: block;
+ width: 240rpx;
+ height: 40rpx;
+ padding-left: 50rpx;
+ line-height: 40rpx;
+ background: url(http://yanxuan.nosdn.127.net/hxm/yanxuan-wap/p/20161201/style/img/sprites/checkbox-sed825af9d3-a6b8540d42.png) 1rpx -448rpx no-repeat;
+ background-size: 38rpx 486rpx;
+ font-size: 28rpx;
+}
+
+.default-input.selected {
+ background: url(http://yanxuan.nosdn.127.net/hxm/yanxuan-wap/p/20161201/style/img/sprites/checkbox-sed825af9d3-a6b8540d42.png) 0 -192rpx no-repeat;
+ background-size: 38rpx 486rpx;
+}
+
+.add-address .btns {
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ overflow: hidden;
+ display: flex;
+ height: 100rpx;
+ width: 100%;
+}
+
+.add-address .cannel, .add-address .save {
+ flex: 1;
+ height: 100rpx;
+ text-align: center;
+ line-height: 100rpx;
+ font-size: 28rpx;
+ color: #fff;
+ border: none;
+ border-radius: 0;
+}
+
+.add-address .cannel {
+ background: #333;
+}
+
+.add-address .save {
+ background: #b4282d;
+}
+
+.region-select {
+ width: 100%;
+ height: 600rpx;
+ background: #fff;
+ position: fixed;
+ z-index: 10;
+ left: 0;
+ bottom: 0;
+}
+
+.region-select .hd {
+ height: 108rpx;
+ width: 100%;
+ border-bottom: 1px solid #f4f4f4;
+ padding: 46rpx 30rpx 0 30rpx;
+}
+
+.region-select .region-selected {
+ float: left;
+ height: 60rpx;
+ display: flex;
+}
+
+.region-select .region-selected .item {
+ max-width: 140rpx;
+ margin-right: 30rpx;
+ text-align: left;
+ line-height: 60rpx;
+ height: 100%;
+ color: #333;
+ font-size: 28rpx;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.region-select .region-selected .item.disabled {
+ color: #999;
+}
+
+.region-select .region-selected .item.selected {
+ color: #b4282d;
+}
+
+.region-select .done {
+ float: right;
+ height: 60rpx;
+ width: 60rpx;
+ border: none;
+ background: #fff;
+ line-height: 60rpx;
+ text-align: center;
+ color: #333;
+ font-size: 28rpx;
+}
+
+.region-select .done.disabled {
+ color: #999;
+}
+
+.region-select .bd {
+ height: 492rpx;
+ width: 100%;
+ padding: 0 30rpx;
+}
+
+.region-select .region-list {
+ height: 492rpx;
+}
+
+.region-select .region-list .item {
+ width: 100%;
+ height: 104rpx;
+ line-height: 104rpx;
+ text-align: left;
+ color: #333;
+ font-size: 28rpx;
+}
+
+.region-select .region-list .item.selected {
+ color: #b4282d;
+}
+
+.bg-mask {
+ height: 100%;
+ width: 100%;
+ background: rgba(0, 0, 0, 0.4);
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 8;
+}
diff --git a/wx-mini-program/pages/ucenter/collect/collect.js b/wx-mini-program/pages/ucenter/collect/collect.js
new file mode 100644
index 0000000..c8d175c
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/collect/collect.js
@@ -0,0 +1,122 @@
+var util = require('../../../utils/util.js');
+var api = require('../../../config/api.js');
+
+var app = getApp();
+
+Page({
+ data: {
+ type: 0,
+ collectList: [],
+ page: 1,
+ size: 10,
+ totalPages: 1
+ },
+ getCollectList() {
+ wx.showLoading({
+ title: '加载中...',
+ });
+ let that = this;
+ util.request(api.CollectList, {
+ type: that.data.type,
+ page: that.data.page,
+ size: that.data.size
+ }).then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ collectList: that.data.collectList.concat(res.data.collectList),
+ totalPages: res.data.totalPages
+ });
+ }
+ wx.hideLoading();
+ });
+ },
+ onLoad: function(options) {
+ this.getCollectList();
+ },
+ onReachBottom() {
+ if (this.data.totalPages > this.data.page) {
+ this.setData({
+ page: this.data.page + 1
+ });
+ this.getCollectList();
+ } else {
+ wx.showToast({
+ title: '没有更多用户收藏了',
+ icon: 'none',
+ duration: 2000
+ });
+ return false;
+ }
+ },
+ onReady: function() {
+
+ },
+ onShow: function() {
+
+ },
+ onHide: function() {
+ // 页面隐藏
+
+ },
+ onUnload: function() {
+ // 页面关闭
+ },
+ openGoods(event) {
+
+ let that = this;
+ let index = event.currentTarget.dataset.index;
+ let goodsId = this.data.collectList[index].valueId;
+
+ //触摸时间距离页面打开的毫秒数
+ var touchTime = that.data.touchEnd - that.data.touchStart;
+ console.log(touchTime);
+ //如果按下时间大于350为长按
+ if (touchTime > 350) {
+ wx.showModal({
+ title: '',
+ content: '确定删除吗?',
+ success: function(res) {
+ if (res.confirm) {
+
+ util.request(api.CollectAddOrDelete, {
+ type: that.data.type,
+ valueId: goodsId
+ }, 'POST').then(function(res) {
+ if (res.errno === 0) {
+ console.log(res.data);
+ wx.showToast({
+ title: '删除成功',
+ icon: 'success',
+ duration: 2000
+ });
+ that.data.collectList.splice(index, 1)
+ that.setData({
+ collectList: that.data.collectList
+ });
+ }
+ });
+ }
+ }
+ })
+ } else {
+
+ wx.navigateTo({
+ url: '/pages/goods/goods?id=' + goodsId,
+ });
+ }
+ },
+ //按下事件开始
+ touchStart: function(e) {
+ let that = this;
+ that.setData({
+ touchStart: e.timeStamp
+ })
+ },
+ //按下事件结束
+ touchEnd: function(e) {
+ let that = this;
+ that.setData({
+ touchEnd: e.timeStamp
+ })
+ },
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/collect/collect.json b/wx-mini-program/pages/ucenter/collect/collect.json
new file mode 100644
index 0000000..f004c25
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/collect/collect.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "我的收藏",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/collect/collect.wxml b/wx-mini-program/pages/ucenter/collect/collect.wxml
new file mode 100644
index 0000000..28d45da
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/collect/collect.wxml
@@ -0,0 +1,19 @@
+
+
+
+
+ 还没有收藏
+
+
+
+
+
+
+ {{item.name}}
+ {{item.brief}}
+ ¥{{item.retailPrice}}
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/collect/collect.wxss b/wx-mini-program/pages/ucenter/collect/collect.wxss
new file mode 100644
index 0000000..ec28454
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/collect/collect.wxss
@@ -0,0 +1,102 @@
+page {
+ background: #f4f4f4;
+ min-height: 100%;
+}
+
+.container {
+ background: #f4f4f4;
+ min-height: 100%;
+ width: 100%;
+ height: auto;
+ overflow: hidden;
+}
+
+.no-collect {
+ width: 100%;
+ height: auto;
+ margin: 0 auto;
+}
+
+.no-collect .c {
+ width: 100%;
+ height: auto;
+ margin-top: 200rpx;
+}
+
+.no-collect .c image {
+ margin: 0 auto;
+ display: block;
+ text-align: center;
+ width: 258rpx;
+ height: 258rpx;
+}
+
+.no-collect .c text {
+ margin: 0 auto;
+ display: block;
+ width: 258rpx;
+ height: 29rpx;
+ line-height: 29rpx;
+ text-align: center;
+ font-size: 29rpx;
+ color: #999;
+}
+
+.collect-list {
+ width: 100%;
+ height: auto;
+ overflow: hidden;
+ background: #fff;
+ padding-left: 30rpx;
+ border-top: 1px solid #e1e1e1;
+}
+
+.item {
+ height: 242rpx;
+ width: 720rpx;
+ background: #fff;
+ padding: 30rpx 30rpx 30rpx 0;
+ border-bottom: 1px solid #e1e1e1;
+}
+
+.item:last-child {
+ border-bottom: 1px solid #fff;
+}
+
+.item .img {
+ float: left;
+ width: 170rpx;
+ height: 170rpx;
+}
+
+.item .info {
+ float: right;
+ width: 520rpx;
+ height: 200rpx;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ padding-left: 20rpx;
+}
+
+.item .info .name {
+ line-height: 50rpx;
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 1;
+ overflow: hidden;
+}
+
+.item .info .subtitle {
+ margin-top: 8rpx;
+ line-height: 50rpx;
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 2;
+ overflow: hidden;
+}
+
+.item .info .price {
+ margin-top: 8rpx;
+ line-height: 50rpx;
+}
diff --git a/wx-mini-program/pages/ucenter/couponList/couponList.js b/wx-mini-program/pages/ucenter/couponList/couponList.js
new file mode 100644
index 0000000..7ad320d
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/couponList/couponList.js
@@ -0,0 +1,170 @@
+var util = require('../../../utils/util.js');
+var api = require('../../../config/api.js');
+
+var app = getApp();
+
+Page({
+ data: {
+ couponList: [],
+ code: '',
+ status: 0,
+ page: 1,
+ size: 10,
+ count: 0,
+ scrollTop: 0,
+ showPage: false
+ },
+
+
+ /**
+ * 生命周期函数--监听页面加载
+ */
+ onLoad: function(options) {
+ this.getCouponList();
+ },
+
+ /**
+ * 生命周期函数--监听页面初次渲染完成
+ */
+ onReady: function() {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面显示
+ */
+ onShow: function() {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面隐藏
+ */
+ onHide: function() {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面卸载
+ */
+ onUnload: function() {
+
+ },
+
+ /**
+ * 页面相关事件处理函数--监听用户下拉动作
+ */
+ onPullDownRefresh: function() {
+
+ },
+
+ /**
+ * 页面上拉触底事件的处理函数
+ */
+ onReachBottom: function() {
+
+ },
+
+ /**
+ * 用户点击右上角分享
+ */
+ onShareAppMessage: function() {
+
+ },
+ getCouponList: function() {
+
+ let that = this;
+ that.setData({
+ scrollTop: 0,
+ showPage: false,
+ couponList: []
+ });
+ util.request(api.CouponMyList, {
+ status: that.data.status,
+ page: that.data.page,
+ size: that.data.size
+ }).then(function(res) {
+ if (res.errno === 0) {
+
+ that.setData({
+ scrollTop: 0,
+ couponList: res.data.data,
+ showPage: true,
+ count: res.data.count
+ });
+ }
+ });
+
+ },
+ bindExchange: function (e) {
+ this.setData({
+ code: e.detail.value
+ });
+ },
+ clearExchange: function () {
+ this.setData({
+ code: ''
+ });
+ },
+ goExchange: function() {
+ if (this.data.code.length === 0) {
+ util.showErrorToast("请输入兑换码");
+ return;
+ }
+
+ let that = this;
+ util.request(api.CouponExchange, {
+ code: that.data.code
+ }, 'POST').then(function (res) {
+ if (res.errno === 0) {
+ that.getCouponList();
+ that.clearExchange();
+ wx.showToast({
+ title: "领取成功",
+ duration: 2000
+ })
+ }
+ else{
+ util.showErrorToast(res.errmsg);
+ }
+ });
+ },
+ nextPage: function(event) {
+ var that = this;
+ if (this.data.page > that.data.count / that.data.size) {
+ return true;
+ }
+
+ that.setData({
+ page: that.data.page + 1
+ });
+
+ this.getCouponList();
+
+ },
+ prevPage: function(event) {
+ if (this.data.page <= 1) {
+ return false;
+ }
+
+ var that = this;
+ that.setData({
+ page: that.data.page - 1
+ });
+ this.getCouponList();
+ },
+ switchTab: function(e) {
+
+ this.setData({
+ couponList: [],
+ status: e.currentTarget.dataset.index,
+ page: 1,
+ size: 10,
+ count: 0,
+ scrollTop: 0,
+ showPage: false
+ });
+
+ this.getCouponList();
+ },
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/couponList/couponList.json b/wx-mini-program/pages/ucenter/couponList/couponList.json
new file mode 100644
index 0000000..450edd3
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/couponList/couponList.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "我的优惠券",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/couponList/couponList.wxml b/wx-mini-program/pages/ucenter/couponList/couponList.wxml
new file mode 100644
index 0000000..bd4e3e3
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/couponList/couponList.wxml
@@ -0,0 +1,39 @@
+
+
+
+
+ 未使用
+
+
+ 已使用
+
+
+ 已过期
+
+
+
+
+
+
+ {{item.tag}}
+
+
+ {{item.discount}}元
+ 满{{item.min}}元使用
+
+
+ {{item.name}}
+ {{item.desc}}
+ 有效期:{{item.days}}天
+ 有效期:{{item.startTime}} - {{item.endTime}}
+
+
+
+
+
+
+ 上一页
+ 下一页
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/couponList/couponList.wxss b/wx-mini-program/pages/ucenter/couponList/couponList.wxss
new file mode 100644
index 0000000..def2e2b
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/couponList/couponList.wxss
@@ -0,0 +1,204 @@
+page {
+ background: #f4f4f4;
+ min-height: 100%;
+}
+
+.container {
+ background: #f4f4f4;
+ min-height: 100%;
+ padding-top: 30rpx;
+}
+
+.container .h {
+ position: fixed;
+ left: 0;
+ top: 0;
+ z-index: 1000;
+ width: 100%;
+ display: flex;
+ background: #fff;
+ height: 84rpx;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.15);
+}
+
+.container .h .item {
+ display: inline-block;
+ height: 82rpx;
+ width: 50%;
+ padding: 0 15rpx;
+ text-align: center;
+}
+
+.container .h .item .txt {
+ display: inline-block;
+ height: 82rpx;
+ padding: 0 20rpx;
+ line-height: 82rpx;
+ color: #333;
+ font-size: 30rpx;
+ width: 170rpx;
+}
+
+.container .h .item.active .txt {
+ color: #ab2b2b;
+ border-bottom: 4rpx solid #ab2b2b;
+}
+
+.coupon-list {
+ width: 710rpx;
+ height: auto;
+ margin-top: 68rpx;
+ overflow: hidden;
+}
+
+.coupon-list .item {
+ position: relative;
+ height: 200rpx;
+ width: 680rpx;
+ background: linear-gradient(to right, #d8050f, #e68d08);
+ margin: 18rpx;
+ overflow:hidden;
+ border-radius: 10rpx;
+}
+
+.coupon-list .item:before, .item:after {
+ content: '.';
+ width: 0;
+ height: 200%;
+ position: absolute;
+ top: 20rpx;
+}
+
+.coupon-list .item:before {
+ border-right: 20rpx dotted #eeeeee;
+ left: -10rpx;
+ width: 1rpx;
+}
+
+.coupon-list .item:after {
+ border-left: 20rpx dotted #eeeeee;
+ right: -10rpx;
+}
+
+
+.coupon-list .tag {
+ margin-left: 40rpx;
+ height: 32rpx;
+ background: #b8bb12;
+ padding-left: 16rpx;
+ padding-right: 16rpx;
+ position: absolute;
+ left: 20rpx;
+ color: #fff;
+ top: 20rpx;
+ font-size: 20rpx;
+ text-align: center;
+ line-height: 32rpx;
+}
+
+.coupon-list .content {
+ margin-left: 30rpx;
+ display: flex;
+ margin-right: 40rpx;
+ flex-direction: row;
+}
+
+.coupon-list .content .left {
+ padding-top: 50rpx;
+ flex: 1;
+ border-right: 2rpx dashed rgba(230,230,230,.5);
+}
+
+.coupon-list .discount {
+ font-size: 50rpx;
+ color: #e9f814;
+}
+
+.coupon-list .min {
+ color: #fff;
+}
+
+.coupon-list .content .right {
+ padding: 11px 8px;
+ width: 410rpx;
+}
+
+.coupon-list .name {
+ font-size: 44rpx;
+ color: #fff;
+ margin-bottom: 14rpx;
+}
+
+.coupon-list .desc {
+ font-size: 24rpx;
+ color: #fff;
+}
+
+.coupon-list .time {
+ font-size: 24rpx;
+ color: #fff;
+ line-height: 30rpx;
+}
+
+.coupon-list .couponbg{
+ position: absolute;
+ left: 20%;
+ top: 95rpx;
+ height: 290rpx;
+ width: 730rpx;
+ background-color: rgba(255,255,255,.15);
+ transform: rotate(-20deg);
+}
+
+.condition {
+ position: absolute;
+ width: 100%;
+ bottom: 0;
+ left: 0;
+ height: 78rpx;
+ background: rgba(0, 0, 0, 0.08);
+ padding: 24rpx 40rpx;
+ display: flex;
+ flex-direction: row;
+}
+
+ .condition .txt {
+ display: block;
+ height: 30rpx;
+ flex: 1;
+ overflow: hidden;
+ font-size: 24rpx;
+ line-height: 30rpx;
+ color: #fff;
+}
+
+.condition .icon {
+ margin-left: 30rpx;
+ width: 24rpx;
+ height: 24rpx;
+}
+
+.page {
+ width: 750rpx;
+ height: 108rpx;
+ background: #fff;
+ margin-bottom: 20rpx;
+}
+
+.page view {
+ height: 108rpx;
+ width: 50%;
+ float: left;
+ font-size: 29rpx;
+ color: #333;
+ text-align: center;
+ line-height: 108rpx;
+}
+
+.page .prev {
+ border-right: 1px solid #d9d9d9;
+}
+
+.page .disabled {
+ color: #ccc;
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/couponSelect/couponSelect.js b/wx-mini-program/pages/ucenter/couponSelect/couponSelect.js
new file mode 100644
index 0000000..b13ebb7
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/couponSelect/couponSelect.js
@@ -0,0 +1,147 @@
+var util = require('../../../utils/util.js');
+var api = require('../../../config/api.js');
+
+var app = getApp();
+
+Page({
+ data: {
+ couponList: [],
+ cartId: 0,
+ couponId: 0,
+ grouponLinkId: 0,
+ scrollTop: 0
+ },
+
+
+ /**
+ * 生命周期函数--监听页面加载
+ */
+ onLoad: function (options) {
+ },
+
+ /**
+ * 生命周期函数--监听页面初次渲染完成
+ */
+ onReady: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面显示
+ */
+ onShow: function () {
+ // 页面显示
+ wx.showLoading({
+ title: '加载中...',
+ });
+
+ try {
+ var cartId = wx.getStorageSync('cartId');
+ if (!cartId) {
+ cartId = 0;
+ }
+
+ var couponId = wx.getStorageSync('couponId');
+ if (!couponId) {
+ couponId = 0;
+ }
+
+ var grouponRulesId = wx.getStorageSync('grouponRulesId');
+ if (!grouponRulesId) {
+ grouponRulesId = 0;
+ }
+
+ this.setData({
+ cartId: cartId,
+ couponId: couponId,
+ grouponRulesId: grouponRulesId
+ });
+
+ } catch (e) {
+ // Do something when catch error
+ console.log(e);
+ }
+
+ this.getCouponList();
+ },
+
+ /**
+ * 生命周期函数--监听页面隐藏
+ */
+ onHide: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面卸载
+ */
+ onUnload: function () {
+
+ },
+
+ /**
+ * 页面相关事件处理函数--监听用户下拉动作
+ */
+ onPullDownRefresh: function () {
+
+ },
+
+ /**
+ * 页面上拉触底事件的处理函数
+ */
+ onReachBottom() {
+ },
+
+ /**
+ * 用户点击右上角分享
+ */
+ onShareAppMessage: function () {
+
+ },
+ getCouponList: function () {
+
+ let that = this;
+ that.setData({
+ couponList: []
+ });
+ // 页面渲染完成
+ wx.showToast({
+ title: '加载中...',
+ icon: 'loading',
+ duration: 2000
+ });
+
+ util.request(api.CouponSelectList, {
+ cartId: that.data.cartId,
+ grouponRulesId: that.data.grouponRulesId,
+ }).then(function (res) {
+ if (res.errno === 0) {
+ that.setData({
+ couponList: res.data
+ });
+ }
+ wx.hideToast();
+ });
+
+ },
+ selectCoupon: function (e) {
+ try {
+ wx.setStorageSync('couponId', e.currentTarget.dataset.id);
+ } catch (error) {
+
+ }
+
+ wx.navigateBack();
+ },
+ unselectCoupon: function() {
+ // 如果优惠券ID设置-1,则表示订单不使用优惠券
+ try {
+ wx.setStorageSync('couponId', -1);
+ } catch (error) {
+
+ }
+
+ wx.navigateBack();
+ }
+
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/couponSelect/couponSelect.json b/wx-mini-program/pages/ucenter/couponSelect/couponSelect.json
new file mode 100644
index 0000000..9ce599f
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/couponSelect/couponSelect.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "选择优惠券",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/couponSelect/couponSelect.wxml b/wx-mini-program/pages/ucenter/couponSelect/couponSelect.wxml
new file mode 100644
index 0000000..0e43978
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/couponSelect/couponSelect.wxml
@@ -0,0 +1,25 @@
+
+
+
+
+ 不选择优惠券
+
+
+ {{item.tag}}
+
+
+ {{item.discount}}元
+ 满{{item.min}}元使用
+
+
+ {{item.name}}
+ {{item.desc}}
+ 有效期:{{item.startTime}} - {{item.endTime}}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/couponSelect/couponSelect.wxss b/wx-mini-program/pages/ucenter/couponSelect/couponSelect.wxss
new file mode 100644
index 0000000..8b10c47
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/couponSelect/couponSelect.wxss
@@ -0,0 +1,128 @@
+
+.container {
+ background: #f4f4f4;
+ min-height: 100%;
+ padding-top: 10rpx;
+}
+
+.coupon-list {
+ width: 670rpx;
+ height: auto;
+ overflow: hidden;
+}
+
+.unselect {
+ background-color:#85c43f;
+ font-size:32rpx;
+ color:#fff;
+ width:650rpx;
+ height:90rpx;
+ border-radius:20rpx;
+ text-align:center;
+ line-height:90rpx;
+ margin:10rpx;
+ margin-bottom: 30rpx;
+}
+
+
+.item {
+ position: relative;
+ height: 250rpx;
+ width: 650rpx;
+ background: linear-gradient(to right, #d8050f, #e68d08);
+ margin-bottom: 10rpx;
+ margin-left: 10rpx;
+ margin-right: 10rpx;
+ overflow:hidden;
+ border-radius: 10rpx;
+}
+
+.item:before, .item:after {
+ content: '.';
+ width: 0;
+ height: 200%;
+ position: absolute;
+ top: 20rpx;
+}
+
+.item:before {
+ border-right: 20rpx dotted #eeeeee;
+ left: -10rpx;
+ width: 1rpx;
+}
+
+.item:after {
+ border-left: 20rpx dotted #eeeeee;
+ right: -10rpx;
+}
+
+
+.tag {
+ margin-left: 40rpx;
+ height: 32rpx;
+ background: #b8bb12;
+ padding-left: 16rpx;
+ padding-right: 16rpx;
+ position: absolute;
+ left: 20rpx;
+ color: #fff;
+ top: 20rpx;
+ font-size: 20rpx;
+ text-align: center;
+ line-height: 32rpx;
+}
+
+.content {
+ margin-left: 30rpx;
+ display: flex;
+ margin-right: 10rpx;
+ flex-direction: row;
+}
+
+.content .left {
+ padding-top: 50rpx;
+ flex: 1;
+ border-right: 2rpx dashed rgba(230,230,230,.5);
+}
+
+.discount {
+ font-size: 43rpx;
+ color: #e9f814;
+}
+
+.min {
+ font-size: 28rpx;
+ color: #fff;
+}
+
+.content .right {
+ padding: 11px;
+ width: 420rpx;
+}
+
+.name {
+ font-size: 40rpx;
+ color: #fff;
+ margin-bottom: 14rpx;
+}
+
+.desc {
+ font-size: 24rpx;
+ color: #fff;
+}
+
+.time {
+ font-size: 24rpx;
+ color: #fff;
+ line-height: 30rpx;
+}
+
+.couponbg{
+ position: absolute;
+ left: 20%;
+ top: 95rpx;
+ height: 290rpx;
+ width: 680rpx;
+ background-color: rgba(255,255,255,.15);
+ transform: rotate(-20deg);
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/expressInfo/expressInfo.js b/wx-mini-program/pages/ucenter/expressInfo/expressInfo.js
new file mode 100644
index 0000000..1043a2b
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/expressInfo/expressInfo.js
@@ -0,0 +1,98 @@
+var util = require('../../../utils/util.js');
+var api = require('../../../config/api.js');
+var user = require('../../../utils/user.js');
+var app = getApp();
+
+Page({
+ data: {
+ orderId: 0,
+ userInfo: {
+ nickName: '点击登录',
+ avatarUrl: 'http://yanxuan.nosdn.127.net/8945ae63d940cc42406c3f67019c5cb6.png'
+ },
+ traces: []
+ },
+
+ /**
+ * 生命周期函数--监听页面加载
+ */
+ onLoad: function (options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ this.setData({
+ orderId: options.orderId
+ });
+ },
+
+ /**
+ * 生命周期函数--监听页面初次渲染完成
+ */
+ onReady: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面显示
+ */
+ onShow: function () {
+ //获取用户的登录信息
+ if (app.globalData.hasLogin) {
+ let userInfo = wx.getStorageSync('userInfo');
+ this.setData({
+ userInfo: userInfo,
+ hasLogin: true
+ });
+
+ let that = this;
+ util.request(api.ExpressTrace, {
+ orderId: that.data.orderId
+ }).then(function (res) {
+ if (res.errno === 0) {
+ that.setData({
+ traces: res.data.traces,
+ state: res.data.state,
+ shipperName: res.data.shipperName,
+ shipDate: res.data.shipDate,
+ shipTime: res.data.shipTime,
+ shipperCode: res.data.shipperCode,
+ address: res.data.address
+ });
+ }
+ });
+ }
+ },
+
+ /**
+ * 生命周期函数--监听页面隐藏
+ */
+ onHide: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面卸载
+ */
+ onUnload: function () {
+
+ },
+
+ /**
+ * 页面相关事件处理函数--监听用户下拉动作
+ */
+ onPullDownRefresh: function () {
+
+ },
+
+ /**
+ * 页面上拉触底事件的处理函数
+ */
+ onReachBottom: function () {
+
+ },
+
+ /**
+ * 用户点击右上角分享
+ */
+ onShareAppMessage: function () {
+
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/expressInfo/expressInfo.json b/wx-mini-program/pages/ucenter/expressInfo/expressInfo.json
new file mode 100644
index 0000000..21f74be
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/expressInfo/expressInfo.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "物流追踪",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/expressInfo/expressInfo.wxml b/wx-mini-program/pages/ucenter/expressInfo/expressInfo.wxml
new file mode 100644
index 0000000..f8b04c5
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/expressInfo/expressInfo.wxml
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+ {{shipperName}}
+ 运单号:{{shipperCode}}
+ 收货地址:{{address}}
+
+
+
+
+
+
+
+
+
+
+
+ 运输中
+ 已签收
+ 快递如有疑问请联系客服
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.acceptStation}}
+
+
+
+
+
+ {{item.date}}
+
+
+ {{item.time}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 卖家发货
+
+
+
+
+ {{shipDate}}
+
+
+ {{shipTime}}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/expressInfo/expressInfo.wxss b/wx-mini-program/pages/ucenter/expressInfo/expressInfo.wxss
new file mode 100644
index 0000000..762708b
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/expressInfo/expressInfo.wxss
@@ -0,0 +1,201 @@
+page {
+ height: 100%;
+ width: 100%;
+ background: #f4f4f4;
+}
+
+.container {
+ background: #f4f4f4;
+ height: auto;
+ overflow: hidden;
+ width: 100%;
+}
+
+.topExpress {
+ width: 710rpx;
+ height: 155rpx;
+ background: #fff;
+ margin: 10rpx auto;
+ display: flex;
+ border-radius: 10rpx;
+}
+
+.topExpress-left {
+ width: 150rpx;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.topExpress-left .avatar {
+ height: 100rpx;
+ width: 100rpx;
+ border-radius:50%;
+ text-align: center;
+ float: left;
+}
+
+
+.topExpress-right {
+ font-size: 26rpx;
+ color: #333;
+ display: flex;
+ justify-content: space-around;
+ flex-direction: column;
+ align-items: flex-start;
+ padding: 20rpx 0;
+}
+
+.topExpress-right-middle {
+ font-size: 28rpx;
+}
+
+.topExpress-right-bottom {
+ font-size: 28rpx;
+ color: #666;
+}
+
+.expressRecord {
+ width: 710rpx;
+ padding-top: 30rpx;
+ padding-bottom: 200rpx;
+ background: #fff;
+ margin: 0 auto;
+ border-radius: 10rpx;
+}
+
+.expressRecord-getAddress {
+ width: 100%;
+ font-size: 28rpx;
+ color: #999;
+ display: flex;
+}
+
+.expressRecord-top {
+ width: 100%;
+ display: flex;
+ justify-content: flex-start;
+ align-items: center;
+}
+
+.getAddress-icon {
+ width: 30rpx;
+ height: 30rpx;
+ border-radius: 50%;
+ font-size: 28rpx;
+ color: #fff;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ margin-left: 152rpx;
+}
+.finish {
+ background: #45dd09;
+}
+.unfinish {
+ background: #f7f303;
+}
+.getAddress-text {
+ margin-left: 20rpx;
+}
+
+.noReach-online-top-close {
+ width: 1rpx;
+ height: 50rpx;
+ background: #999;
+ margin-left: 165rpx;
+}
+
+.expressRecord-single-close {
+ width: 100%;
+ height: 122rpx;
+ display: flex;
+ justify-content: flex-start;
+ align-items: center;
+ position: relative;
+}
+
+.expressRecord-single-noReach-online-top-close {
+ display: flex;
+ flex-direction: column;
+}
+
+.online-top-closing {
+ width: 2rpx;
+ height: 50rpx;
+ background: #999;
+ margin-left: 165rpx;
+}
+
+.online-top-close {
+ width: 2rpx;
+ height: 50rpx;
+ background: #999;
+ margin-left: 165rpx;
+}
+
+.dot-close {
+ width: 20rpx;
+ height: 20rpx;
+ border-radius: 50%;
+ margin-left: 155rpx;
+ margin-top: 6rpx;
+ margin-bottom: 6rpx;
+ background: rgb(21, 216, 4);
+}
+
+.online-bottom {
+ width: 2rpx;
+ height: 50rpx;
+ background: #999;
+ margin-left: 165rpx;
+}
+
+.online-bottom-start {
+ width: 2rpx;
+ height: 50rpx;
+ /* background: #999; */
+ margin-left: 165rpx;
+}
+
+.expressRecord-text {
+ margin-left: 30rpx;
+}
+
+.expressRecord-statusing {
+ font-size: 28rpx;
+ color: #999;
+}
+
+.expressRecord-status-address {
+ font-size: 28rpx;
+ color: #666;
+}
+
+
+.expressRecord-status {
+ font-size: 35rpx;
+ color: #999;
+}
+
+.expressRecord-date {
+ position: absolute;
+ height: 100%;
+ /* top: 0;
+ bottom: 0; */
+ left: 15rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-direction: column;
+ color: #666;
+}
+
+.expressRecord-date-text {
+ font-size: 28rpx;
+}
+
+.expressRecord-date-time {
+ font-size: 28rpx;
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/feedback/feedback.js b/wx-mini-program/pages/ucenter/feedback/feedback.js
new file mode 100644
index 0000000..741d422
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/feedback/feedback.js
@@ -0,0 +1,184 @@
+var util = require('../../../utils/util.js');
+var check = require('../../../utils/check.js');
+var api = require('../../../config/api.js');
+
+var app = getApp();
+
+Page({
+ data: {
+ array: ['请选择反馈类型', '商品相关', '功能异常', '优化建议', '其他'],
+ index: 0,
+ content: '',
+ contentLength: 0,
+ mobile: '',
+ hasPicture: false,
+ picUrls: [],
+ files: []
+ },
+ chooseImage: function(e) {
+ if (this.data.files.length >= 5) {
+ util.showErrorToast('只能上传五张图片')
+ return false;
+ }
+
+ var that = this;
+ wx.chooseImage({
+ count: 1,
+ sizeType: ['original', 'compressed'],
+ sourceType: ['album', 'camera'],
+ success: function(res) {
+ that.setData({
+ files: that.data.files.concat(res.tempFilePaths)
+ });
+ that.upload(res);
+ }
+ })
+ },
+ upload: function(res) {
+ var that = this;
+ const uploadTask = wx.uploadFile({
+ url: api.StorageUpload,
+ filePath: res.tempFilePaths[0],
+ name: 'file',
+ success: function(res) {
+ var _res = JSON.parse(res.data);
+ if (_res.errno === 0) {
+ var url = _res.data.url
+ that.data.picUrls.push(url)
+ that.setData({
+ hasPicture: true,
+ picUrls: that.data.picUrls
+ })
+ }
+ },
+ fail: function(e) {
+ wx.showModal({
+ title: '错误',
+ content: '上传失败',
+ showCancel: false
+ })
+ },
+ })
+
+ uploadTask.onProgressUpdate((res) => {
+ console.log('上传进度', res.progress)
+ console.log('已经上传的数据长度', res.totalBytesSent)
+ console.log('预期需要上传的数据总长度', res.totalBytesExpectedToSend)
+ })
+
+ },
+ previewImage: function(e) {
+ wx.previewImage({
+ current: e.currentTarget.id, // 当前显示图片的http链接
+ urls: this.data.files // 需要预览的图片http链接列表
+ })
+ },
+ bindPickerChange: function(e) {
+ this.setData({
+ index: e.detail.value
+ });
+ },
+ mobileInput: function(e) {
+ this.setData({
+ mobile: e.detail.value
+ });
+ },
+ contentInput: function(e) {
+ this.setData({
+ contentLength: e.detail.cursor,
+ content: e.detail.value,
+ });
+ },
+ clearMobile: function(e) {
+ this.setData({
+ mobile: ''
+ });
+ },
+ submitFeedback: function(e) {
+ if (!app.globalData.hasLogin) {
+ wx.navigateTo({
+ url: "/pages/auth/login/login"
+ });
+ }
+
+ let that = this;
+ if (that.data.index == 0) {
+ util.showErrorToast('请选择反馈类型');
+ return false;
+ }
+
+ if (that.data.content == '') {
+ util.showErrorToast('请输入反馈内容');
+ return false;
+ }
+
+ if (that.data.mobile == '') {
+ util.showErrorToast('请输入手机号码');
+ return false;
+ }
+
+ if (!check.isValidPhone(this.data.mobile)) {
+ this.setData({
+ mobile: ''
+ });
+ util.showErrorToast('请输入手机号码');
+ return false;
+ }
+
+ wx.showLoading({
+ title: '提交中...',
+ mask: true,
+ success: function() {
+
+ }
+ });
+
+ util.request(api.FeedbackAdd, {
+ mobile: that.data.mobile,
+ feedType: that.data.array[that.data.index],
+ content: that.data.content,
+ hasPicture: that.data.hasPicture,
+ picUrls: that.data.picUrls
+ }, 'POST').then(function(res) {
+ wx.hideLoading();
+
+ if (res.errno === 0) {
+ wx.showToast({
+ title: '感谢您的反馈!',
+ icon: 'success',
+ duration: 2000,
+ complete: function() {
+ that.setData({
+ index: 0,
+ content: '',
+ contentLength: 0,
+ mobile: '',
+ hasPicture: false,
+ picUrls: [],
+ files: []
+ });
+ }
+ });
+ } else {
+ util.showErrorToast(res.errmsg);
+ }
+
+ });
+ },
+ onLoad: function(options) {
+
+ },
+ onReady: function() {
+
+ },
+ onShow: function() {
+
+ },
+ onHide: function() {
+ // 页面隐藏
+
+ },
+ onUnload: function() {
+ // 页面关闭
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/feedback/feedback.json b/wx-mini-program/pages/ucenter/feedback/feedback.json
new file mode 100644
index 0000000..0695be2
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/feedback/feedback.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "意见反馈",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/feedback/feedback.wxml b/wx-mini-program/pages/ucenter/feedback/feedback.wxml
new file mode 100644
index 0000000..52d1031
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/feedback/feedback.wxml
@@ -0,0 +1,35 @@
+
+
+
+
+
+ {{array[index]}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{contentLength}}/500
+
+
+ 手机号码
+
+
+
+
+
+
+ 提交
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/feedback/feedback.wxss b/wx-mini-program/pages/ucenter/feedback/feedback.wxss
new file mode 100644
index 0000000..e0beb89
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/feedback/feedback.wxss
@@ -0,0 +1,170 @@
+page {
+ background: #f4f4f4;
+ min-height: 100%;
+}
+
+.container {
+ background: #f4f4f4;
+ min-height: 100%;
+ padding-top: 30rpx;
+}
+
+.fb-type {
+ height: 104rpx;
+ width: 100%;
+ background: #fff;
+ margin-bottom: 20rpx;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ padding-left: 30rpx;
+ padding-right: 30rpx;
+}
+
+.fb-type .type-label {
+ height: 36rpx;
+ flex: 1;
+ color: #333;
+ font-size: 28rpx;
+}
+
+.fb-type .type-icon {
+ height: 36rpx;
+ width: 36rpx;
+}
+
+.fb-body {
+ width: 100%;
+ background: #fff;
+ height: 600rpx;
+ padding: 18rpx 30rpx 64rpx 30rpx;
+}
+
+.fb-body .content {
+ width: 100%;
+ height: 400rpx;
+ color: #333;
+ line-height: 40rpx;
+ font-size: 28rpx;
+}
+
+.weui-uploader__files {
+ width: 100%;
+}
+
+.weui-uploader__file {
+ float: left;
+ margin-right: 9px;
+ margin-bottom: 9px;
+}
+
+.weui-uploader__img {
+ display: block;
+ width: 50px;
+ height: 50px;
+}
+
+.weui-uploader__input-box {
+ float: left;
+ position: relative;
+ margin-right: 9px;
+ margin-bottom: 9px;
+ width: 50px;
+ height: 50px;
+ border: 1px solid #d9d9d9;
+}
+
+.weui-uploader__input-box:after, .weui-uploader__input-box:before {
+ content: " ";
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ -webkit-transform: translate(-50%, -50%);
+ transform: translate(-50%, -50%);
+ background-color: #d9d9d9;
+}
+
+.weui-uploader__input-box:before {
+ width: 2px;
+ height: 39.5px;
+}
+
+.weui-uploader__input-box:after {
+ width: 39.5px;
+ height: 2px;
+}
+
+.weui-uploader__input-box:active {
+ border-color: #999;
+}
+
+.weui-uploader__input-box:active:after, .weui-uploader__input-box:active:before {
+ background-color: #999;
+}
+
+.weui-uploader__input {
+ position: absolute;
+ z-index: 1;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ opacity: 0;
+}
+
+.fb-body .text-count {
+ line-height: 30rpx;
+ float: right;
+ color: #666;
+ font-size: 24rpx;
+}
+
+.fb-mobile {
+ height: 162rpx;
+ width: 100%;
+}
+
+.fb-mobile .label {
+ height: 58rpx;
+ width: 100%;
+ padding-top: 14rpx;
+ padding-bottom: 11rpx;
+ color: #7f7f7f;
+ font-size: 24rpx;
+ padding-left: 30rpx;
+ padding-right: 30rpx;
+ line-height: 33rpx;
+}
+
+.fb-mobile .mobile-box {
+ height: 104rpx;
+ width: 100%;
+ color: #333;
+ padding-left: 30rpx;
+ padding-right: 30rpx;
+ font-size: 24rpx;
+ background: #fff;
+ position: relative;
+}
+
+.fb-mobile .mobile {
+ position: absolute;
+ top: 27rpx;
+ left: 30rpx;
+ height: 50rpx;
+ width: 100%;
+ color: #333;
+ line-height: 50rpx;
+ font-size: 24rpx;
+}
+
+.fb-mobile .clear-icon {
+ position: absolute;
+ top: 27rpx;
+ right: 30rpx;
+ width: 48rpx;
+ height: 48rpx;
+ z-index: 2;
+}
+
+.fb-btn{background-color:#85c43f;font-size:32rpx;color:#fff;width:690rpx;height:90rpx;border-radius:50rpx;text-align:center;line-height:90rpx;margin:76rpx auto 0 auto;}
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/footprint/footprint.js b/wx-mini-program/pages/ucenter/footprint/footprint.js
new file mode 100644
index 0000000..3847b4d
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/footprint/footprint.js
@@ -0,0 +1,134 @@
+var util = require('../../../utils/util.js');
+var api = require('../../../config/api.js');
+
+var app = getApp();
+
+Page({
+ data: {
+ footprintList: [],
+ page: 1,
+ size: 10,
+ totalPages: 1
+ },
+ getFootprintList() {
+ wx.showLoading({
+ title: '加载中...',
+ });
+ let that = this;
+ util.request(api.FootprintList, {
+ page: that.data.page,
+ size: that.data.size
+ }).then(function(res) {
+ if (res.errno === 0) {
+ let f1 = that.data.footprintList;
+ let f2 = res.data.footprintList;
+ for (let i = 0; i < f2.length; i++) {
+ let last = f1.length - 1;
+ if (last >= 0 && f1[last][0].addTime === f2[i].addTime) {
+ f1[last].push(f2[i]);
+ } else {
+ let tmp = [];
+ tmp.push(f2[i])
+ f1.push(tmp);
+ }
+ }
+
+ that.setData({
+ footprintList: f1,
+ totalPages: res.data.totalPages
+ });
+ }
+ wx.hideLoading();
+ });
+ },
+ deleteItem(event) {
+ let that = this;
+ let index = event.currentTarget.dataset.index;
+ let iindex = event.currentTarget.dataset.iindex;
+ let footprintId = this.data.footprintList[index][iindex].id;
+ let goodsId = this.data.footprintList[index][iindex].goodsId;
+ var touchTime = that.data.touchEnd - that.data.touchStart;
+ console.log(touchTime);
+ //如果按下时间大于350为长按
+ if (touchTime > 350) {
+ wx.showModal({
+ title: '',
+ content: '要删除所选足迹?',
+ success: function(res) {
+ if (res.confirm) {
+ util.request(api.FootprintDelete, {
+ id: footprintId
+ }, 'POST').then(function(res) {
+ if (res.errno === 0) {
+ wx.showToast({
+ title: '删除成功',
+ icon: 'success',
+ duration: 2000
+ });
+ that.data.footprintList[index].splice(iindex, 1)
+ if (that.data.footprintList[index].length == 0) {
+ that.data.footprintList.splice(index, 1)
+ }
+ that.setData({
+ footprintList: that.data.footprintList
+ });
+ }
+ });
+ }
+ }
+ });
+ } else {
+ wx.navigateTo({
+ url: '/pages/goods/goods?id=' + goodsId,
+ });
+ }
+
+ },
+ onLoad: function(options) {
+ this.getFootprintList();
+ },
+ onReachBottom() {
+ if (this.data.totalPages > this.data.page) {
+ this.setData({
+ page: this.data.page + 1
+ });
+ this.getFootprintList();
+ } else {
+ wx.showToast({
+ title: '没有更多用户足迹了',
+ icon: 'none',
+ duration: 2000
+ });
+ return false;
+ }
+ },
+ onReady: function() {
+
+ },
+ onShow: function() {
+
+ },
+ onHide: function() {
+ // 页面隐藏
+
+ },
+ onUnload: function() {
+ // 页面关闭
+ },
+ //按下事件开始
+ touchStart: function(e) {
+ let that = this;
+ that.setData({
+ touchStart: e.timeStamp
+ })
+ console.log(e.timeStamp + '- touchStart')
+ },
+ //按下事件结束
+ touchEnd: function(e) {
+ let that = this;
+ that.setData({
+ touchEnd: e.timeStamp
+ })
+ console.log(e.timeStamp + '- touchEnd')
+ },
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/footprint/footprint.json b/wx-mini-program/pages/ucenter/footprint/footprint.json
new file mode 100644
index 0000000..ef9ea6a
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/footprint/footprint.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "我的足迹",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/footprint/footprint.wxml b/wx-mini-program/pages/ucenter/footprint/footprint.wxml
new file mode 100644
index 0000000..6ddf50d
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/footprint/footprint.wxml
@@ -0,0 +1,23 @@
+
+
+
+
+ 没有浏览足迹
+
+
+
+
+ {{item[0].addTime}}
+
+
+
+
+ {{iitem.name}}
+ {{iitem.brief}}
+ ¥{{iitem.retailPrice}}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/footprint/footprint.wxss b/wx-mini-program/pages/ucenter/footprint/footprint.wxss
new file mode 100644
index 0000000..96982b3
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/footprint/footprint.wxss
@@ -0,0 +1,126 @@
+page {
+ background: #f4f4f4;
+ min-height: 100%;
+}
+
+.container {
+ background: #f4f4f4;
+ min-height: 100%;
+ width: 100%;
+ height: auto;
+ overflow: hidden;
+}
+
+.no-footprint {
+ width: 100%;
+ height: auto;
+ margin: 0 auto;
+}
+
+.no-footprint .c {
+ width: 100%;
+ height: auto;
+ margin-top: 200rpx;
+}
+
+.no-footprint .c image {
+ margin: 0 auto;
+ display: block;
+ text-align: center;
+ width: 258rpx;
+ height: 258rpx;
+}
+
+.no-footprint .c text {
+ margin: 0 auto;
+ display: block;
+ width: 258rpx;
+ height: 29rpx;
+ line-height: 29rpx;
+ text-align: center;
+ font-size: 29rpx;
+ color: #999;
+}
+
+.footprint {
+ height: auto;
+ overflow: hidden;
+ width: 100%;
+ border-top: 1px solid #e1e1e1;
+}
+
+.day-item {
+ height: auto;
+ overflow: hidden;
+ width: 100%;
+ margin-bottom: 20rpx;
+}
+
+.day-hd {
+ height: 94rpx;
+ width: 100%;
+ line-height: 94rpx;
+ background: #fff;
+ padding-left: 30rpx;
+ color: #333;
+ font-size: 28rpx;
+}
+
+.day-list {
+ width: 100%;
+ height: auto;
+ overflow: hidden;
+ background: #fff;
+ padding-left: 30rpx;
+ border-top: 1px solid #e1e1e1;
+}
+
+.item {
+ height: 242rpx;
+ width: 720rpx;
+ background: #fff;
+ padding: 30rpx 30rpx 30rpx 0;
+ border-bottom: 1px solid #e1e1e1;
+}
+
+.item:last-child {
+ border-bottom: 1px solid #fff;
+}
+
+.item .img {
+ float: left;
+ width: 170rpx;
+ height: 170rpx;
+}
+
+.item .info {
+ float: right;
+ width: 520rpx;
+ height: 200rpx;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ padding-left: 20rpx;
+}
+
+.item .info .name {
+ line-height: 50rpx;
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 1;
+ overflow: hidden;
+}
+
+.item .info .subtitle {
+ margin-top: 8rpx;
+ line-height: 50rpx;
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 2;
+ overflow: hidden;
+}
+
+.item .info .price {
+ margin-top: 8rpx;
+ line-height: 40rpx;
+}
diff --git a/wx-mini-program/pages/ucenter/index/index.js b/wx-mini-program/pages/ucenter/index/index.js
new file mode 100644
index 0000000..da42e02
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/index/index.js
@@ -0,0 +1,159 @@
+var util = require('../../../utils/util.js');
+var api = require('../../../config/api.js');
+var user = require('../../../utils/user.js');
+const app = getApp();
+Page({
+ /**
+ * 页面的初始数据
+ */
+ data: {
+ userInfo: {
+ nickName: '点击登录',
+ avatarUrl: '/static/images/avatar.png'
+ },
+ order: {
+ unpaid: 0,
+ unship: 0,
+ unrecv: 0,
+ uncomment: 0
+ },
+ MyMenus: [
+ { url: "/pages/ucenter/collect/collect", pic:"icon_collect.png",name:"商品收藏"},
+ { url: "/pages/ucenter/footprint/footprint", pic: "footprint.png", name: "浏览足迹" },
+ { url: "/pages/groupon/myGroupon/myGroupon", pic: "group.png", name: "我的拼团" },
+ { url: "/pages/ucenter/address/address", pic: "address.png", name: "地址管理" },
+ { url: "/pages/ucenter/feedback/feedback", pic: "feedback.png", name: "意见反馈" },
+ { url: "/pages/about/about", pic: "about_us.png", name: "关于我们" }
+ // *,{ url: "/pages/about/about", pic: "comment.png", name: "使用帮助" }
+ ],
+ hasLogin: false,
+ totalAmount: 0.00
+ },
+
+ /**
+ * 页面跳转
+ */
+ goPages:function(e){
+ console.log();
+ if (this.data.hasLogin) {
+ wx.navigateTo({
+ url: e.currentTarget.dataset.url
+ });
+ } else {
+ wx.navigateTo({
+ url: "/pages/auth/login/login"
+ });
+ };
+ },
+
+ /**
+ * 生命周期函数--监听页面加载
+ */
+ onLoad: function (options) {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面隐藏
+ */
+ onHide: function () {
+
+ },
+ /**
+ * 生命周期函数--监听页面卸载
+ */
+ onUnload: function () {
+
+ },
+ onShow:function(){
+ //获取用户的登录信息
+ if (app.globalData.hasLogin) {
+ let userInfo = wx.getStorageSync('userInfo');
+ this.setData({
+ userInfo: userInfo,
+ hasLogin: true
+ });
+
+ let that = this;
+ util.request(api.UserIndex).then(function (res) {
+ if (res.errno === 0) {
+ that.setData({
+ order: res.data.order,
+ totalAmount: res.data.totalAmount,
+ remainAmount: res.data.remainAmount,
+ couponCount: res.data.couponCount
+ });
+ }
+ });
+ }
+ },
+
+ /**
+ * 生命周期函数--监听页面卸载
+ */
+ onUnload: function () {
+
+ },
+ goLogin() {
+ if (!this.data.hasLogin) {
+ wx.navigateTo({
+ url: "/pages/auth/login/login"
+ });
+ }
+ },
+ goBrokerage() {
+ if (this.data.hasLogin) {
+ wx.navigateTo({
+ url: "/pages/brokerage/main/main"
+ });
+ } else {
+ wx.navigateTo({
+ url: "/pages/auth/login/login"
+ });
+ };
+ },
+ goOrder() {
+ if (this.data.hasLogin) {
+ try {
+ wx.setStorageSync('tab', '0');
+ } catch (e) {
+
+ }
+ wx.navigateTo({
+ url: "/pages/ucenter/order/order"
+ });
+ } else {
+ wx.navigateTo({
+ url: "/pages/auth/login/login"
+ });
+ }
+ },
+ goOrderIndex(e) {
+ if (this.data.hasLogin) {
+ let tab = e.currentTarget.dataset.index
+ let route = e.currentTarget.dataset.route
+ try {
+ wx.setStorageSync('tab', tab);
+ } catch (e) {
+
+ }
+ wx.navigateTo({
+ url: route,
+ success: function (res) { },
+ fail: function (res) { },
+ complete: function (res) { },
+ })
+ } else {
+ wx.navigateTo({
+ url: "/pages/auth/login/login"
+ });
+ };
+ },
+ goAfterSale: function () {
+ wx.showToast({
+ title: '目前不支持',
+ icon: 'none',
+ duration: 2000
+ });
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/index/index.json b/wx-mini-program/pages/ucenter/index/index.json
new file mode 100644
index 0000000..490dec6
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/index/index.json
@@ -0,0 +1,5 @@
+{
+ "backgroundColor": "#f4f4f4",
+ "navigationBarTitleText": "个人中心",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/index/index.wxml b/wx-mini-program/pages/ucenter/index/index.wxml
new file mode 100644
index 0000000..6eb99ec
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/index/index.wxml
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+ {{userInfo.nickName || '请授权'}}
+
+ 用户编号:1000{{userInfo.userId || 0}}
+
+
+
+
+
+
+
+ 当前佣金
+ ¥ {{remainAmount || 0.00}}
+
+
+ 总收益
+ ¥ {{totalAmount || 0}}
+
+
+ 优惠券
+ {{couponCount || 0}}
+
+
+
+
+ 我的订单
+ 全部订单
+
+
+
+
+ {{order.unpaid}}
+
+
+ 待付款
+
+
+
+ {{order.unship}}
+
+
+ 待发货
+
+
+
+ {{order.unrecv}}
+
+
+ 待收货
+
+
+
+ {{order.uncomment}}
+
+
+ 待评价
+
+
+
+ 所有订单
+
+
+
+
+ 我的服务
+
+
+
+ {{item.name}}
+
+
+
+
+
+
+
diff --git a/wx-mini-program/pages/ucenter/index/index.wxss b/wx-mini-program/pages/ucenter/index/index.wxss
new file mode 100644
index 0000000..08ede56
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/index/index.wxss
@@ -0,0 +1,44 @@
+.user .header{padding:0 30rpx;height:190rpx;position:relative;}
+.user .header:after { position: absolute;left: 0;right: 0;bottom: -98rpx;z-index: -1;
+ content:'';height:100rpx;width: 100%;border-radius: 0 0 50% 50%;background-color: #85c43f;}
+.user .header .picTxt .pictrue{width:120rpx;height:120rpx;}
+.user .header .picTxt .pictrue image{width:100%;height:100%;border-radius:50%;border:2px solid #f5f5f5;}
+.user .header .picTxt .text{width:434rpx;color:rgba(255,255,255,1);margin-left:35rpx;}
+.user .header .picTxt .text .name{color:#fff;font-size:36rpx;max-width:470rpx;}
+.user .header .picTxt .text .member{padding:0 10rpx;height:36rpx;background-color:rgba(0, 0, 0, 0.2);font-size:20rpx;border-radius:30rpx;margin-left:17rpx;}
+.user .header .picTxt .text .member image{width:22rpx;height:22rpx;font-size:20rpx;margin-right:8rpx;}
+.user .header .picTxt .text .id{color:rgba(255,255,255,0.6);font-size:26rpx;margin-top:15rpx;}
+.user .header .picTxt .text .id .iconfont{font-size:30rpx;margin-left:12rpx;}
+.user .header .icon-shezhi{font-size:38rpx;color:#fff;margin-top:15rpx;margin-right: 30rpx;}
+.user .wrapper{padding:0 20rpx;}
+.user .wrapper .nav{background-color:#fff;border-radius:20rpx;height:140rpx;}
+.user .wrapper .nav .item{flex:1;text-align:center;}
+.user .wrapper .nav .item~.item{border-left:1px solid #eee;}
+.user .wrapper .nav .item .title{font-size:28rpx;color:#666;}
+.user .wrapper .nav .item .num{margin-top:16rpx;font-size:36rpx;color:rgb(223, 8, 8);}
+.user .wrapper .myOrder{background-color:#fff;border-radius:10rpx;margin-top:15rpx;}
+.user .wrapper .myOrder .title,.user .wrapper .myService .title{height:88rpx;padding:0 30rpx;border-bottom:1px dashed #ddd;font-size:30rpx;color:#282828;}
+.user .wrapper .myOrder .title .allOrder{font-size:26rpx;color:#666;}
+.user .wrapper .myOrder .title .allOrder .iconfont{font-size:30rpx;margin-left:7rpx;}
+.user .wrapper .myOrder .orderState{height:160rpx;}
+.user .wrapper .myOrder .orderState .item{font-size:26rpx;color:#454545;flex:1;text-align:center;}
+.user .wrapper .myOrder .orderState .item .pictrue{width:64rpx;height:64rpx;margin:0 auto 18rpx auto;}
+.user .wrapper .myOrder .orderState .item .pictrue image{width:100%;height:100%;}
+.user .wrapper .myService{background-color:#fff;margin-top:15rpx;border-radius:10rpx;}
+.user .wrapper .myService .serviceList{padding:8rpx 0 27rpx 0;}
+.user .wrapper .myService .serviceList .item{width:25%;text-align:center;font-size:26rpx;color:#333;margin-top:30rpx;}
+.user .wrapper .myService .serviceList .item .pictrue{width:64rpx;height:64rpx;margin:0 auto 16rpx auto;}
+.user .wrapper .myService .serviceList .item .pictrue image{width:100%;height:100%;}
+.user .support{width:219rpx;height:74rpx;margin:54rpx auto;display:block;}
+.item_badge {
+ height: 32rpx;
+ width: 32rpx;
+ position: absolute;
+ background: #b4282d;
+ color: #fff;
+ border-radius: 50%;
+ margin-top: 0rpx;
+ margin-left: 40rpx;
+}
+
+
diff --git a/wx-mini-program/pages/ucenter/main/index.js b/wx-mini-program/pages/ucenter/main/index.js
new file mode 100644
index 0000000..d6b0c44
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/main/index.js
@@ -0,0 +1,232 @@
+var util = require('../../../utils/util.js');
+var api = require('../../../config/api.js');
+var user = require('../../../utils/user.js');
+var app = getApp();
+
+Page({
+ data: {
+ userInfo: {
+ nickName: '点击登录',
+ avatarUrl: 'http://yanxuan.nosdn.127.net/8945ae63d940cc42406c3f67019c5cb6.png'
+ },
+ order: {
+ unpaid: 0,
+ unship: 0,
+ unrecv: 0,
+ uncomment: 0
+ },
+ hasLogin: false,
+ totalAmount:0.00
+ },
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ },
+ onReady: function() {
+
+ },
+ onShow: function() {
+
+ //获取用户的登录信息
+ if (app.globalData.hasLogin) {
+ let userInfo = wx.getStorageSync('userInfo');
+ this.setData({
+ userInfo: userInfo,
+ hasLogin: true
+ });
+
+ let that = this;
+ util.request(api.UserIndex).then(function(res) {
+ if (res.errno === 0) {
+ that.setData({
+ order: res.data.order,
+ totalAmount:res.data.totalAmount
+ });
+ }
+ });
+ }
+
+ },
+ onHide: function() {
+ // 页面隐藏
+
+ },
+ onUnload: function() {
+ // 页面关闭
+ },
+ goLogin() {
+ if (!this.data.hasLogin) {
+ wx.navigateTo({
+ url: "/pages/auth/login/login"
+ });
+ }
+ },
+ goOrder() {
+ if (this.data.hasLogin) {
+ wx.navigateTo({
+ url: "/pages/ucenter/order/order"
+ });
+ } else {
+ wx.navigateTo({
+ url: "/pages/auth/login/login"
+ });
+ }
+ },
+ goOrderIndex(e) {
+ if (this.data.hasLogin) {
+ let tab = e.currentTarget.dataset.index
+ let route = e.currentTarget.dataset.route
+ try {
+ wx.setStorageSync('tab', tab);
+ } catch (e) {
+
+ }
+ wx.navigateTo({
+ url: route,
+ success: function(res) {},
+ fail: function(res) {},
+ complete: function(res) {},
+ })
+ } else {
+ wx.navigateTo({
+ url: "/pages/auth/login/login"
+ });
+ };
+ },
+ goCoupon() {
+ if (this.data.hasLogin) {
+ wx.navigateTo({
+ url: "/pages/ucenter/couponList/couponList"
+ });
+ } else {
+ wx.navigateTo({
+ url: "/pages/auth/login/login"
+ });
+ };
+ },
+ goGroupon() {
+ if (this.data.hasLogin) {
+ wx.navigateTo({
+ url: "/pages/groupon/myGroupon/myGroupon"
+ });
+ } else {
+ wx.navigateTo({
+ url: "/pages/auth/login/login"
+ });
+ };
+ },
+ goCollect() {
+ if (this.data.hasLogin) {
+ wx.navigateTo({
+ url: "/pages/ucenter/collect/collect"
+ });
+ } else {
+ wx.navigateTo({
+ url: "/pages/auth/login/login"
+ });
+ };
+ },
+ goFeedback(e) {
+ if (this.data.hasLogin) {
+ wx.navigateTo({
+ url: "/pages/ucenter/feedback/feedback"
+ });
+ } else {
+ wx.navigateTo({
+ url: "/pages/auth/login/login"
+ });
+ };
+ },
+ goFootprint() {
+ if (this.data.hasLogin) {
+ wx.navigateTo({
+ url: "/pages/ucenter/footprint/footprint"
+ });
+ } else {
+ wx.navigateTo({
+ url: "/pages/auth/login/login"
+ });
+ };
+ },
+ goAddress() {
+ if (this.data.hasLogin) {
+ wx.navigateTo({
+ url: "/pages/ucenter/address/address"
+ });
+ } else {
+ wx.navigateTo({
+ url: "/pages/auth/login/login"
+ });
+ };
+ },
+ bindPhoneNumber: function(e) {
+ if (e.detail.errMsg !== "getPhoneNumber:ok") {
+ // 拒绝授权
+ return;
+ }
+
+ if (!this.data.hasLogin) {
+ wx.showToast({
+ title: '绑定失败:请先登录',
+ icon: 'none',
+ duration: 2000
+ });
+ return;
+ }
+
+ util.request(api.AuthBindPhone, {
+ iv: e.detail.iv,
+ encryptedData: e.detail.encryptedData
+ }, 'POST').then(function(res) {
+ if (res.errno === 0) {
+ wx.showToast({
+ title: '绑定手机号码成功',
+ icon: 'success',
+ duration: 2000
+ });
+ }
+ });
+ },
+ goAfterSale: function() {
+ wx.showToast({
+ title: '目前不支持',
+ icon: 'none',
+ duration: 2000
+ });
+ },
+ aboutUs: function() {
+ wx.navigateTo({
+ url: '/pages/about/about'
+ });
+ },
+ goBrokerage() {
+ if (this.data.hasLogin) {
+ wx.navigateTo({
+ url: "/pages/brokerage/main/main"
+ });
+ } else {
+ wx.navigateTo({
+ url: "/pages/auth/login/login"
+ });
+ };
+ },
+ exitLogin: function() {
+ wx.showModal({
+ title: '',
+ confirmColor: '#b4282d',
+ content: '退出登录?',
+ success: function(res) {
+ if (!res.confirm) {
+ return;
+ }
+
+ util.request(api.AuthLogout, {}, 'POST');
+ app.globalData.hasLogin = false;
+ wx.removeStorageSync('token');
+ wx.removeStorageSync('userInfo');
+ wx.reLaunch({
+ url: '/pages/index/index'
+ });
+ }
+ })
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/main/index.json b/wx-mini-program/pages/ucenter/main/index.json
new file mode 100644
index 0000000..490dec6
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/main/index.json
@@ -0,0 +1,5 @@
+{
+ "backgroundColor": "#f4f4f4",
+ "navigationBarTitleText": "个人中心",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/main/index.wxml b/wx-mini-program/pages/ucenter/main/index.wxml
new file mode 100644
index 0000000..57fb7e6
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/main/index.wxml
@@ -0,0 +1,105 @@
+
+
+
+
+ {{userInfo.nickName}}
+ VIP用户
+
+
+ 总收益
+ ¥ {{totalAmount}}
+
+
+
+
+
+
+
+ 我的订单
+
+
+
+
+ {{order.unpaid}}
+
+
+ 待付款
+
+
+ {{order.unship}}
+
+ 待发货
+
+
+ {{order.unrecv}}
+
+ 待收货
+
+
+ {{order.uncomment}}
+
+ 待评价
+
+
+
+
+
+
+
+ 核心服务
+
+
+
+
+
+ 优惠卷
+
+
+
+ 商品收藏
+
+
+
+ 浏览足迹
+
+
+
+ 我的拼团
+
+
+
+ 售后
+
+
+
+
+
+ 必备工具
+
+
+
+
+ 地址管理
+
+
+
+
+ 意见反馈
+
+
+
+
+
+ 联系客服
+
+
+
+ 关于我们
+
+
+
+ 退出登录
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/main/index.wxss b/wx-mini-program/pages/ucenter/main/index.wxss
new file mode 100644
index 0000000..67d469e
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/main/index.wxss
@@ -0,0 +1,184 @@
+page {
+ height: 100%;
+ width: 100%;
+ background: #f4f4f4;
+}
+
+.container {
+ background: #f4f4f4;
+ height: auto;
+ overflow: hidden;
+ width: 100%;
+}
+
+.profile-info {
+ background-color: #85c43f;
+ color: #f4f4f4;
+ padding: 30rpx;
+ font-size: 28rpx;
+ overflow: hidden;
+}
+
+.profile-info .avatar {
+ height: 150rpx;
+ width: 150rpx;
+ border-radius:50%;
+ text-align: center;
+ float: left;
+}
+
+.profile-info .info {
+ padding-top: 32rpx;
+ height: 85rpx;
+ padding-left: 21.25rpx;
+ width:40%;
+ float: left;
+}
+
+.profile-info .brokerage {
+ padding-top: 32rpx;
+ text-align: center;
+ height: 85rpx;
+ padding-left: 11.25rpx;
+ width:35%;
+ float: right;
+}
+
+.profile-info .name {
+ display: block;
+ height: 45rpx;
+ line-height: 45rpx;
+ color: #fff;
+ font-size: 35.5rpx;
+ margin-bottom: 15rpx;
+}
+
+.profile-info .level {
+ display: block;
+ height: 30rpx;
+ line-height: 30rpx;
+ margin-bottom: 10rpx;
+ color: #fff;
+ font-size: 26rpx;
+}
+
+.profile-info .money {
+ display: block;
+ height: 30rpx;
+ line-height: 30rpx;
+ margin-bottom: 10rpx;
+ color: #ffe600;
+ font-size: 34rpx;
+}
+
+.user_area {
+ /* border: 1px solid black; */
+ width: 100%;
+ height: 226rpx;
+ /* margin: 0 auto; */
+ margin-top: -8rpx;
+ background: #fff;
+ /* border-top: 1px solid #f4f4f4; */
+}
+
+.user_row {
+ /* border: 1px solid black; */
+ height: 86rpx;
+ line-height: 86rpx;
+ border-bottom: 1px solid #fafafa;
+}
+
+.user_row_left {
+ /* border: 1px solid #757575; */
+ float: left;
+ height: 86rpx;
+ font-weight: 550;
+ line-height: 86rpx;
+ margin-left: 35rpx;
+ font-size: 26rpx;
+ letter-spacing: 1rpx;
+}
+
+.user_row_right {
+ /* border: 1px solid #757575; */
+ float: right;
+ height: 40rpx;
+ width: 40rpx;
+ font-weight: 550;
+ line-height: 86rpx;
+ margin-top: 28rpx;
+ margin-right: 30rpx;
+}
+
+.user_column {
+ /* border: 1px solid black; */
+ height: 140rpx;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.user_column_item {
+ width: 30%;
+ height: 140rpx;
+ background: #fff;
+ text-align: center;
+ position: relative;
+}
+
+.user_column_item_badge {
+ height: 28rpx;
+ width: 28rpx;
+ position: absolute;
+ background: #b4282d;
+ color: #fff;
+ border-radius: 50%;
+ margin-top: 20rpx;
+ margin-left: 40rpx;
+}
+
+.user_column_item_image {
+ width: 50rpx;
+ height: 50rpx;
+ margin-top: 30rpx;
+}
+
+.user_column_item_text {
+ /* border: 1px solid black; */
+ margin-top: 5rpx;
+ font-size: 24rpx;
+ color: #555;
+}
+
+.separate {
+ background: #e0e3da;
+ width: 100%;
+ height: 6rpx;
+}
+
+.user_column_item_phone {
+ width: 30%;
+ text-align: center;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ flex-wrap: wrap;
+ float: left;
+ background: #fff;
+ border-bottom: 1px solid #fafafa;
+}
+
+.user_column_item_phone::after {
+ border: none;
+}
+
+.logout {
+ margin-top: 30rpx;
+ height: 100rpx;
+ width: 100%;
+ line-height: 100rpx;
+ text-align: center;
+ background: #fff;
+ color: red;
+ font-size: 30rpx;
+}
diff --git a/wx-mini-program/pages/ucenter/order/order.js b/wx-mini-program/pages/ucenter/order/order.js
new file mode 100644
index 0000000..cd4fbaa
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/order/order.js
@@ -0,0 +1,223 @@
+var util = require('../../../utils/util.js');
+var api = require('../../../config/api.js');
+
+Page({
+ data: {
+ orderList: [],
+ showType: 0,
+ page: 1,
+ size: 10,
+ totalPages: 1
+ },
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ let that = this
+ try {
+ var tab = wx.getStorageSync('tab');
+ this.setData({
+ showType: tab
+ });
+ } catch (e) {}
+
+ },
+ getOrderList() {
+ let that = this;
+ util.request(api.OrderList, {
+ showType: that.data.showType,
+ page: that.data.page,
+ size: that.data.size
+ }).then(function(res) {
+ if (res.errno === 0) {
+ console.log(res.data);
+ that.setData({
+ orderList: that.data.orderList.concat(res.data.data),
+ totalPages: res.data.totalPages
+ });
+ }
+ });
+ },
+ onReachBottom() {
+ if (this.data.totalPages > this.data.page) {
+ this.setData({
+ page: this.data.page + 1
+ });
+ this.getOrderList();
+ } else {
+ wx.showToast({
+ title: '没有更多订单了',
+ icon: 'none',
+ duration: 2000
+ });
+ return false;
+ }
+ },
+ switchTab: function(event) {
+ let showType = event.currentTarget.dataset.index;
+ this.setData({
+ orderList: [],
+ showType: showType,
+ page: 1,
+ size: 10,
+ totalPages: 1
+ });
+ this.getOrderList();
+ },
+ // “去付款”按钮点击效果
+ payOrder: function (e) {
+ let that = this;
+ let orderId = e.currentTarget.dataset.index;
+ util.request(api.OrderPrepay, {
+ orderId: orderId
+ }, 'POST').then(function (res) {
+ if (res.errno === 0) {
+ const payParam = res.data;
+ console.log("支付过程开始");
+ wx.requestPayment({
+ 'timeStamp': payParam.timeStamp,
+ 'nonceStr': payParam.nonceStr,
+ 'package': payParam.packageValue,
+ 'signType': payParam.signType,
+ 'paySign': payParam.paySign,
+ 'success': function (res) {
+ console.log("支付过程成功");
+ util.redirect('/pages/ucenter/order/order');
+ },
+ 'fail': function (res) {
+ console.log("支付过程失败");
+ util.showErrorToast('支付失败');
+ },
+ 'complete': function (res) {
+ console.log("支付过程结束")
+ }
+ });
+ }
+ });
+
+ },
+ // “取消订单”点击效果
+ cancelOrder: function (e) {
+ let that = this;
+ let orderId = e.currentTarget.dataset.index;
+
+ wx.showModal({
+ title: '',
+ content: '确定要取消此订单?',
+ success: function (res) {
+ if (res.confirm) {
+ util.request(api.OrderCancel, {
+ orderId: orderId
+ }, 'POST').then(function (res) {
+ if (res.errno === 0) {
+ wx.showToast({
+ title: '取消订单成功'
+ });
+ util.redirect('/pages/ucenter/order/order');
+ } else {
+ util.showErrorToast(res.errmsg);
+ }
+ });
+ }
+ }
+ });
+ },
+ // “取消订单并退款”点击效果
+ refundOrder: function (e) {
+ let that = this;
+ let orderId = e.currentTarget.dataset.index;
+
+ wx.showModal({
+ title: '',
+ content: '确定要取消此订单?',
+ success: function (res) {
+ if (res.confirm) {
+ util.request(api.OrderRefund, {
+ orderId: orderId
+ }, 'POST').then(function (res) {
+ if (res.errno === 0) {
+ wx.showToast({
+ title: '取消订单成功'
+ });
+ util.redirect('/pages/ucenter/order/order');
+ } else {
+ util.showErrorToast(res.errmsg);
+ }
+ });
+ }
+ }
+ });
+ },
+ // “删除”点击效果
+ deleteOrder: function (e) {
+ let that = this;
+ let orderId = e.currentTarget.dataset.index;
+
+ wx.showModal({
+ title: '',
+ content: '确定要删除此订单?',
+ success: function (res) {
+ if (res.confirm) {
+ util.request(api.OrderDelete, {
+ orderId: orderId
+ }, 'POST').then(function (res) {
+ if (res.errno === 0) {
+ wx.showToast({
+ title: '删除订单成功'
+ });
+ util.redirect('/pages/ucenter/order/order');
+ } else {
+ util.showErrorToast(res.errmsg);
+ }
+ });
+ }
+ }
+ });
+ },
+ // “确认收货”点击效果
+ confirmOrder: function (e) {
+ let that = this;
+ let orderId = e.currentTarget.dataset.index;
+
+ wx.showModal({
+ title: '',
+ content: '确认收货?',
+ success: function (res) {
+ if (res.confirm) {
+ util.request(api.OrderConfirm, {
+ orderId: orderId
+ }, 'POST').then(function (res) {
+ if (res.errno === 0) {
+ wx.showToast({
+ title: '确认收货成功!'
+ });
+ util.redirect('/pages/ucenter/order/order');
+ } else {
+ util.showErrorToast(res.errmsg);
+ }
+ });
+ }
+ }
+ });
+ },
+ detailExpress:function(e){
+ let orderId = e.currentTarget.dataset.index;
+ wx.navigateTo({url:'/pages/ucenter/expressInfo/expressInfo?orderId=' + orderId});
+ },
+ onReady: function() {
+ // 页面渲染完成
+ },
+ onShow: function() {
+ this.setData({
+ orderList: [],
+ page: 1,
+ size: 10,
+ totalPages: 1
+ });
+ this.getOrderList();
+ },
+ onHide: function() {
+ // 页面隐藏
+ },
+ onUnload: function() {
+ // 页面关闭
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/order/order.json b/wx-mini-program/pages/ucenter/order/order.json
new file mode 100644
index 0000000..bcc321d
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/order/order.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "我的订单",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/order/order.wxml b/wx-mini-program/pages/ucenter/order/order.wxml
new file mode 100644
index 0000000..0282373
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/order/order.wxml
@@ -0,0 +1,69 @@
+
+
+
+ 全部
+
+
+ 待付款
+
+
+ 待发货
+
+
+ 待收货
+
+
+ 待评价
+
+
+
+
+
+
+
+
+
+
+
+ 订单编号:{{item.orderSn}}
+ {{item.orderStatusText}}
+
+
+
+
+
+
+
+
+ {{gitem.goodsName}}
+
+
+ {{gitem.specifications}}
+ 共 {{gitem.number}} 件商品
+
+ ¥{{gitem.price}}
+
+ 去评价
+
+
+ 再次购买
+
+
+
+
+
+ 实付:
+ ¥{{item.actualPrice}}
+
+
+ 取消订单
+ 去付款
+ 查看物流
+ 确认收货
+ 删除订单
+ 申请退款
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/order/order.wxss b/wx-mini-program/pages/ucenter/order/order.wxss
new file mode 100644
index 0000000..bfa0399
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/order/order.wxss
@@ -0,0 +1,232 @@
+page {
+ height: 100%;
+ width: 100%;
+ background: #f4f4f4;
+}
+
+.orders-switch {
+ width: 100%;
+ background: #fff;
+ height: 84rpx;
+ /* border-bottom: 1px solid rgba(0,0,0,.15); */
+}
+
+.orders-switch .item {
+ display: inline-block;
+ height: 82rpx;
+ width: 18%;
+ padding: 0 15rpx;
+ text-align: center;
+}
+
+.orders-switch .item .txt {
+ display: inline-block;
+ height: 82rpx;
+ padding: 0 20rpx;
+ line-height: 82rpx;
+ color: #9a9ba1;
+ font-size: 30rpx;
+ margin-left: 20rp;
+ margin-right: 20rpx;
+ width: 140rpx;
+}
+
+.orders-switch .item.active .txt {
+ color: #85c43f;
+ border-bottom: 3rpx solid #85c43f;
+}
+
+.no-order {
+ width: 100%;
+ height: auto;
+ margin: 0 auto;
+}
+
+.no-order .c {
+ width: 100%;
+ height: auto;
+ margin-top: 200rpx;
+}
+
+.no-order .c image {
+ margin: 0 auto;
+ display: block;
+ text-align: center;
+ width: 414rpx;
+ height: 336rpx;
+}
+
+.no-order .c text {
+ margin: 0 auto;
+ display: block;
+ width: 258rpx;
+ height: 29rpx;
+ line-height: 29rpx;
+ text-align: center;
+ font-size: 29rpx;
+ color: #999;
+}
+
+.orders {
+ height: auto;
+ width: 100%;
+ overflow: hidden;
+}
+
+.order {
+ margin-top: 20rpx;
+ background: #fff;
+}
+
+.order .h {
+ height: 83.3rpx;
+ line-height: 83.3rpx;
+ margin-left: 31.25rpx;
+ padding-right: 31.25rpx;
+ border-bottom: 1px solid #f4f4f4;
+ font-size: 30rpx;
+ color: #333;
+}
+
+.order .h .l {
+ float: left;
+}
+
+.order .h .r {
+ float: right;
+ color: #b4282d;
+ font-size: 24rpx;
+}
+
+.order .b .cost {
+ color: #b4282d;
+}
+
+.order .b {
+ height: 103rpx;
+ line-height: 103rpx;
+ margin-left: 31.25rpx;
+ padding-right: 31.25rpx;
+ border-top: 1px solid #f4f4f4;
+ font-size: 30rpx;
+ color: #333;
+}
+
+.order .b .l {
+ float: left;
+}
+
+.order .b .r {
+ float: right;
+}
+
+.order .b .btn {
+ margin-top: 19rpx;
+ height: 64.5rpx;
+ margin-right: 19rpx;
+ line-height: 64.5rpx;
+ text-align: center;
+ padding: 0 20rpx;
+ border-radius: 5rpx;
+ font-size: 28rpx;
+ color: #fff;
+ float:left;
+ background: #85c43f;
+}
+
+.order .goods {
+ margin-top: 20rpx;
+ background: #fff;
+}
+
+.goods .item {
+ display: flex;
+ align-items: top;
+ height: 202rpx;
+ margin-left: 31.25rpx;
+ margin-bottom: 15.25rpx;
+ padding-right: 31.25rpx;
+ border-bottom: 1px solid #f4f4f4;
+}
+
+.goods .item:last-child {
+ border-bottom: none;
+}
+
+.goods .item .img {
+ height: 145.83rpx;
+ margin-top: 15.5rpx;
+ width: 145.83rpx;
+ background: #f4f4f4;
+}
+
+.goods .item .img image {
+ height: 145.83rpx;
+ width: 145.83rpx;
+}
+
+.goods .item .info {
+ flex: 1;
+ height: 145.83rpx;
+ margin-left: 20rpx;
+}
+
+.goods .item .t {
+ margin-top: 14rpx;
+ height: 45rpx;
+ line-height: 45rpx;
+ margin-bottom: 8.5rpx;
+}
+
+.goods .item .t .name {
+ display: block;
+ float: left;
+ height: 33rpx;
+ line-height: 33rpx;
+ color: #333;
+ font-size: 30rpx;
+}
+
+.goods .item .t .number {
+ display: block;
+ float: right;
+ height: 29rpx;
+ text-align: right;
+ line-height: 29rpx;
+ color: #333;
+ font-size: 30rpx;
+}
+
+.goods .item .attr {
+ height: 29rpx;
+ line-height: 29rpx;
+ color: #666;
+ margin-bottom: 25rpx;
+ font-size: 25rpx;
+}
+
+.goods .item .price {
+ display: block;
+ float: left;
+ height: 30rpx;
+ line-height: 30rpx;
+ color: #333;
+ font-size: 30rpx;
+}
+
+.goods .item .btn {
+ height: 50rpx;
+ line-height: 50rpx;
+ border-radius: 5rpx;
+ text-align: center;
+ display: block;
+ float: right;
+ margin: 0 15rpx;
+ padding: 0 20rpx;
+}
+
+.goods .item .btn.active {
+ background: #ee9e09;
+ color: #fff;
+ border-radius: 40rpx;
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/orderDetail/orderDetail.js b/wx-mini-program/pages/ucenter/orderDetail/orderDetail.js
new file mode 100644
index 0000000..d6a034a
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/orderDetail/orderDetail.js
@@ -0,0 +1,203 @@
+var util = require('../../../utils/util.js');
+var api = require('../../../config/api.js');
+
+Page({
+ data: {
+ orderId: 0,
+ orderInfo: {},
+ orderGoods: [],
+ flag: false,
+ handleOption: {}
+ },
+ onLoad: function(options) {
+ // 页面初始化 options为页面跳转所带来的参数
+ this.setData({
+ orderId: options.id
+ });
+ this.getOrderDetail();
+ },
+ onPullDownRefresh() {
+ wx.showNavigationBarLoading() //在标题栏中显示加载
+ this.getOrderDetail();
+ wx.hideNavigationBarLoading() //完成停止加载
+ wx.stopPullDownRefresh() //停止下拉刷新
+ },
+ expandDetail: function() {
+ let that = this;
+ this.setData({
+ flag: !that.data.flag
+ })
+ },
+ getOrderDetail: function() {
+ wx.showLoading({
+ title: '加载中',
+ });
+
+ setTimeout(function() {
+ wx.hideLoading()
+ }, 2000);
+
+ let that = this;
+ util.request(api.OrderDetail, {
+ orderId: that.data.orderId
+ }).then(function(res) {
+ if (res.errno === 0) {
+ console.log(res.data);
+ that.setData({
+ orderInfo: res.data.orderInfo,
+ orderGoods: res.data.orderGoods,
+ handleOption: res.data.orderInfo.handleOption
+ });
+ }
+
+ wx.hideLoading();
+ });
+ },
+ // “去付款”按钮点击效果
+ payOrder: function() {
+ let that = this;
+ util.request(api.OrderPrepay, {
+ orderId: that.data.orderId
+ }, 'POST').then(function(res) {
+ if (res.errno === 0) {
+ const payParam = res.data;
+ console.log("支付过程开始");
+ wx.requestPayment({
+ 'timeStamp': payParam.timeStamp,
+ 'nonceStr': payParam.nonceStr,
+ 'package': payParam.packageValue,
+ 'signType': payParam.signType,
+ 'paySign': payParam.paySign,
+ 'success': function(res) {
+ console.log("支付过程成功");
+ util.redirect('/pages/ucenter/order/order');
+ },
+ 'fail': function(res) {
+ console.log("支付过程失败");
+ util.showErrorToast('支付失败');
+ },
+ 'complete': function(res) {
+ console.log("支付过程结束")
+ }
+ });
+ }
+ });
+
+ },
+ // “取消订单”点击效果
+ cancelOrder: function() {
+ let that = this;
+ let orderInfo = that.data.orderInfo;
+
+ wx.showModal({
+ title: '',
+ content: '确定要取消此订单?',
+ success: function(res) {
+ if (res.confirm) {
+ util.request(api.OrderCancel, {
+ orderId: orderInfo.id
+ }, 'POST').then(function(res) {
+ if (res.errno === 0) {
+ wx.showToast({
+ title: '取消订单成功'
+ });
+ util.redirect('/pages/ucenter/order/order');
+ } else {
+ util.showErrorToast(res.errmsg);
+ }
+ });
+ }
+ }
+ });
+ },
+ // “取消订单并退款”点击效果
+ refundOrder: function() {
+ let that = this;
+ let orderInfo = that.data.orderInfo;
+
+ wx.showModal({
+ title: '',
+ content: '确定要取消此订单?',
+ success: function(res) {
+ if (res.confirm) {
+ util.request(api.OrderRefund, {
+ orderId: orderInfo.id
+ }, 'POST').then(function(res) {
+ if (res.errno === 0) {
+ wx.showToast({
+ title: '取消订单成功'
+ });
+ util.redirect('/pages/ucenter/order/order');
+ } else {
+ util.showErrorToast(res.errmsg);
+ }
+ });
+ }
+ }
+ });
+ },
+ // “删除”点击效果
+ deleteOrder: function() {
+ let that = this;
+ let orderInfo = that.data.orderInfo;
+
+ wx.showModal({
+ title: '',
+ content: '确定要删除此订单?',
+ success: function(res) {
+ if (res.confirm) {
+ util.request(api.OrderDelete, {
+ orderId: orderInfo.id
+ }, 'POST').then(function(res) {
+ if (res.errno === 0) {
+ wx.showToast({
+ title: '删除订单成功'
+ });
+ util.redirect('/pages/ucenter/order/order');
+ } else {
+ util.showErrorToast(res.errmsg);
+ }
+ });
+ }
+ }
+ });
+ },
+ // “确认收货”点击效果
+ confirmOrder: function() {
+ let that = this;
+ let orderInfo = that.data.orderInfo;
+
+ wx.showModal({
+ title: '',
+ content: '确认收货?',
+ success: function(res) {
+ if (res.confirm) {
+ util.request(api.OrderConfirm, {
+ orderId: orderInfo.id
+ }, 'POST').then(function(res) {
+ if (res.errno === 0) {
+ wx.showToast({
+ title: '确认收货成功!'
+ });
+ util.redirect('/pages/ucenter/order/order');
+ } else {
+ util.showErrorToast(res.errmsg);
+ }
+ });
+ }
+ }
+ });
+ },
+ onReady: function() {
+ // 页面渲染完成
+ },
+ onShow: function() {
+ // 页面显示
+ },
+ onHide: function() {
+ // 页面隐藏
+ },
+ onUnload: function() {
+ // 页面关闭
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/orderDetail/orderDetail.json b/wx-mini-program/pages/ucenter/orderDetail/orderDetail.json
new file mode 100644
index 0000000..1b623be
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/orderDetail/orderDetail.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "订单详情",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/orderDetail/orderDetail.wxml b/wx-mini-program/pages/ucenter/orderDetail/orderDetail.wxml
new file mode 100644
index 0000000..a6ec982
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/orderDetail/orderDetail.wxml
@@ -0,0 +1,71 @@
+
+
+
+ 订单编号:
+ {{orderInfo.orderSn}}
+
+
+ 下单时间:
+ {{orderInfo.addTime}}
+
+
+ 收货人:
+ {{orderInfo.consignee}} {{orderInfo.mobile}}
+
+ {{orderInfo.address}}
+
+
+
+
+
+ 商品信息
+ {{orderInfo.orderStatusText}}
+
+
+
+
+
+
+
+
+ {{item.goodsName}}
+
+
+ {{item.specifications}}
+ x{{item.number}}
+
+ ¥{{item.price}}
+
+ 去评价
+
+
+ 再次购买
+
+
+
+
+
+
+
+
+ 商品合计:
+ ¥{{orderInfo.goodsPrice}}
+
+
+ 运费:
+ ¥{{orderInfo.freightPrice}}
+
+
+ 优惠减免:
+ - ¥{{orderInfo.discountPrice}}
+
+
+
+ 实付:
+ ¥{{orderInfo.actualPrice}}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/orderDetail/orderDetail.wxss b/wx-mini-program/pages/ucenter/orderDetail/orderDetail.wxss
new file mode 100644
index 0000000..9549d2a
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/orderDetail/orderDetail.wxss
@@ -0,0 +1,337 @@
+page {
+ height: 100%;
+ width: 100%;
+ background: #f4f4f4;
+}
+
+.order-info {
+ padding-top: 25rpx;
+ background: #fff;
+ height: auto;
+ padding-left: 31.25rpx;
+ overflow: hidden;
+}
+
+.item-a {
+ padding-left: 31.25rpx;
+ height: 42.5rpx;
+ padding-bottom: 12.5rpx;
+ line-height: 30rpx;
+ font-size: 30rpx;
+ color: #666;
+}
+
+.item-b {
+ padding-left: 31.25rpx;
+ height: 29rpx;
+ line-height: 29rpx;
+ margin-top: 12.5rpx;
+ margin-bottom: 41.5rpx;
+ font-size: 30rpx;
+ color: #666;
+}
+
+.item-c {
+ margin-left: 31.25rpx;
+ border-top: 1px solid #f4f4f4;
+ height: 103rpx;
+ line-height: 103rpx;
+}
+
+.item-c .l {
+ float: left;
+}
+
+.item-c .r {
+ height: 103rpx;
+ float: right;
+ display: flex;
+ align-items: center;
+ padding-right: 16rpx;
+}
+
+.item-c .r .btn {
+ float: right;
+}
+
+.item-c .cost {
+ color: #b4282d;
+}
+
+.item-c .btn {
+ line-height: 66rpx;
+ border-radius: 5rpx;
+ text-align: center;
+ margin: 0 15rpx;
+ padding: 0 20rpx;
+ height: 66rpx;
+}
+
+.item-c .btn.active {
+ background: #b4282d;
+ color: #fff;
+}
+
+.order-goods {
+ margin-top: 20rpx;
+ background: #fff;
+}
+
+.order-goods .h {
+ height: 93.75rpx;
+ line-height: 93.75rpx;
+ margin-left: 31.25rpx;
+ border-bottom: 1px solid #f4f4f4;
+ padding-right: 31.25rpx;
+}
+
+.order-goods .h .label {
+ float: left;
+ font-size: 30rpx;
+ color: #333;
+}
+
+.order-goods .h .status {
+ float: right;
+ font-size: 30rpx;
+ color: #b4282d;
+}
+
+.order-goods .item {
+ display: flex;
+ align-items: top;
+ height: 202rpx;
+ margin-left: 31.25rpx;
+ margin-bottom: 15.25rpx;
+ padding-right: 31.25rpx;
+ border-bottom: 1px solid #f4f4f4;
+}
+
+.order-goods .item:last-child {
+ border-bottom: none;
+}
+
+.order-goods .item .img {
+ height: 145.83rpx;
+ margin-top: 15.5rpx;
+ width: 145.83rpx;
+ background: #f4f4f4;
+}
+
+.order-goods .item .img image {
+ height: 145.83rpx;
+ width: 145.83rpx;
+}
+
+.order-goods .item .info {
+ flex: 1;
+ height: 145.83rpx;
+ margin-left: 20rpx;
+}
+
+.order-goods .item .t {
+ margin-top: 14rpx;
+ height: 45rpx;
+ line-height: 45rpx;
+ margin-bottom: 8.5rpx;
+}
+
+.order-goods .item .t .name {
+ display: block;
+ float: left;
+ height: 33rpx;
+ line-height: 33rpx;
+ color: #333;
+ font-size: 30rpx;
+}
+
+.order-goods .item .t .number {
+ display: block;
+ float: right;
+ height: 29rpx;
+ text-align: right;
+ line-height: 29rpx;
+ color: #333;
+ font-size: 30rpx;
+}
+
+.order-goods .item .attr {
+ height: 29rpx;
+ line-height: 29rpx;
+ color: #666;
+ margin-bottom: 25rpx;
+ font-size: 25rpx;
+}
+
+.order-goods .item .price {
+ display: block;
+ float: left;
+ height: 30rpx;
+ line-height: 30rpx;
+ color: #333;
+ font-size: 30rpx;
+}
+
+.order-goods .item .btn {
+ height: 50rpx;
+ line-height: 50rpx;
+ border-radius: 40rpx;
+ text-align: center;
+ display: block;
+ float: right;
+ margin: 0 15rpx;
+ padding: 0 20rpx;
+}
+
+.order-goods .item .btn.active {
+ background: #ee9e09;
+ color: #fff;
+ border-radius: 40rpx;
+}
+
+.order-bottom {
+ margin-top: 20rpx;
+ padding-left: 31.25rpx;
+ height: auto;
+ overflow: hidden;
+ background: #fff;
+}
+
+.order-info .address {
+ height: 128rpx;
+ padding-top: 25rpx;
+}
+
+.order-info .t {
+ height: 60rpx;
+ line-height: 55rpx;
+ margin-bottom: 7.5rpx;
+}
+
+.order-info .lable {
+ display: inline-block;
+ height: 35rpx;
+ width: 220rpx;
+ line-height: 35rpx;
+ font-size: 30rpx;
+}
+
+.order-info .value {
+ display: inline-block;
+ height: 35rpx;
+ line-height: 35rpx;
+ font-size: 30rpx;
+ color: #999;
+}
+
+.order-info .b {
+ height: 50rpx;
+ line-height: 40rpx;
+ font-size: 30rpx;
+ color: #999;
+ padding-right: 10rpx;
+ margin-bottom: 40rpx;
+}
+
+.order-bottom .total {
+ height: 136rpx;
+ padding-top: 20rpx;
+ border-bottom: 1px solid #f4f4f4;
+}
+
+.order-bottom .total .t {
+ height: 30rpx;
+ line-height: 30rpx;
+ margin-bottom: 7.5rpx;
+}
+
+.order-bottom .total .label {
+ width: 250rpx;
+ height: 35rpx;
+ color: #999;
+ line-height: 35rpx;
+ font-size: 30rpx;
+ float: left;
+}
+
+.order-bottom .total .txt {
+ height: 35rpx;
+ float: right;
+ padding-right: 31.25rpx;
+ line-height: 35rpx;
+ font-size: 30rpx;
+}
+
+.order-bottom .pay-fee {
+ height: 81rpx;
+ line-height: 81rpx;
+}
+
+.order-bottom .pay-fee .label {
+ width: 250rpx;
+ color: #333;
+ font-weight: bold;
+ float: left;
+}
+
+.order-bottom .pay-fee .txt {
+ float: right;
+ padding-right: 31.25rpx;
+ color: #b4282d;
+}
+
+.order-express {
+ margin-top: 20rpx;
+ width: 100%;
+ height: 100rpx;
+ background: #fff;
+}
+
+.order-express .title {
+ float: left;
+ margin-bottom: 20rpx;
+ padding: 20rpx;
+}
+
+.order-express .ti {
+ float: right;
+ width: 52rpx;
+ height: 52rpx;
+ margin-right: 16rpx;
+ margin-top: 28rpx;
+}
+
+.order-express .t {
+ font-size: 29rpx;
+ margin-left: 10.25rpx;
+ color: #a78845;
+}
+
+.order-express .b {
+ font-size: 29rpx;
+ margin-left: 10.25rpx;
+ color: #a78845;
+}
+
+.order-express .traces {
+ padding: 17.5rpx;
+ background: #fff;
+ border-bottom: 1rpx solid #f1e6cdcc;
+}
+
+.order-express .trace {
+ padding-bottom: 17.5rpx;
+ padding-top: 17.5rpx;
+ background: #fff;
+}
+
+.order-express .acceptTime {
+ margin-top: 20rpx;
+ margin-right: 40rpx;
+ text-align: right;
+ font-size: 26rpx;
+}
+
+.order-express .acceptStation {
+ font-size: 26rpx;
+}
diff --git a/wx-mini-program/pages/ucenter/user/user.js b/wx-mini-program/pages/ucenter/user/user.js
new file mode 100644
index 0000000..1469959
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/user/user.js
@@ -0,0 +1,85 @@
+var util = require('../../../utils/util.js');
+var api = require('../../../config/api.js');
+var user = require('../../../utils/user.js');
+var app = getApp();
+Page({
+
+ /**
+ * 页面的初始数据
+ */
+ data: {
+ userInfo:{},
+ hasLogin: false
+ },
+
+ /**
+ * 生命周期函数--监听页面加载
+ */
+ onLoad: function (options) {
+
+ },
+ onShow: function() {
+ //获取用户的登录信息
+ let userInfo = wx.getStorageSync('userInfo');
+ this.setData({
+ userInfo: userInfo,
+ hasLogin: true
+ });
+ },
+ getPhoneNumber:function(e) {
+ let that = this;
+ if (e.detail.errMsg !== "getPhoneNumber:ok") {
+ // 拒绝授权
+ return;
+ }
+
+ if (!this.data.hasLogin) {
+ wx.showToast({
+ title: '绑定失败:请先登录',
+ icon: 'none',
+ duration: 2000
+ });
+ return;
+ }
+
+ util.request(api.AuthBindPhone, {
+ iv: e.detail.iv,
+ encryptedData: e.detail.encryptedData
+ }, 'POST').then(function(res) {
+ if (res.errno === 0) {
+ let userInfo = wx.getStorageSync('userInfo');
+ userInfo.phone = res.data.phone;//设置手机号码
+ wx.setStorageSync('userInfo', userInfo);
+ that.setData({
+ userInfo: userInfo,
+ hasLogin: true
+ });
+ wx.showToast({
+ title: '绑定手机号码成功',
+ icon: 'success',
+ duration: 2000
+ });
+ }
+ });
+ },
+ exitLogin: function() {
+ wx.showModal({
+ title: '',
+ confirmColor: '#b4282d',
+ content: '退出登录?',
+ success: function(res) {
+ if (!res.confirm) {
+ return;
+ }
+
+ util.request(api.AuthLogout, {}, 'POST');
+ app.globalData.hasLogin = false;
+ wx.removeStorageSync('token');
+ wx.removeStorageSync('userInfo');
+ wx.reLaunch({
+ url: '/pages/index/index'
+ });
+ }
+ })
+ }
+})
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/user/user.json b/wx-mini-program/pages/ucenter/user/user.json
new file mode 100644
index 0000000..7284719
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/user/user.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "我的设置",
+ "enablePullDownRefresh": false
+}
\ No newline at end of file
diff --git a/wx-mini-program/pages/ucenter/user/user.wxml b/wx-mini-program/pages/ucenter/user/user.wxml
new file mode 100644
index 0000000..4017d7c
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/user/user.wxml
@@ -0,0 +1,33 @@
+
+
diff --git a/wx-mini-program/pages/ucenter/user/user.wxss b/wx-mini-program/pages/ucenter/user/user.wxss
new file mode 100644
index 0000000..b0cbf4f
--- /dev/null
+++ b/wx-mini-program/pages/ucenter/user/user.wxss
@@ -0,0 +1,9 @@
+.personal-data .list{margin-top:15rpx;background-color:#fff;}
+.personal-data .list .item{padding:30rpx 30rpx 30rpx 0;border-bottom:1rpx solid #f2f2f2;margin-left:30rpx;font-size:32rpx;color:#282828;}
+.personal-data .list .item .phone{background-color:#85c43f;width:160rpx;height:56rpx;font-size:24rpx;color:#fff;line-height:56rpx;border-radius: 32rpx}
+.personal-data .list .item .pictrue{width:88rpx;height:88rpx;}
+.personal-data .list .item .pictrue image{width:100%;height:100%;border-radius:50%;}
+.personal-data .list .item .input{width:415rpx;text-align:right;color:#868686;}
+.personal-data .list .item .input .id{width:365rpx;}
+.personal-data .list .item .input .iconfont{font-size:35rpx;}
+.personal-data .modifyBnt{background-color:#85c43f;font-size:32rpx;color:#fff;width:690rpx;height:90rpx;border-radius:50rpx;text-align:center;line-height:90rpx;margin:76rpx auto 0 auto;}
\ No newline at end of file
diff --git a/wx-mini-program/project.config.json b/wx-mini-program/project.config.json
new file mode 100644
index 0000000..65940ce
--- /dev/null
+++ b/wx-mini-program/project.config.json
@@ -0,0 +1,276 @@
+{
+ "description": "项目配置文件。",
+ "setting": {
+ "urlCheck": true,
+ "es6": true,
+ "postcss": true,
+ "minified": true,
+ "newFeature": true,
+ "autoAudits": false,
+ "uglifyFileName": true,
+ "checkInvalidKey": true,
+ "checkSiteMap": true,
+ "uploadWithSourceMap": true,
+ "babelSetting": {
+ "ignore": [],
+ "disablePlugins": [],
+ "outputPath": ""
+ }
+ },
+ "compileType": "miniprogram",
+ "libVersion": "2.0.4",
+ "appid": "wx4901b319ace4f88a",
+ "projectname": "dts-shop",
+ "simulatorType": "wechat",
+ "simulatorPluginLibVersion": {},
+ "condition": {
+ "search": {
+ "current": -1,
+ "list": []
+ },
+ "conversation": {
+ "current": -1,
+ "list": []
+ },
+ "plugin": {
+ "current": -1,
+ "list": []
+ },
+ "game": {
+ "list": []
+ },
+ "miniprogram": {
+ "current": 22,
+ "list": [
+ {
+ "id": -1,
+ "name": "首页",
+ "pathName": "pages/index/index",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "专题",
+ "pathName": "pages/topic/topic",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "专题详情",
+ "pathName": "pages/topicDetail/topicDetail",
+ "query": "id=314"
+ },
+ {
+ "id": -1,
+ "name": "专题评论列表",
+ "pathName": "pages/topicComment/topicComment",
+ "query": "valueId=314&type=1"
+ },
+ {
+ "id": -1,
+ "name": "专题评论添加",
+ "pathName": "pages/topicCommentPost/topicCommentPost",
+ "query": "valueId=314&type=1"
+ },
+ {
+ "id": -1,
+ "name": "品牌",
+ "pathName": "pages/brand/brand",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "品牌详情",
+ "pathName": "pages/brandDetail/brandDetail",
+ "query": "id=1001000"
+ },
+ {
+ "id": -1,
+ "name": "人气推荐",
+ "pathName": "pages/hotGoods/hotGoods",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "新品首发",
+ "pathName": "pages/newGoods/newGoods",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "分类",
+ "pathName": "pages/catalog/catalog",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "分类详情",
+ "pathName": "pages/category/category",
+ "query": "id=1008002"
+ },
+ {
+ "id": -1,
+ "name": "查找",
+ "pathName": "pages/search/search",
+ "query": ""
+ },
+ {
+ "id": 12,
+ "name": "商品",
+ "pathName": "pages/goods/goods",
+ "query": "id=1181003"
+ },
+ {
+ "id": -1,
+ "name": "商品评论列表",
+ "pathName": "pages/comment/comment",
+ "query": "valueId=1181000&type=0"
+ },
+ {
+ "id": -1,
+ "name": "购物车",
+ "pathName": "pages/cart/cart",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "下单",
+ "pathName": "pages/checkout/checkout",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "支付结果",
+ "pathName": "pages/payResult/payResult",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "我的",
+ "pathName": "pages/ucenter/index/index",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "我的订单列表",
+ "pathName": "pages/ucenter/order/order",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "我的订单详情",
+ "pathName": "pages/ucenter/orderDetail/orderDetail",
+ "query": "id=1"
+ },
+ {
+ "id": 22,
+ "name": "待评价的订单详情",
+ "pathName": "pages/ucenter/orderDetail/orderDetail",
+ "query": "id=1"
+ },
+ {
+ "id": -1,
+ "name": "购买商品评价",
+ "pathName": "pages/commentPost/commentPost",
+ "query": "orderId=2&type=0&valueId=1116011"
+ },
+ {
+ "id": 22,
+ "name": "我的优惠券",
+ "pathName": "pages/ucenter/couponList/couponList",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "我的收藏",
+ "pathName": "pages/ucenter/collect/collect",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "我的足迹",
+ "pathName": "pages/ucenter/footprint/footprint",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "我的地址",
+ "pathName": "pages/ucenter/address/address",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "我的地址添加",
+ "pathName": "pages/ucenter/addressAdd/addressAdd",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "登录",
+ "pathName": "pages/auth/login/login",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "账号登录",
+ "pathName": "pages/auth/accountLogin/accountLogin",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "注册",
+ "pathName": "pages/auth/register/register",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "找回密码",
+ "pathName": "pages/auth/reset/reset",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "关于",
+ "pathName": "pages/about/about",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "测试更新",
+ "pathName": "pages/index/index",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "意见反馈",
+ "pathName": "pages/ucenter/feedback/feedback",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "团购专区",
+ "pathName": "pages/groupon/grouponList/grouponList",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "选择优惠券",
+ "pathName": "pages/ucenter/couponSelect/couponSelect",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "我的优惠券列表",
+ "pathName": "pages/ucenter/couponList/couponList",
+ "query": ""
+ },
+ {
+ "id": -1,
+ "name": "优惠券列表",
+ "pathName": "pages/coupon/coupon",
+ "query": ""
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/wx-mini-program/sitemap.json b/wx-mini-program/sitemap.json
new file mode 100644
index 0000000..ca02add
--- /dev/null
+++ b/wx-mini-program/sitemap.json
@@ -0,0 +1,7 @@
+{
+ "desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html",
+ "rules": [{
+ "action": "allow",
+ "page": "*"
+ }]
+}
\ No newline at end of file
diff --git a/wx-mini-program/static/css/animate.wxss b/wx-mini-program/static/css/animate.wxss
new file mode 100644
index 0000000..98f29c2
--- /dev/null
+++ b/wx-mini-program/static/css/animate.wxss
@@ -0,0 +1,3494 @@
+@charset "UTF-8";
+
+/*!
+ * animate.css -http://daneden.me/animate
+ * Version - 3.6.0
+ * Licensed under the MIT license - http://opensource.org/licenses/MIT
+ *
+ * Copyright (c) 2018 Daniel Eden
+ */
+
+.animated {
+ -webkit-animation-duration: 1s;
+ animation-duration: 1s;
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both;
+}
+
+.animated.infinite {
+ -webkit-animation-iteration-count: infinite;
+ animation-iteration-count: infinite;
+}
+
+@-webkit-keyframes bounce {
+ from,
+ 20%,
+ 53%,
+ 80%,
+ to {
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ 40%,
+ 43% {
+ -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+ animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+ -webkit-transform: translate3d(0, -30px, 0);
+ transform: translate3d(0, -30px, 0);
+ }
+
+ 70% {
+ -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+ animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+ -webkit-transform: translate3d(0, -15px, 0);
+ transform: translate3d(0, -15px, 0);
+ }
+
+ 90% {
+ -webkit-transform: translate3d(0, -4px, 0);
+ transform: translate3d(0, -4px, 0);
+ }
+}
+
+@keyframes bounce {
+ from,
+ 20%,
+ 53%,
+ 80%,
+ to {
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ 40%,
+ 43% {
+ -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+ animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+ -webkit-transform: translate3d(0, -30px, 0);
+ transform: translate3d(0, -30px, 0);
+ }
+
+ 70% {
+ -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+ animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+ -webkit-transform: translate3d(0, -15px, 0);
+ transform: translate3d(0, -15px, 0);
+ }
+
+ 90% {
+ -webkit-transform: translate3d(0, -4px, 0);
+ transform: translate3d(0, -4px, 0);
+ }
+}
+
+.bounce {
+ -webkit-animation-name: bounce;
+ animation-name: bounce;
+ -webkit-transform-origin: center bottom;
+ transform-origin: center bottom;
+}
+
+@-webkit-keyframes flash {
+ from,
+ 50%,
+ to {
+ opacity: 1;
+ }
+
+ 25%,
+ 75% {
+ opacity: 0;
+ }
+}
+
+@keyframes flash {
+ from,
+ 50%,
+ to {
+ opacity: 1;
+ }
+
+ 25%,
+ 75% {
+ opacity: 0;
+ }
+}
+
+.flash {
+ -webkit-animation-name: flash;
+ animation-name: flash;
+}
+
+/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
+
+@-webkit-keyframes pulse {
+ from {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+
+ 50% {
+ -webkit-transform: scale3d(1.05, 1.05, 1.05);
+ transform: scale3d(1.05, 1.05, 1.05);
+ }
+
+ to {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+}
+
+@keyframes pulse {
+ from {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+
+ 50% {
+ -webkit-transform: scale3d(1.05, 1.05, 1.05);
+ transform: scale3d(1.05, 1.05, 1.05);
+ }
+
+ to {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+}
+
+.pulse {
+ -webkit-animation-name: pulse;
+ animation-name: pulse;
+}
+
+@-webkit-keyframes rubberBand {
+ from {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+
+ 30% {
+ -webkit-transform: scale3d(1.25, 0.75, 1);
+ transform: scale3d(1.25, 0.75, 1);
+ }
+
+ 40% {
+ -webkit-transform: scale3d(0.75, 1.25, 1);
+ transform: scale3d(0.75, 1.25, 1);
+ }
+
+ 50% {
+ -webkit-transform: scale3d(1.15, 0.85, 1);
+ transform: scale3d(1.15, 0.85, 1);
+ }
+
+ 65% {
+ -webkit-transform: scale3d(0.95, 1.05, 1);
+ transform: scale3d(0.95, 1.05, 1);
+ }
+
+ 75% {
+ -webkit-transform: scale3d(1.05, 0.95, 1);
+ transform: scale3d(1.05, 0.95, 1);
+ }
+
+ to {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+}
+
+@keyframes rubberBand {
+ from {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+
+ 30% {
+ -webkit-transform: scale3d(1.25, 0.75, 1);
+ transform: scale3d(1.25, 0.75, 1);
+ }
+
+ 40% {
+ -webkit-transform: scale3d(0.75, 1.25, 1);
+ transform: scale3d(0.75, 1.25, 1);
+ }
+
+ 50% {
+ -webkit-transform: scale3d(1.15, 0.85, 1);
+ transform: scale3d(1.15, 0.85, 1);
+ }
+
+ 65% {
+ -webkit-transform: scale3d(0.95, 1.05, 1);
+ transform: scale3d(0.95, 1.05, 1);
+ }
+
+ 75% {
+ -webkit-transform: scale3d(1.05, 0.95, 1);
+ transform: scale3d(1.05, 0.95, 1);
+ }
+
+ to {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+}
+
+.rubberBand {
+ -webkit-animation-name: rubberBand;
+ animation-name: rubberBand;
+}
+
+@-webkit-keyframes shake {
+ from,
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ 10%,
+ 30%,
+ 50%,
+ 70%,
+ 90% {
+ -webkit-transform: translate3d(-10px, 0, 0);
+ transform: translate3d(-10px, 0, 0);
+ }
+
+ 20%,
+ 40%,
+ 60%,
+ 80% {
+ -webkit-transform: translate3d(10px, 0, 0);
+ transform: translate3d(10px, 0, 0);
+ }
+}
+
+@keyframes shake {
+ from,
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ 10%,
+ 30%,
+ 50%,
+ 70%,
+ 90% {
+ -webkit-transform: translate3d(-10px, 0, 0);
+ transform: translate3d(-10px, 0, 0);
+ }
+
+ 20%,
+ 40%,
+ 60%,
+ 80% {
+ -webkit-transform: translate3d(10px, 0, 0);
+ transform: translate3d(10px, 0, 0);
+ }
+}
+
+.shake {
+ -webkit-animation-name: shake;
+ animation-name: shake;
+}
+
+@-webkit-keyframes headShake {
+ 0% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+
+ 6.5% {
+ -webkit-transform: translateX(-6px) rotateY(-9deg);
+ transform: translateX(-6px) rotateY(-9deg);
+ }
+
+ 18.5% {
+ -webkit-transform: translateX(5px) rotateY(7deg);
+ transform: translateX(5px) rotateY(7deg);
+ }
+
+ 31.5% {
+ -webkit-transform: translateX(-3px) rotateY(-5deg);
+ transform: translateX(-3px) rotateY(-5deg);
+ }
+
+ 43.5% {
+ -webkit-transform: translateX(2px) rotateY(3deg);
+ transform: translateX(2px) rotateY(3deg);
+ }
+
+ 50% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+
+@keyframes headShake {
+ 0% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+
+ 6.5% {
+ -webkit-transform: translateX(-6px) rotateY(-9deg);
+ transform: translateX(-6px) rotateY(-9deg);
+ }
+
+ 18.5% {
+ -webkit-transform: translateX(5px) rotateY(7deg);
+ transform: translateX(5px) rotateY(7deg);
+ }
+
+ 31.5% {
+ -webkit-transform: translateX(-3px) rotateY(-5deg);
+ transform: translateX(-3px) rotateY(-5deg);
+ }
+
+ 43.5% {
+ -webkit-transform: translateX(2px) rotateY(3deg);
+ transform: translateX(2px) rotateY(3deg);
+ }
+
+ 50% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+
+.headShake {
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+ -webkit-animation-name: headShake;
+ animation-name: headShake;
+}
+
+@-webkit-keyframes swing {
+ 20% {
+ -webkit-transform: rotate3d(0, 0, 1, 15deg);
+ transform: rotate3d(0, 0, 1, 15deg);
+ }
+
+ 40% {
+ -webkit-transform: rotate3d(0, 0, 1, -10deg);
+ transform: rotate3d(0, 0, 1, -10deg);
+ }
+
+ 60% {
+ -webkit-transform: rotate3d(0, 0, 1, 5deg);
+ transform: rotate3d(0, 0, 1, 5deg);
+ }
+
+ 80% {
+ -webkit-transform: rotate3d(0, 0, 1, -5deg);
+ transform: rotate3d(0, 0, 1, -5deg);
+ }
+
+ to {
+ -webkit-transform: rotate3d(0, 0, 1, 0deg);
+ transform: rotate3d(0, 0, 1, 0deg);
+ }
+}
+
+@keyframes swing {
+ 20% {
+ -webkit-transform: rotate3d(0, 0, 1, 15deg);
+ transform: rotate3d(0, 0, 1, 15deg);
+ }
+
+ 40% {
+ -webkit-transform: rotate3d(0, 0, 1, -10deg);
+ transform: rotate3d(0, 0, 1, -10deg);
+ }
+
+ 60% {
+ -webkit-transform: rotate3d(0, 0, 1, 5deg);
+ transform: rotate3d(0, 0, 1, 5deg);
+ }
+
+ 80% {
+ -webkit-transform: rotate3d(0, 0, 1, -5deg);
+ transform: rotate3d(0, 0, 1, -5deg);
+ }
+
+ to {
+ -webkit-transform: rotate3d(0, 0, 1, 0deg);
+ transform: rotate3d(0, 0, 1, 0deg);
+ }
+}
+
+.swing {
+ -webkit-transform-origin: top center;
+ transform-origin: top center;
+ -webkit-animation-name: swing;
+ animation-name: swing;
+}
+
+@-webkit-keyframes tada {
+ from {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+
+ 10%,
+ 20% {
+ -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);
+ transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);
+ }
+
+ 30%,
+ 50%,
+ 70%,
+ 90% {
+ -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);
+ transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);
+ }
+
+ 40%,
+ 60%,
+ 80% {
+ -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);
+ transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);
+ }
+
+ to {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+}
+
+@keyframes tada {
+ from {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+
+ 10%,
+ 20% {
+ -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);
+ transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);
+ }
+
+ 30%,
+ 50%,
+ 70%,
+ 90% {
+ -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);
+ transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);
+ }
+
+ 40%,
+ 60%,
+ 80% {
+ -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);
+ transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);
+ }
+
+ to {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+}
+
+.tada {
+ -webkit-animation-name: tada;
+ animation-name: tada;
+}
+
+/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
+
+@-webkit-keyframes wobble {
+ from {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ 15% {
+ -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
+ transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
+ }
+
+ 30% {
+ -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
+ transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
+ }
+
+ 45% {
+ -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
+ transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
+ }
+
+ 60% {
+ -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
+ transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
+ }
+
+ 75% {
+ -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
+ transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+@keyframes wobble {
+ from {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ 15% {
+ -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
+ transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
+ }
+
+ 30% {
+ -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
+ transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
+ }
+
+ 45% {
+ -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
+ transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
+ }
+
+ 60% {
+ -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
+ transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
+ }
+
+ 75% {
+ -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
+ transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+.wobble {
+ -webkit-animation-name: wobble;
+ animation-name: wobble;
+}
+
+@-webkit-keyframes jello {
+ from,
+ 11.1%,
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ 22.2% {
+ -webkit-transform: skewX(-12.5deg) skewY(-12.5deg);
+ transform: skewX(-12.5deg) skewY(-12.5deg);
+ }
+
+ 33.3% {
+ -webkit-transform: skewX(6.25deg) skewY(6.25deg);
+ transform: skewX(6.25deg) skewY(6.25deg);
+ }
+
+ 44.4% {
+ -webkit-transform: skewX(-3.125deg) skewY(-3.125deg);
+ transform: skewX(-3.125deg) skewY(-3.125deg);
+ }
+
+ 55.5% {
+ -webkit-transform: skewX(1.5625deg) skewY(1.5625deg);
+ transform: skewX(1.5625deg) skewY(1.5625deg);
+ }
+
+ 66.6% {
+ -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg);
+ transform: skewX(-0.78125deg) skewY(-0.78125deg);
+ }
+
+ 77.7% {
+ -webkit-transform: skewX(0.390625deg) skewY(0.390625deg);
+ transform: skewX(0.390625deg) skewY(0.390625deg);
+ }
+
+ 88.8% {
+ -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg);
+ transform: skewX(-0.1953125deg) skewY(-0.1953125deg);
+ }
+}
+
+@keyframes jello {
+ from,
+ 11.1%,
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ 22.2% {
+ -webkit-transform: skewX(-12.5deg) skewY(-12.5deg);
+ transform: skewX(-12.5deg) skewY(-12.5deg);
+ }
+
+ 33.3% {
+ -webkit-transform: skewX(6.25deg) skewY(6.25deg);
+ transform: skewX(6.25deg) skewY(6.25deg);
+ }
+
+ 44.4% {
+ -webkit-transform: skewX(-3.125deg) skewY(-3.125deg);
+ transform: skewX(-3.125deg) skewY(-3.125deg);
+ }
+
+ 55.5% {
+ -webkit-transform: skewX(1.5625deg) skewY(1.5625deg);
+ transform: skewX(1.5625deg) skewY(1.5625deg);
+ }
+
+ 66.6% {
+ -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg);
+ transform: skewX(-0.78125deg) skewY(-0.78125deg);
+ }
+
+ 77.7% {
+ -webkit-transform: skewX(0.390625deg) skewY(0.390625deg);
+ transform: skewX(0.390625deg) skewY(0.390625deg);
+ }
+
+ 88.8% {
+ -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg);
+ transform: skewX(-0.1953125deg) skewY(-0.1953125deg);
+ }
+}
+
+.jello {
+ -webkit-animation-name: jello;
+ animation-name: jello;
+ -webkit-transform-origin: center;
+ transform-origin: center;
+}
+
+@-webkit-keyframes bounceIn {
+ from,
+ 20%,
+ 40%,
+ 60%,
+ 80%,
+ to {
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ }
+
+ 0% {
+ opacity: 0;
+ -webkit-transform: scale3d(0.3, 0.3, 0.3);
+ transform: scale3d(0.3, 0.3, 0.3);
+ }
+
+ 20% {
+ -webkit-transform: scale3d(1.1, 1.1, 1.1);
+ transform: scale3d(1.1, 1.1, 1.1);
+ }
+
+ 40% {
+ -webkit-transform: scale3d(0.9, 0.9, 0.9);
+ transform: scale3d(0.9, 0.9, 0.9);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(1.03, 1.03, 1.03);
+ transform: scale3d(1.03, 1.03, 1.03);
+ }
+
+ 80% {
+ -webkit-transform: scale3d(0.97, 0.97, 0.97);
+ transform: scale3d(0.97, 0.97, 0.97);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+}
+
+@keyframes bounceIn {
+ from,
+ 20%,
+ 40%,
+ 60%,
+ 80%,
+ to {
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ }
+
+ 0% {
+ opacity: 0;
+ -webkit-transform: scale3d(0.3, 0.3, 0.3);
+ transform: scale3d(0.3, 0.3, 0.3);
+ }
+
+ 20% {
+ -webkit-transform: scale3d(1.1, 1.1, 1.1);
+ transform: scale3d(1.1, 1.1, 1.1);
+ }
+
+ 40% {
+ -webkit-transform: scale3d(0.9, 0.9, 0.9);
+ transform: scale3d(0.9, 0.9, 0.9);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(1.03, 1.03, 1.03);
+ transform: scale3d(1.03, 1.03, 1.03);
+ }
+
+ 80% {
+ -webkit-transform: scale3d(0.97, 0.97, 0.97);
+ transform: scale3d(0.97, 0.97, 0.97);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+}
+
+.bounceIn {
+ -webkit-animation-duration: 0.75s;
+ animation-duration: 0.75s;
+ -webkit-animation-name: bounceIn;
+ animation-name: bounceIn;
+}
+
+@-webkit-keyframes bounceInDown {
+ from,
+ 60%,
+ 75%,
+ 90%,
+ to {
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ }
+
+ 0% {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -3000px, 0);
+ transform: translate3d(0, -3000px, 0);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 25px, 0);
+ transform: translate3d(0, 25px, 0);
+ }
+
+ 75% {
+ -webkit-transform: translate3d(0, -10px, 0);
+ transform: translate3d(0, -10px, 0);
+ }
+
+ 90% {
+ -webkit-transform: translate3d(0, 5px, 0);
+ transform: translate3d(0, 5px, 0);
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+@keyframes bounceInDown {
+ from,
+ 60%,
+ 75%,
+ 90%,
+ to {
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ }
+
+ 0% {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -3000px, 0);
+ transform: translate3d(0, -3000px, 0);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 25px, 0);
+ transform: translate3d(0, 25px, 0);
+ }
+
+ 75% {
+ -webkit-transform: translate3d(0, -10px, 0);
+ transform: translate3d(0, -10px, 0);
+ }
+
+ 90% {
+ -webkit-transform: translate3d(0, 5px, 0);
+ transform: translate3d(0, 5px, 0);
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+.bounceInDown {
+ -webkit-animation-name: bounceInDown;
+ animation-name: bounceInDown;
+}
+
+@-webkit-keyframes bounceInLeft {
+ from,
+ 60%,
+ 75%,
+ 90%,
+ to {
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ }
+
+ 0% {
+ opacity: 0;
+ -webkit-transform: translate3d(-3000px, 0, 0);
+ transform: translate3d(-3000px, 0, 0);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translate3d(25px, 0, 0);
+ transform: translate3d(25px, 0, 0);
+ }
+
+ 75% {
+ -webkit-transform: translate3d(-10px, 0, 0);
+ transform: translate3d(-10px, 0, 0);
+ }
+
+ 90% {
+ -webkit-transform: translate3d(5px, 0, 0);
+ transform: translate3d(5px, 0, 0);
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+@keyframes bounceInLeft {
+ from,
+ 60%,
+ 75%,
+ 90%,
+ to {
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ }
+
+ 0% {
+ opacity: 0;
+ -webkit-transform: translate3d(-3000px, 0, 0);
+ transform: translate3d(-3000px, 0, 0);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translate3d(25px, 0, 0);
+ transform: translate3d(25px, 0, 0);
+ }
+
+ 75% {
+ -webkit-transform: translate3d(-10px, 0, 0);
+ transform: translate3d(-10px, 0, 0);
+ }
+
+ 90% {
+ -webkit-transform: translate3d(5px, 0, 0);
+ transform: translate3d(5px, 0, 0);
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+.bounceInLeft {
+ -webkit-animation-name: bounceInLeft;
+ animation-name: bounceInLeft;
+}
+
+@-webkit-keyframes bounceInRight {
+ from,
+ 60%,
+ 75%,
+ 90%,
+ to {
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ }
+
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(3000px, 0, 0);
+ transform: translate3d(3000px, 0, 0);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translate3d(-25px, 0, 0);
+ transform: translate3d(-25px, 0, 0);
+ }
+
+ 75% {
+ -webkit-transform: translate3d(10px, 0, 0);
+ transform: translate3d(10px, 0, 0);
+ }
+
+ 90% {
+ -webkit-transform: translate3d(-5px, 0, 0);
+ transform: translate3d(-5px, 0, 0);
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+@keyframes bounceInRight {
+ from,
+ 60%,
+ 75%,
+ 90%,
+ to {
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ }
+
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(3000px, 0, 0);
+ transform: translate3d(3000px, 0, 0);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translate3d(-25px, 0, 0);
+ transform: translate3d(-25px, 0, 0);
+ }
+
+ 75% {
+ -webkit-transform: translate3d(10px, 0, 0);
+ transform: translate3d(10px, 0, 0);
+ }
+
+ 90% {
+ -webkit-transform: translate3d(-5px, 0, 0);
+ transform: translate3d(-5px, 0, 0);
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+.bounceInRight {
+ -webkit-animation-name: bounceInRight;
+ animation-name: bounceInRight;
+}
+
+@-webkit-keyframes bounceInUp {
+ from,
+ 60%,
+ 75%,
+ 90%,
+ to {
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ }
+
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 3000px, 0);
+ transform: translate3d(0, 3000px, 0);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translate3d(0, -20px, 0);
+ transform: translate3d(0, -20px, 0);
+ }
+
+ 75% {
+ -webkit-transform: translate3d(0, 10px, 0);
+ transform: translate3d(0, 10px, 0);
+ }
+
+ 90% {
+ -webkit-transform: translate3d(0, -5px, 0);
+ transform: translate3d(0, -5px, 0);
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+@keyframes bounceInUp {
+ from,
+ 60%,
+ 75%,
+ 90%,
+ to {
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ }
+
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 3000px, 0);
+ transform: translate3d(0, 3000px, 0);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translate3d(0, -20px, 0);
+ transform: translate3d(0, -20px, 0);
+ }
+
+ 75% {
+ -webkit-transform: translate3d(0, 10px, 0);
+ transform: translate3d(0, 10px, 0);
+ }
+
+ 90% {
+ -webkit-transform: translate3d(0, -5px, 0);
+ transform: translate3d(0, -5px, 0);
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+.bounceInUp {
+ -webkit-animation-name: bounceInUp;
+ animation-name: bounceInUp;
+}
+
+@-webkit-keyframes bounceOut {
+ 20% {
+ -webkit-transform: scale3d(0.9, 0.9, 0.9);
+ transform: scale3d(0.9, 0.9, 0.9);
+ }
+
+ 50%,
+ 55% {
+ opacity: 1;
+ -webkit-transform: scale3d(1.1, 1.1, 1.1);
+ transform: scale3d(1.1, 1.1, 1.1);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: scale3d(0.3, 0.3, 0.3);
+ transform: scale3d(0.3, 0.3, 0.3);
+ }
+}
+
+@keyframes bounceOut {
+ 20% {
+ -webkit-transform: scale3d(0.9, 0.9, 0.9);
+ transform: scale3d(0.9, 0.9, 0.9);
+ }
+
+ 50%,
+ 55% {
+ opacity: 1;
+ -webkit-transform: scale3d(1.1, 1.1, 1.1);
+ transform: scale3d(1.1, 1.1, 1.1);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: scale3d(0.3, 0.3, 0.3);
+ transform: scale3d(0.3, 0.3, 0.3);
+ }
+}
+
+.bounceOut {
+ -webkit-animation-duration: 0.75s;
+ animation-duration: 0.75s;
+ -webkit-animation-name: bounceOut;
+ animation-name: bounceOut;
+}
+
+@-webkit-keyframes bounceOutDown {
+ 20% {
+ -webkit-transform: translate3d(0, 10px, 0);
+ transform: translate3d(0, 10px, 0);
+ }
+
+ 40%,
+ 45% {
+ opacity: 1;
+ -webkit-transform: translate3d(0, -20px, 0);
+ transform: translate3d(0, -20px, 0);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 2000px, 0);
+ transform: translate3d(0, 2000px, 0);
+ }
+}
+
+@keyframes bounceOutDown {
+ 20% {
+ -webkit-transform: translate3d(0, 10px, 0);
+ transform: translate3d(0, 10px, 0);
+ }
+
+ 40%,
+ 45% {
+ opacity: 1;
+ -webkit-transform: translate3d(0, -20px, 0);
+ transform: translate3d(0, -20px, 0);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 2000px, 0);
+ transform: translate3d(0, 2000px, 0);
+ }
+}
+
+.bounceOutDown {
+ -webkit-animation-name: bounceOutDown;
+ animation-name: bounceOutDown;
+}
+
+@-webkit-keyframes bounceOutLeft {
+ 20% {
+ opacity: 1;
+ -webkit-transform: translate3d(20px, 0, 0);
+ transform: translate3d(20px, 0, 0);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(-2000px, 0, 0);
+ transform: translate3d(-2000px, 0, 0);
+ }
+}
+
+@keyframes bounceOutLeft {
+ 20% {
+ opacity: 1;
+ -webkit-transform: translate3d(20px, 0, 0);
+ transform: translate3d(20px, 0, 0);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(-2000px, 0, 0);
+ transform: translate3d(-2000px, 0, 0);
+ }
+}
+
+.bounceOutLeft {
+ -webkit-animation-name: bounceOutLeft;
+ animation-name: bounceOutLeft;
+}
+
+@-webkit-keyframes bounceOutRight {
+ 20% {
+ opacity: 1;
+ -webkit-transform: translate3d(-20px, 0, 0);
+ transform: translate3d(-20px, 0, 0);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(2000px, 0, 0);
+ transform: translate3d(2000px, 0, 0);
+ }
+}
+
+@keyframes bounceOutRight {
+ 20% {
+ opacity: 1;
+ -webkit-transform: translate3d(-20px, 0, 0);
+ transform: translate3d(-20px, 0, 0);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(2000px, 0, 0);
+ transform: translate3d(2000px, 0, 0);
+ }
+}
+
+.bounceOutRight {
+ -webkit-animation-name: bounceOutRight;
+ animation-name: bounceOutRight;
+}
+
+@-webkit-keyframes bounceOutUp {
+ 20% {
+ -webkit-transform: translate3d(0, -10px, 0);
+ transform: translate3d(0, -10px, 0);
+ }
+
+ 40%,
+ 45% {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 20px, 0);
+ transform: translate3d(0, 20px, 0);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -2000px, 0);
+ transform: translate3d(0, -2000px, 0);
+ }
+}
+
+@keyframes bounceOutUp {
+ 20% {
+ -webkit-transform: translate3d(0, -10px, 0);
+ transform: translate3d(0, -10px, 0);
+ }
+
+ 40%,
+ 45% {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 20px, 0);
+ transform: translate3d(0, 20px, 0);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -2000px, 0);
+ transform: translate3d(0, -2000px, 0);
+ }
+}
+
+.bounceOutUp {
+ -webkit-animation-name: bounceOutUp;
+ animation-name: bounceOutUp;
+}
+
+@-webkit-keyframes fadeIn {
+ from {
+ opacity: 0;
+ }
+
+ to {
+ opacity: 1;
+ }
+}
+
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ }
+
+ to {
+ opacity: 1;
+ }
+}
+
+.fadeIn {
+ -webkit-animation-name: fadeIn;
+ animation-name: fadeIn;
+}
+
+@-webkit-keyframes fadeInDown {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -100%, 0);
+ transform: translate3d(0, -100%, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+@keyframes fadeInDown {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -100%, 0);
+ transform: translate3d(0, -100%, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+.fadeInDown {
+ -webkit-animation-name: fadeInDown;
+ animation-name: fadeInDown;
+}
+
+@-webkit-keyframes fadeInDownBig {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -2000px, 0);
+ transform: translate3d(0, -2000px, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+@keyframes fadeInDownBig {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -2000px, 0);
+ transform: translate3d(0, -2000px, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+.fadeInDownBig {
+ -webkit-animation-name: fadeInDownBig;
+ animation-name: fadeInDownBig;
+}
+
+@-webkit-keyframes fadeInLeft {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+@keyframes fadeInLeft {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+.fadeInLeft {
+ -webkit-animation-name: fadeInLeft;
+ animation-name: fadeInLeft;
+}
+
+@-webkit-keyframes fadeInLeftBig {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(-2000px, 0, 0);
+ transform: translate3d(-2000px, 0, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+@keyframes fadeInLeftBig {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(-2000px, 0, 0);
+ transform: translate3d(-2000px, 0, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+.fadeInLeftBig {
+ -webkit-animation-name: fadeInLeftBig;
+ animation-name: fadeInLeftBig;
+}
+
+@-webkit-keyframes fadeInRight {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+@keyframes fadeInRight {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+.fadeInRight {
+ -webkit-animation-name: fadeInRight;
+ animation-name: fadeInRight;
+}
+
+@-webkit-keyframes fadeInRightBig {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(2000px, 0, 0);
+ transform: translate3d(2000px, 0, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+@keyframes fadeInRightBig {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(2000px, 0, 0);
+ transform: translate3d(2000px, 0, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+.fadeInRightBig {
+ -webkit-animation-name: fadeInRightBig;
+ animation-name: fadeInRightBig;
+}
+
+@-webkit-keyframes fadeInUp {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+@keyframes fadeInUp {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+.fadeInUp {
+ -webkit-animation-name: fadeInUp;
+ animation-name: fadeInUp;
+}
+
+@-webkit-keyframes fadeInUpBig {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 2000px, 0);
+ transform: translate3d(0, 2000px, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+@keyframes fadeInUpBig {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 2000px, 0);
+ transform: translate3d(0, 2000px, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+.fadeInUpBig {
+ -webkit-animation-name: fadeInUpBig;
+ animation-name: fadeInUpBig;
+}
+
+@-webkit-keyframes fadeOut {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ }
+}
+
+@keyframes fadeOut {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ }
+}
+
+.fadeOut {
+ -webkit-animation-name: fadeOut;
+ animation-name: fadeOut;
+}
+
+@-webkit-keyframes fadeOutDown {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ }
+}
+
+@keyframes fadeOutDown {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ }
+}
+
+.fadeOutDown {
+ -webkit-animation-name: fadeOutDown;
+ animation-name: fadeOutDown;
+}
+
+@-webkit-keyframes fadeOutDownBig {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 2000px, 0);
+ transform: translate3d(0, 2000px, 0);
+ }
+}
+
+@keyframes fadeOutDownBig {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 2000px, 0);
+ transform: translate3d(0, 2000px, 0);
+ }
+}
+
+.fadeOutDownBig {
+ -webkit-animation-name: fadeOutDownBig;
+ animation-name: fadeOutDownBig;
+}
+
+@-webkit-keyframes fadeOutLeft {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+ }
+}
+
+@keyframes fadeOutLeft {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+ }
+}
+
+.fadeOutLeft {
+ -webkit-animation-name: fadeOutLeft;
+ animation-name: fadeOutLeft;
+}
+
+@-webkit-keyframes fadeOutLeftBig {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(-2000px, 0, 0);
+ transform: translate3d(-2000px, 0, 0);
+ }
+}
+
+@keyframes fadeOutLeftBig {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(-2000px, 0, 0);
+ transform: translate3d(-2000px, 0, 0);
+ }
+}
+
+.fadeOutLeftBig {
+ -webkit-animation-name: fadeOutLeftBig;
+ animation-name: fadeOutLeftBig;
+}
+
+@-webkit-keyframes fadeOutRight {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+ }
+}
+
+@keyframes fadeOutRight {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+ }
+}
+
+.fadeOutRight {
+ -webkit-animation-name: fadeOutRight;
+ animation-name: fadeOutRight;
+}
+
+@-webkit-keyframes fadeOutRightBig {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(2000px, 0, 0);
+ transform: translate3d(2000px, 0, 0);
+ }
+}
+
+@keyframes fadeOutRightBig {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(2000px, 0, 0);
+ transform: translate3d(2000px, 0, 0);
+ }
+}
+
+.fadeOutRightBig {
+ -webkit-animation-name: fadeOutRightBig;
+ animation-name: fadeOutRightBig;
+}
+
+@-webkit-keyframes fadeOutUp {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -100%, 0);
+ transform: translate3d(0, -100%, 0);
+ }
+}
+
+@keyframes fadeOutUp {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -100%, 0);
+ transform: translate3d(0, -100%, 0);
+ }
+}
+
+.fadeOutUp {
+ -webkit-animation-name: fadeOutUp;
+ animation-name: fadeOutUp;
+}
+
+@-webkit-keyframes fadeOutUpBig {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -2000px, 0);
+ transform: translate3d(0, -2000px, 0);
+ }
+}
+
+@keyframes fadeOutUpBig {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -2000px, 0);
+ transform: translate3d(0, -2000px, 0);
+ }
+}
+
+.fadeOutUpBig {
+ -webkit-animation-name: fadeOutUpBig;
+ animation-name: fadeOutUpBig;
+}
+
+@-webkit-keyframes flip {
+ from {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, -360deg);
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+ }
+
+ 40% {
+ -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);
+ transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+ }
+
+ 50% {
+ -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);
+ transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+
+ 80% {
+ -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95);
+ transform: perspective(400px) scale3d(0.95, 0.95, 0.95);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+
+ to {
+ -webkit-transform: perspective(400px);
+ transform: perspective(400px);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+}
+
+@keyframes flip {
+ from {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, -360deg);
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+ }
+
+ 40% {
+ -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);
+ transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+ }
+
+ 50% {
+ -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);
+ transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+
+ 80% {
+ -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95);
+ transform: perspective(400px) scale3d(0.95, 0.95, 0.95);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+
+ to {
+ -webkit-transform: perspective(400px);
+ transform: perspective(400px);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+}
+
+.animated.flip {
+ -webkit-backface-visibility: visible;
+ backface-visibility: visible;
+ -webkit-animation-name: flip;
+ animation-name: flip;
+}
+
+@-webkit-keyframes flipInX {
+ from {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+ transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ opacity: 0;
+ }
+
+ 40% {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+ transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+
+ 60% {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
+ transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
+ opacity: 1;
+ }
+
+ 80% {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
+ transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
+ }
+
+ to {
+ -webkit-transform: perspective(400px);
+ transform: perspective(400px);
+ }
+}
+
+@keyframes flipInX {
+ from {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+ transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ opacity: 0;
+ }
+
+ 40% {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+ transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+
+ 60% {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
+ transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
+ opacity: 1;
+ }
+
+ 80% {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
+ transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
+ }
+
+ to {
+ -webkit-transform: perspective(400px);
+ transform: perspective(400px);
+ }
+}
+
+.flipInX {
+ -webkit-backface-visibility: visible !important;
+ backface-visibility: visible !important;
+ -webkit-animation-name: flipInX;
+ animation-name: flipInX;
+}
+
+@-webkit-keyframes flipInY {
+ from {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ opacity: 0;
+ }
+
+ 40% {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+
+ 60% {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
+ opacity: 1;
+ }
+
+ 80% {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
+ }
+
+ to {
+ -webkit-transform: perspective(400px);
+ transform: perspective(400px);
+ }
+}
+
+@keyframes flipInY {
+ from {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ opacity: 0;
+ }
+
+ 40% {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+
+ 60% {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
+ opacity: 1;
+ }
+
+ 80% {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
+ }
+
+ to {
+ -webkit-transform: perspective(400px);
+ transform: perspective(400px);
+ }
+}
+
+.flipInY {
+ -webkit-backface-visibility: visible !important;
+ backface-visibility: visible !important;
+ -webkit-animation-name: flipInY;
+ animation-name: flipInY;
+}
+
+@-webkit-keyframes flipOutX {
+ from {
+ -webkit-transform: perspective(400px);
+ transform: perspective(400px);
+ }
+
+ 30% {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+ transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+ transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+ opacity: 0;
+ }
+}
+
+@keyframes flipOutX {
+ from {
+ -webkit-transform: perspective(400px);
+ transform: perspective(400px);
+ }
+
+ 30% {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+ transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+ transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+ opacity: 0;
+ }
+}
+
+.flipOutX {
+ -webkit-animation-duration: 0.75s;
+ animation-duration: 0.75s;
+ -webkit-animation-name: flipOutX;
+ animation-name: flipOutX;
+ -webkit-backface-visibility: visible !important;
+ backface-visibility: visible !important;
+}
+
+@-webkit-keyframes flipOutY {
+ from {
+ -webkit-transform: perspective(400px);
+ transform: perspective(400px);
+ }
+
+ 30% {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, -15deg);
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
+ opacity: 0;
+ }
+}
+
+@keyframes flipOutY {
+ from {
+ -webkit-transform: perspective(400px);
+ transform: perspective(400px);
+ }
+
+ 30% {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, -15deg);
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
+ opacity: 0;
+ }
+}
+
+.flipOutY {
+ -webkit-animation-duration: 0.75s;
+ animation-duration: 0.75s;
+ -webkit-backface-visibility: visible !important;
+ backface-visibility: visible !important;
+ -webkit-animation-name: flipOutY;
+ animation-name: flipOutY;
+}
+
+@-webkit-keyframes lightSpeedIn {
+ from {
+ -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);
+ transform: translate3d(100%, 0, 0) skewX(-30deg);
+ opacity: 0;
+ }
+
+ 60% {
+ -webkit-transform: skewX(20deg);
+ transform: skewX(20deg);
+ opacity: 1;
+ }
+
+ 80% {
+ -webkit-transform: skewX(-5deg);
+ transform: skewX(-5deg);
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ opacity: 1;
+ }
+}
+
+@keyframes lightSpeedIn {
+ from {
+ -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);
+ transform: translate3d(100%, 0, 0) skewX(-30deg);
+ opacity: 0;
+ }
+
+ 60% {
+ -webkit-transform: skewX(20deg);
+ transform: skewX(20deg);
+ opacity: 1;
+ }
+
+ 80% {
+ -webkit-transform: skewX(-5deg);
+ transform: skewX(-5deg);
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ opacity: 1;
+ }
+}
+
+.lightSpeedIn {
+ -webkit-animation-name: lightSpeedIn;
+ animation-name: lightSpeedIn;
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+}
+
+@-webkit-keyframes lightSpeedOut {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);
+ transform: translate3d(100%, 0, 0) skewX(30deg);
+ opacity: 0;
+ }
+}
+
+@keyframes lightSpeedOut {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);
+ transform: translate3d(100%, 0, 0) skewX(30deg);
+ opacity: 0;
+ }
+}
+
+.lightSpeedOut {
+ -webkit-animation-name: lightSpeedOut;
+ animation-name: lightSpeedOut;
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+}
+
+@-webkit-keyframes rotateIn {
+ from {
+ -webkit-transform-origin: center;
+ transform-origin: center;
+ -webkit-transform: rotate3d(0, 0, 1, -200deg);
+ transform: rotate3d(0, 0, 1, -200deg);
+ opacity: 0;
+ }
+
+ to {
+ -webkit-transform-origin: center;
+ transform-origin: center;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ opacity: 1;
+ }
+}
+
+@keyframes rotateIn {
+ from {
+ -webkit-transform-origin: center;
+ transform-origin: center;
+ -webkit-transform: rotate3d(0, 0, 1, -200deg);
+ transform: rotate3d(0, 0, 1, -200deg);
+ opacity: 0;
+ }
+
+ to {
+ -webkit-transform-origin: center;
+ transform-origin: center;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ opacity: 1;
+ }
+}
+
+.rotateIn {
+ -webkit-animation-name: rotateIn;
+ animation-name: rotateIn;
+}
+
+@-webkit-keyframes rotateInDownLeft {
+ from {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate3d(0, 0, 1, -45deg);
+ transform: rotate3d(0, 0, 1, -45deg);
+ opacity: 0;
+ }
+
+ to {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ opacity: 1;
+ }
+}
+
+@keyframes rotateInDownLeft {
+ from {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate3d(0, 0, 1, -45deg);
+ transform: rotate3d(0, 0, 1, -45deg);
+ opacity: 0;
+ }
+
+ to {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ opacity: 1;
+ }
+}
+
+.rotateInDownLeft {
+ -webkit-animation-name: rotateInDownLeft;
+ animation-name: rotateInDownLeft;
+}
+
+@-webkit-keyframes rotateInDownRight {
+ from {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate3d(0, 0, 1, 45deg);
+ transform: rotate3d(0, 0, 1, 45deg);
+ opacity: 0;
+ }
+
+ to {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ opacity: 1;
+ }
+}
+
+@keyframes rotateInDownRight {
+ from {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate3d(0, 0, 1, 45deg);
+ transform: rotate3d(0, 0, 1, 45deg);
+ opacity: 0;
+ }
+
+ to {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ opacity: 1;
+ }
+}
+
+.rotateInDownRight {
+ -webkit-animation-name: rotateInDownRight;
+ animation-name: rotateInDownRight;
+}
+
+@-webkit-keyframes rotateInUpLeft {
+ from {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate3d(0, 0, 1, 45deg);
+ transform: rotate3d(0, 0, 1, 45deg);
+ opacity: 0;
+ }
+
+ to {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ opacity: 1;
+ }
+}
+
+@keyframes rotateInUpLeft {
+ from {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate3d(0, 0, 1, 45deg);
+ transform: rotate3d(0, 0, 1, 45deg);
+ opacity: 0;
+ }
+
+ to {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ opacity: 1;
+ }
+}
+
+.rotateInUpLeft {
+ -webkit-animation-name: rotateInUpLeft;
+ animation-name: rotateInUpLeft;
+}
+
+@-webkit-keyframes rotateInUpRight {
+ from {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate3d(0, 0, 1, -90deg);
+ transform: rotate3d(0, 0, 1, -90deg);
+ opacity: 0;
+ }
+
+ to {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ opacity: 1;
+ }
+}
+
+@keyframes rotateInUpRight {
+ from {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate3d(0, 0, 1, -90deg);
+ transform: rotate3d(0, 0, 1, -90deg);
+ opacity: 0;
+ }
+
+ to {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ opacity: 1;
+ }
+}
+
+.rotateInUpRight {
+ -webkit-animation-name: rotateInUpRight;
+ animation-name: rotateInUpRight;
+}
+
+@-webkit-keyframes rotateOut {
+ from {
+ -webkit-transform-origin: center;
+ transform-origin: center;
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform-origin: center;
+ transform-origin: center;
+ -webkit-transform: rotate3d(0, 0, 1, 200deg);
+ transform: rotate3d(0, 0, 1, 200deg);
+ opacity: 0;
+ }
+}
+
+@keyframes rotateOut {
+ from {
+ -webkit-transform-origin: center;
+ transform-origin: center;
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform-origin: center;
+ transform-origin: center;
+ -webkit-transform: rotate3d(0, 0, 1, 200deg);
+ transform: rotate3d(0, 0, 1, 200deg);
+ opacity: 0;
+ }
+}
+
+.rotateOut {
+ -webkit-animation-name: rotateOut;
+ animation-name: rotateOut;
+}
+
+@-webkit-keyframes rotateOutDownLeft {
+ from {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate3d(0, 0, 1, 45deg);
+ transform: rotate3d(0, 0, 1, 45deg);
+ opacity: 0;
+ }
+}
+
+@keyframes rotateOutDownLeft {
+ from {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate3d(0, 0, 1, 45deg);
+ transform: rotate3d(0, 0, 1, 45deg);
+ opacity: 0;
+ }
+}
+
+.rotateOutDownLeft {
+ -webkit-animation-name: rotateOutDownLeft;
+ animation-name: rotateOutDownLeft;
+}
+
+@-webkit-keyframes rotateOutDownRight {
+ from {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate3d(0, 0, 1, -45deg);
+ transform: rotate3d(0, 0, 1, -45deg);
+ opacity: 0;
+ }
+}
+
+@keyframes rotateOutDownRight {
+ from {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate3d(0, 0, 1, -45deg);
+ transform: rotate3d(0, 0, 1, -45deg);
+ opacity: 0;
+ }
+}
+
+.rotateOutDownRight {
+ -webkit-animation-name: rotateOutDownRight;
+ animation-name: rotateOutDownRight;
+}
+
+@-webkit-keyframes rotateOutUpLeft {
+ from {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate3d(0, 0, 1, -45deg);
+ transform: rotate3d(0, 0, 1, -45deg);
+ opacity: 0;
+ }
+}
+
+@keyframes rotateOutUpLeft {
+ from {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate3d(0, 0, 1, -45deg);
+ transform: rotate3d(0, 0, 1, -45deg);
+ opacity: 0;
+ }
+}
+
+.rotateOutUpLeft {
+ -webkit-animation-name: rotateOutUpLeft;
+ animation-name: rotateOutUpLeft;
+}
+
+@-webkit-keyframes rotateOutUpRight {
+ from {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate3d(0, 0, 1, 90deg);
+ transform: rotate3d(0, 0, 1, 90deg);
+ opacity: 0;
+ }
+}
+
+@keyframes rotateOutUpRight {
+ from {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate3d(0, 0, 1, 90deg);
+ transform: rotate3d(0, 0, 1, 90deg);
+ opacity: 0;
+ }
+}
+
+.rotateOutUpRight {
+ -webkit-animation-name: rotateOutUpRight;
+ animation-name: rotateOutUpRight;
+}
+
+@-webkit-keyframes hinge {
+ 0% {
+ -webkit-transform-origin: top left;
+ transform-origin: top left;
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+ }
+
+ 20%,
+ 60% {
+ -webkit-transform: rotate3d(0, 0, 1, 80deg);
+ transform: rotate3d(0, 0, 1, 80deg);
+ -webkit-transform-origin: top left;
+ transform-origin: top left;
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+ }
+
+ 40%,
+ 80% {
+ -webkit-transform: rotate3d(0, 0, 1, 60deg);
+ transform: rotate3d(0, 0, 1, 60deg);
+ -webkit-transform-origin: top left;
+ transform-origin: top left;
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 700px, 0);
+ transform: translate3d(0, 700px, 0);
+ opacity: 0;
+ }
+}
+
+@keyframes hinge {
+ 0% {
+ -webkit-transform-origin: top left;
+ transform-origin: top left;
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+ }
+
+ 20%,
+ 60% {
+ -webkit-transform: rotate3d(0, 0, 1, 80deg);
+ transform: rotate3d(0, 0, 1, 80deg);
+ -webkit-transform-origin: top left;
+ transform-origin: top left;
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+ }
+
+ 40%,
+ 80% {
+ -webkit-transform: rotate3d(0, 0, 1, 60deg);
+ transform: rotate3d(0, 0, 1, 60deg);
+ -webkit-transform-origin: top left;
+ transform-origin: top left;
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 700px, 0);
+ transform: translate3d(0, 700px, 0);
+ opacity: 0;
+ }
+}
+
+.hinge {
+ -webkit-animation-duration: 2s;
+ animation-duration: 2s;
+ -webkit-animation-name: hinge;
+ animation-name: hinge;
+}
+
+@-webkit-keyframes jackInTheBox {
+ from {
+ opacity: 0;
+ -webkit-transform: scale(0.1) rotate(30deg);
+ transform: scale(0.1) rotate(30deg);
+ -webkit-transform-origin: center bottom;
+ transform-origin: center bottom;
+ }
+
+ 50% {
+ -webkit-transform: rotate(-10deg);
+ transform: rotate(-10deg);
+ }
+
+ 70% {
+ -webkit-transform: rotate(3deg);
+ transform: rotate(3deg);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+}
+
+@keyframes jackInTheBox {
+ from {
+ opacity: 0;
+ -webkit-transform: scale(0.1) rotate(30deg);
+ transform: scale(0.1) rotate(30deg);
+ -webkit-transform-origin: center bottom;
+ transform-origin: center bottom;
+ }
+
+ 50% {
+ -webkit-transform: rotate(-10deg);
+ transform: rotate(-10deg);
+ }
+
+ 70% {
+ -webkit-transform: rotate(3deg);
+ transform: rotate(3deg);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+}
+
+.jackInTheBox {
+ -webkit-animation-name: jackInTheBox;
+ animation-name: jackInTheBox;
+}
+
+/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
+
+@-webkit-keyframes rollIn {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);
+ transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+@keyframes rollIn {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);
+ transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+.rollIn {
+ -webkit-animation-name: rollIn;
+ animation-name: rollIn;
+}
+
+/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
+
+@-webkit-keyframes rollOut {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);
+ transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);
+ }
+}
+
+@keyframes rollOut {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);
+ transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);
+ }
+}
+
+.rollOut {
+ -webkit-animation-name: rollOut;
+ animation-name: rollOut;
+}
+
+@-webkit-keyframes zoomIn {
+ from {
+ opacity: 0;
+ -webkit-transform: scale3d(0.3, 0.3, 0.3);
+ transform: scale3d(0.3, 0.3, 0.3);
+ }
+
+ 50% {
+ opacity: 1;
+ }
+}
+
+@keyframes zoomIn {
+ from {
+ opacity: 0;
+ -webkit-transform: scale3d(0.3, 0.3, 0.3);
+ transform: scale3d(0.3, 0.3, 0.3);
+ }
+
+ 50% {
+ opacity: 1;
+ }
+}
+
+.zoomIn {
+ -webkit-animation-name: zoomIn;
+ animation-name: zoomIn;
+}
+
+@-webkit-keyframes zoomInDown {
+ from {
+ opacity: 0;
+ -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);
+ transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+ animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);
+ transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);
+ }
+}
+
+@keyframes zoomInDown {
+ from {
+ opacity: 0;
+ -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);
+ transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+ animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);
+ transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);
+ }
+}
+
+.zoomInDown {
+ -webkit-animation-name: zoomInDown;
+ animation-name: zoomInDown;
+}
+
+@-webkit-keyframes zoomInLeft {
+ from {
+ opacity: 0;
+ -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);
+ transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+ animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);
+ transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);
+ }
+}
+
+@keyframes zoomInLeft {
+ from {
+ opacity: 0;
+ -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);
+ transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+ animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);
+ transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);
+ }
+}
+
+.zoomInLeft {
+ -webkit-animation-name: zoomInLeft;
+ animation-name: zoomInLeft;
+}
+
+@-webkit-keyframes zoomInRight {
+ from {
+ opacity: 0;
+ -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);
+ transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+ animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);
+ transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);
+ }
+}
+
+@keyframes zoomInRight {
+ from {
+ opacity: 0;
+ -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);
+ transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+ animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);
+ transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);
+ }
+}
+
+.zoomInRight {
+ -webkit-animation-name: zoomInRight;
+ animation-name: zoomInRight;
+}
+
+@-webkit-keyframes zoomInUp {
+ from {
+ opacity: 0;
+ -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);
+ transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+ animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);
+ transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);
+ }
+}
+
+@keyframes zoomInUp {
+ from {
+ opacity: 0;
+ -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);
+ transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+ animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);
+ transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);
+ }
+}
+
+.zoomInUp {
+ -webkit-animation-name: zoomInUp;
+ animation-name: zoomInUp;
+}
+
+@-webkit-keyframes zoomOut {
+ from {
+ opacity: 1;
+ }
+
+ 50% {
+ opacity: 0;
+ -webkit-transform: scale3d(0.3, 0.3, 0.3);
+ transform: scale3d(0.3, 0.3, 0.3);
+ }
+
+ to {
+ opacity: 0;
+ }
+}
+
+@keyframes zoomOut {
+ from {
+ opacity: 1;
+ }
+
+ 50% {
+ opacity: 0;
+ -webkit-transform: scale3d(0.3, 0.3, 0.3);
+ transform: scale3d(0.3, 0.3, 0.3);
+ }
+
+ to {
+ opacity: 0;
+ }
+}
+
+.zoomOut {
+ -webkit-animation-name: zoomOut;
+ animation-name: zoomOut;
+}
+
+@-webkit-keyframes zoomOutDown {
+ 40% {
+ opacity: 1;
+ -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);
+ transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+ animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);
+ transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);
+ -webkit-transform-origin: center bottom;
+ transform-origin: center bottom;
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);
+ }
+}
+
+@keyframes zoomOutDown {
+ 40% {
+ opacity: 1;
+ -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);
+ transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+ animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);
+ transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);
+ -webkit-transform-origin: center bottom;
+ transform-origin: center bottom;
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);
+ }
+}
+
+.zoomOutDown {
+ -webkit-animation-name: zoomOutDown;
+ animation-name: zoomOutDown;
+}
+
+@-webkit-keyframes zoomOutLeft {
+ 40% {
+ opacity: 1;
+ -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);
+ transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0);
+ transform: scale(0.1) translate3d(-2000px, 0, 0);
+ -webkit-transform-origin: left center;
+ transform-origin: left center;
+ }
+}
+
+@keyframes zoomOutLeft {
+ 40% {
+ opacity: 1;
+ -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);
+ transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0);
+ transform: scale(0.1) translate3d(-2000px, 0, 0);
+ -webkit-transform-origin: left center;
+ transform-origin: left center;
+ }
+}
+
+.zoomOutLeft {
+ -webkit-animation-name: zoomOutLeft;
+ animation-name: zoomOutLeft;
+}
+
+@-webkit-keyframes zoomOutRight {
+ 40% {
+ opacity: 1;
+ -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);
+ transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: scale(0.1) translate3d(2000px, 0, 0);
+ transform: scale(0.1) translate3d(2000px, 0, 0);
+ -webkit-transform-origin: right center;
+ transform-origin: right center;
+ }
+}
+
+@keyframes zoomOutRight {
+ 40% {
+ opacity: 1;
+ -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);
+ transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: scale(0.1) translate3d(2000px, 0, 0);
+ transform: scale(0.1) translate3d(2000px, 0, 0);
+ -webkit-transform-origin: right center;
+ transform-origin: right center;
+ }
+}
+
+.zoomOutRight {
+ -webkit-animation-name: zoomOutRight;
+ animation-name: zoomOutRight;
+}
+
+@-webkit-keyframes zoomOutUp {
+ 40% {
+ opacity: 1;
+ -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);
+ transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+ animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);
+ transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);
+ -webkit-transform-origin: center bottom;
+ transform-origin: center bottom;
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);
+ }
+}
+
+@keyframes zoomOutUp {
+ 40% {
+ opacity: 1;
+ -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);
+ transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+ animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);
+ transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);
+ -webkit-transform-origin: center bottom;
+ transform-origin: center bottom;
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);
+ }
+}
+
+.zoomOutUp {
+ -webkit-animation-name: zoomOutUp;
+ animation-name: zoomOutUp;
+}
+
+@-webkit-keyframes slideInDown {
+ from {
+ -webkit-transform: translate3d(0, -100%, 0);
+ transform: translate3d(0, -100%, 0);
+ visibility: visible;
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+@keyframes slideInDown {
+ from {
+ -webkit-transform: translate3d(0, -100%, 0);
+ transform: translate3d(0, -100%, 0);
+ visibility: visible;
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+.slideInDown {
+ -webkit-animation-name: slideInDown;
+ animation-name: slideInDown;
+}
+
+@-webkit-keyframes slideInLeft {
+ from {
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+ visibility: visible;
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+@keyframes slideInLeft {
+ from {
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+ visibility: visible;
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+.slideInLeft {
+ -webkit-animation-name: slideInLeft;
+ animation-name: slideInLeft;
+}
+
+@-webkit-keyframes slideInRight {
+ from {
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+ visibility: visible;
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+@keyframes slideInRight {
+ from {
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+ visibility: visible;
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+.slideInRight {
+ -webkit-animation-name: slideInRight;
+ animation-name: slideInRight;
+}
+
+@-webkit-keyframes slideInUp {
+ from {
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ visibility: visible;
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+@keyframes slideInUp {
+ from {
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ visibility: visible;
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+.slideInUp {
+ -webkit-animation-name: slideInUp;
+ animation-name: slideInUp;
+}
+
+@-webkit-keyframes slideOutDown {
+ from {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ to {
+ visibility: hidden;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ }
+}
+
+@keyframes slideOutDown {
+ from {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ to {
+ visibility: hidden;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ }
+}
+
+.slideOutDown {
+ -webkit-animation-name: slideOutDown;
+ animation-name: slideOutDown;
+}
+
+@-webkit-keyframes slideOutLeft {
+ from {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ to {
+ visibility: hidden;
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+ }
+}
+
+@keyframes slideOutLeft {
+ from {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ to {
+ visibility: hidden;
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+ }
+}
+
+.slideOutLeft {
+ -webkit-animation-name: slideOutLeft;
+ animation-name: slideOutLeft;
+}
+
+@-webkit-keyframes slideOutRight {
+ from {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ to {
+ visibility: hidden;
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+ }
+}
+
+@keyframes slideOutRight {
+ from {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ to {
+ visibility: hidden;
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+ }
+}
+
+.slideOutRight {
+ -webkit-animation-name: slideOutRight;
+ animation-name: slideOutRight;
+}
+
+@-webkit-keyframes slideOutUp {
+ from {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ to {
+ visibility: hidden;
+ -webkit-transform: translate3d(0, -100%, 0);
+ transform: translate3d(0, -100%, 0);
+ }
+}
+
+@keyframes slideOutUp {
+ from {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ to {
+ visibility: hidden;
+ -webkit-transform: translate3d(0, -100%, 0);
+ transform: translate3d(0, -100%, 0);
+ }
+}
+
+.slideOutUp {
+ -webkit-animation-name: slideOutUp;
+ animation-name: slideOutUp;
+}
diff --git a/wx-mini-program/static/css/guildford.wxss b/wx-mini-program/static/css/guildford.wxss
new file mode 100644
index 0000000..4b43b8b
--- /dev/null
+++ b/wx-mini-program/static/css/guildford.wxss
@@ -0,0 +1,16 @@
+@font-face {
+ font-family: 'Guildford Pro';
+ src: url('GuildfordPro.eot');
+ font-weight: normal;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'Guildford Pro';
+ src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'),
+ url(data:application/font-woff;charset=utf-8;base64,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) format('woff'),
+ url('GuildfordPro.ttf') format('truetype'),
+ url('GuildfordPro.svg#GuildfordPro') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+
diff --git a/wx-mini-program/static/css/style.wxss b/wx-mini-program/static/css/style.wxss
new file mode 100644
index 0000000..37278c1
--- /dev/null
+++ b/wx-mini-program/static/css/style.wxss
@@ -0,0 +1,121 @@
+.product-con .wrapper{background-color:#fff;}
+.product-con .wrapper .share{margin:0 30rpx;padding-top:25rpx;}
+.product-con .wrapper .share .money{font-size:28rpx;font-weight:bold;}
+.product-con .wrapper .share .money .num{font-size:48rpx;}
+.product-con .wrapper .share .money .vip-money{color:#282828;margin-left:13rpx;}
+.product-con .wrapper .share .money image{width:46rpx;height:21rpx;margin-left:7rpx;}
+.product-con .wrapper .share .money .vip-money{color:#282828;margin-left:13rpx;}
+.product-con .wrapper .share .iconfont{color:#515151;font-size:40rpx;margin-bottom:10rpx;
+}
+.product-con .wrapper .introduce{font-size:32rpx;font-weight:bold;margin:23rpx 30rpx 0 30rpx;}
+.product-con .wrapper .label{margin:0 30rpx;font-size:24rpx;color:#82848f;margin-top:22rpx;}
+.product-con .wrapper .coupon{padding:0 30rpx;border-top:1rpx solid #f5f5f5;margin-top:25rpx;height:80rpx;font-size:26rpx;color:#82848f;}
+.product-con .wrapper .coupon .hide{width:540rpx;height:80rpx;line-height:80rpx;}
+.product-con .wrapper .coupon .activity{height:40rpx;padding:0 20rpx;border:1rpx solid #f2857b;color:#e93323;font-size:24rpx;line-height:40rpx;position:relative;margin:19rpx 0 19rpx 15rpx;}
+.product-con .wrapper .coupon .activity:before {
+ content: ' ';
+ position: absolute;
+ width:7rpx;
+ height:10rpx;
+ border-radius:0 7rpx 7rpx 0;
+ border:1rpx solid #f2857b;
+ background-color:#fff;
+ bottom:50%;
+ left:-1rpx;
+ margin-bottom: -5rpx;
+ border-left-color:#fff;
+}
+.product-con .wrapper .coupon .activity:after {
+ content: ' ';
+ position: absolute;
+ width:7rpx;
+ height:10rpx;
+ border-radius:7rpx 0 0 7rpx;
+ border:1rpx solid #f2857b;
+ background-color:#fff;
+ right:-1rpx;
+ bottom:50%;
+ margin-bottom: -5rpx;
+ border-right-color:#fff;
+}
+.product-con .wrapper .coupon .iconfont{color:#7a7a7a;font-size:28rpx;}
+.product-con .attribute{background-color:#fff;padding:0 30rpx;font-size:26rpx;color:#82848f;margin-top:20rpx;height:80rpx;}
+.product-con .attribute .atterTxt{font-size:28rpx;color:#282828;}
+.product-con .attribute .iconfont{font-size:28rpx;color:#7a7a7a;}
+.product-con .userEvaluation{margin-top:20rpx;background-color:#fff;}
+.product-con .userEvaluation .title{height:86rpx;border-bottom:1rpx solid #eee;font-size:28rpx;color:#282828;margin-left:30rpx;padding-right:30rpx;}
+.product-con .userEvaluation .title .praise{font-size:28rpx;color:#808080;}
+.product-con .userEvaluation .title .praise .iconfont{color:#7a7a7a;font-size:28rpx;vertical-align:1rpx;margin-left:8rpx;}
+.product-con .product-intro{margin-top:20rpx;}
+.product-con .product-intro .title{font-size:30rpx;color:#282828;height:86rpx;width:100%;background-color:#fff;text-align:center;line-height:86rpx;}
+.product-con .product-intro .conter{width:100%;}
+.product-con .product-intro .conter image{width:100%!important;display:block!important;}
+.goodsStyle{margin-top:1rpx;background-color:#fff;padding:22rpx 30rpx;}
+.goodsStyle .pictrue{width:120rpx;height:120rpx;}
+.goodsStyle .pictrue image{width:100%;height:100%;border-radius:6rpx;}
+.goodsStyle .text{width:545rpx;font-size:28rpx;color:#999;}
+.goodsStyle .text .name{width:360rpx;color:#282828;}
+.goodsStyle .text .money{text-align:right;}
+.goodsStyle .text .money .num{margin-top:7rpx;}
+.goodWrapper .item{margin-left:30rpx;padding-right:30rpx;border-bottom:2rpx solid #f0f0f0;height:180rpx;}
+.goodWrapper .item .pictrue{width:130rpx;height:130rpx;}
+.goodWrapper .item .pictrue image{width:100%;height:100%;border-radius:6rpx;}
+.goodWrapper .item .text{width:537rpx;position:relative;}
+.goodWrapper .item .text .name{font-size:28rpx;color:#282828;width:453rpx;}
+.goodWrapper .item .text .num{font-size:26rpx;color:#868686;}
+.goodWrapper .item .text .attr{font-size:20rpx;color:#868686;margin-top:7rpx;}
+.goodWrapper .item .text .money{font-size:26rpx;margin-top:17rpx;}
+.goodWrapper .item .text .evaluate{position:absolute;width:114rpx;height:46rpx;border:1rpx solid #bbb;border-radius:4rpx;text-align:center;line-height:46rpx;right:0;bottom:-5rpx;}
+.goodWrapper .item .text .evaluate.userEvaluated{font-size:26rpx;color:#aaa;background-color:#f7f7f7;border-color:#f7f7f7;}
+.promoterHeader{width:100%;height:220rpx;}
+.promoterHeader .headerCon{width:100%;height:100%;padding:0 88rpx 0 55rpx;box-sizing:border-box;font-size:28rpx;color:#fff;background-image:url('data:image/png;base64,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');background-repeat:no-repeat;background-size:100% 100%;}
+.promoterHeader .headerCon .name{margin-bottom:10rpx;}
+.promoterHeader .headerCon .num{font-size:50rpx;}
+.promoterHeader .headerCon .iconfont{font-size:125rpx;}
+.sign-record .list .item .data{height:80rpx;line-height:80rpx;padding:0 30rpx;font-size:24rpx;color:#666;}
+.sign-record .list .item .listn{background-color:#fff;font-size:24rpx;color:#999;}
+.sign-record .list .item .listn .itemn{height:120rpx;border-bottom:1rpx solid #eee;padding-right:30rpx;margin-left:30rpx;}
+.sign-record .list .item .listn .itemn .name{width:390rpx;font-size:28rpx;color:#282828;margin-bottom:10rpx;}
+.sign-record .list .item .listn .itemn .num{font-size:36rpx;font-family: 'Guildford Pro';color:#16ac57;}
+.coupon-list{padding:0 30rpx;margin-top:25rpx;}
+.coupon-list .item{width:100%;height:170rpx;margin-bottom:16rpx;}
+.coupon-list .item .money{background-image:url('data:image/png;base64,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');background-repeat:no-repeat;background-size:100% 100%;width:240rpx;height:100%;color:#fff;font-size:36rpx;font-weight:bold;text-align:center;line-height:170rpx;}
+.coupon-list .item .money.moneyGray{background-image:url('data:image/png;base64,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');}
+.coupon-list .item .money .num{font-size:60rpx;}
+.coupon-list .item .text{width:450rpx;padding:0 17rpx 0 24rpx;box-sizing:border-box;background-color:#fff;}
+.coupon-list .item .text .condition{font-size:30rpx;color:#282828;height:93rpx;line-height:93rpx;border-bottom:1rpx solid #f0f0f0;}
+.coupon-list .item .text .data{font-size:20rpx;color:#999;height:76rpx;}
+.coupon-list .item .text .data .bnt{width:136rpx;height:44rpx;border-radius:22rpx;font-size:22rpx;text-align:center;line-height:44rpx;color:#fff;}
+.coupon-list .item .text .data .bnt.gray{background-color:#ccc;}
+.noCommodity{border-top:7rpx solid #f5f5f5;}
+.noCommodity .pictrue{width:414rpx;height:336rpx;margin:75rpx auto 30rpx auto;}
+.noCommodity .pictrue image{width:100%;height:100%;}
+
+/* 通用 字体大小 和 颜色 */
+/* 背景:搜索框 */
+.jhx_bg0{background: #fff;}
+.jhx_bg1{background: #eee;}
+/* 字体:搜索框 */
+.jhx_f1{color: #999;font-size: 30rpx;}
+/* 字体:一级菜单 分类tab二级菜单 */
+.jhx_f2{color: #333;font-size: 24rpx;}
+/* 字体:首页信息公告标题 */
+.jhx_f3{font-size:25rpx;color:#666;}
+/* 字体:分类栏主标题 */
+.jhx_f4{font-size:30rpx; color: #333;font-weight:bold;}
+/* 字体:分类栏副标题 商品描述 */
+.jhx_f5{font-size:24rpx;color:#999;}
+/* 字体:更多 */
+.jhx_f6{font-size:26rpx;color:#333;}
+/* 字体:首页商品名称 */
+.jhx_f7{font-size: 28rpx;color: #333;}
+/* 字体:现价 */
+.jhx_f8{font-size:33rpx; color: #ec4223;font-weight:bold;}
+/* 字体:原价 */
+.jhx_f9{font-size: 28rpx;color: #999;}
+/* 字体:商品详情页名称 */
+.jhx_f10{font-size: 33rpx;color: #666;}
+/* 字体:商品详情页商品描 */
+.jhx_f11{font-size: 30rpx;color: #999;}
+/* 字体:关于我们页面标题 */
+.jhx_f12{font-size:28rpx; color: #999;font-weight:bold;}
diff --git a/wx-mini-program/static/font/iconfont.wxss b/wx-mini-program/static/font/iconfont.wxss
new file mode 100644
index 0000000..f9a7efa
--- /dev/null
+++ b/wx-mini-program/static/font/iconfont.wxss
@@ -0,0 +1,463 @@
+@font-face {font-family: "iconfont";
+ src: url('iconfont.eot?t=1552643133379'); /* IE9 */
+ src: url('iconfont.eot?t=1552643133379#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url(data:application/font-woff;charset=utf-8;base64,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) format('woff'),
+ url('iconfont.ttf?t=1552643133379') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
+ url('iconfont.svg?t=1552643133379#iconfont') format('svg'); /* iOS 4.1- */
+}
+
+.iconfont {
+ font-family: "iconfont" !important;
+ font-size: 16px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-jingpintuijian:before {
+ content: "\e60d";
+}
+
+.icon-xiaolian:before {
+ content: "\e60f";
+}
+
+.icon-yuandianxiao:before {
+ content: "\e82f";
+}
+
+.icon-xiazai5:before {
+ content: "\e605";
+}
+
+.icon-icon34:before {
+ content: "\e62b";
+}
+
+.icon-webicon318:before {
+ content: "\e6c2";
+}
+
+.icon-iconfontguanbi:before {
+ content: "\e643";
+}
+
+.icon-icon25201:before {
+ content: "\e70d";
+}
+
+.icon-cuxiaoguanli:before {
+ content: "\e60e";
+}
+
+.icon-miaosha:before {
+ content: "\e6c3";
+}
+
+.icon-huiyuan:before {
+ content: "\e60b";
+}
+
+.icon-caigou-xianxing:before {
+ content: "\e887";
+}
+
+.icon-caigou:before {
+ content: "\e888";
+}
+
+.icon-yingyongchengxu-xianxing:before {
+ content: "\e8a1";
+}
+
+.icon-yingyongchengxu:before {
+ content: "\e8a2";
+}
+
+.icon-ziyuan-xianxing:before {
+ content: "\e8a4";
+}
+
+.icon-shouye:before {
+ content: "\e8b9";
+}
+
+.icon-shouye-xianxing:before {
+ content: "\e8ba";
+}
+
+.icon-yonghu-xianxing:before {
+ content: "\e8c8";
+}
+
+.icon-yonghu:before {
+ content: "\e8c9";
+}
+
+.icon-ditu:before {
+ content: "\e906";
+}
+
+.icon-sousuo2:before {
+ content: "\e757";
+}
+
+.icon-2:before {
+ content: "\e684";
+}
+
+.icon-dizhi:before {
+ content: "\e608";
+}
+
+.icon-huangguan:before {
+ content: "\e624";
+}
+
+.icon-huangguan1:before {
+ content: "\e625";
+}
+
+.icon-huangguan2:before {
+ content: "\e626";
+}
+
+.icon-wuliu:before {
+ content: "\e6f2";
+}
+
+.icon-xuanzhong:before {
+ content: "\e615";
+}
+
+.icon-xinpin:before {
+ content: "\e610";
+}
+
+.icon-arrow:before {
+ content: "\e627";
+}
+
+.icon-bianji:before {
+ content: "\e6cc";
+}
+
+.icon-wenti:before {
+ content: "\e758";
+}
+
+.icon-qiandai:before {
+ content: "\e6b1";
+}
+
+.icon-xiangyou:before {
+ content: "\e679";
+}
+
+.icon-remen:before {
+ content: "\e67c";
+}
+
+.icon-tuandui:before {
+ content: "\e685";
+}
+
+.icon-hebingxingzhuang:before {
+ content: "\e656";
+}
+
+.icon-gouwuche1:before {
+ content: "\e642";
+}
+
+.icon-liulan:before {
+ content: "\e629";
+}
+
+.icon-jinbi1:before {
+ content: "\e655";
+}
+
+.icon-guanbi2:before {
+ content: "\e61c";
+}
+
+.icon-sousuo:before {
+ content: "\e67d";
+}
+
+.icon-weixin:before {
+ content: "\e600";
+}
+
+.icon-tongji:before {
+ content: "\e687";
+}
+
+.icon-caidan:before {
+ content: "\e62a";
+}
+
+.icon-erweima:before {
+ content: "\e607";
+}
+
+.icon-shoucang:before {
+ content: "\e606";
+}
+
+.icon-guanbi:before {
+ content: "\e62f";
+}
+
+.icon-shuoming:before {
+ content: "\e630";
+}
+
+.icon-pailie:before {
+ content: "\e61b";
+}
+
+.icon-fenxiang:before {
+ content: "\e603";
+}
+
+.icon-yinhangqia:before {
+ content: "\e72c";
+}
+
+.icon-sousuo1:before {
+ content: "\e64c";
+}
+
+.icon-duihao:before {
+ content: "\e64e";
+}
+
+.icon-dingdan:before {
+ content: "\e61e";
+}
+
+.icon-tupianpailie:before {
+ content: "\e620";
+}
+
+.icon-chongzhi:before {
+ content: "\e602";
+}
+
+.icon-shezhi:before {
+ content: "\e619";
+}
+
+.icon-duihao2:before {
+ content: "\e601";
+}
+
+.icon-complete:before {
+ content: "\e646";
+}
+
+.icon-weixin1:before {
+ content: "\e66e";
+}
+
+.icon-tianjiadizhi:before {
+ content: "\e640";
+}
+
+.icon-weixin2:before {
+ content: "\e604";
+}
+
+.icon-gouwuche:before {
+ content: "\e669";
+}
+
+.icon-jiazai:before {
+ content: "\e62c";
+}
+
+.icon-kefu_o:before {
+ content: "\eb63";
+}
+
+.icon-liwu_o:before {
+ content: "\eb65";
+}
+
+.icon-huobiliu_o:before {
+ content: "\eb9f";
+}
+
+.icon-jinbi_o:before {
+ content: "\eba1";
+}
+
+.icon-gerentouxiang_o:before {
+ content: "\ebac";
+}
+
+.icon-qunzu_o:before {
+ content: "\ebad";
+}
+
+.icon-shoucang_o:before {
+ content: "\ebae";
+}
+
+.icon-didiandingwei_o:before {
+ content: "\ebba";
+}
+
+.icon-zhekou:before {
+ content: "\e790";
+}
+
+.icon-laba:before {
+ content: "\e612";
+}
+
+.icon-quanxianguanlisuozi:before {
+ content: "\e6d2";
+}
+
+.icon-xiala1:before {
+ content: "\e609";
+}
+
+.icon-jingyanzhi:before {
+ content: "\e62e";
+}
+
+.icon-kefu:before {
+ content: "\e6b2";
+}
+
+.icon-shenhezhong:before {
+ content: "\e6ce";
+}
+
+.icon-kanjia1:before {
+ content: "\e613";
+}
+
+.icon-shanchu1:before {
+ content: "\e611";
+}
+
+.icon-yonghu1:before {
+ content: "\e644";
+}
+
+.icon-suozi:before {
+ content: "\e631";
+}
+
+.icon-jiantou:before {
+ content: "\e641";
+}
+
+.icon-kanjia:before {
+ content: "\e69b";
+}
+
+.icon-pintuan:before {
+ content: "\e60c";
+}
+
+.icon-bianji1:before {
+ content: "\e614";
+}
+
+.icon-youhuiquan:before {
+ content: "\e6e4";
+}
+
+.icon-xiangxia:before {
+ content: "\e8ca";
+}
+
+.icon-shanchu:before {
+ content: "\e628";
+}
+
+.icon-guanbi3:before {
+ content: "\e6c5";
+}
+
+.icon-xuanzhong1:before {
+ content: "\e6ef";
+}
+
+.icon-weixuanzhong:before {
+ content: "\e6f0";
+}
+
+.icon-zhuangshixian:before {
+ content: "\e6f1";
+}
+
+.icon-jishuzhichi:before {
+ content: "\e6f3";
+}
+
+.icon-biankuang:before {
+ content: "\e6f4";
+}
+
+.icon-guanbi1:before {
+ content: "\e6f5";
+}
+
+.icon-xiangshang:before {
+ content: "\ebbb";
+}
+
+.icon-icon-test:before {
+ content: "\e6f6";
+}
+
+.icon-mingxi:before {
+ content: "\e6f7";
+}
+
+.icon-tishengfenzhi:before {
+ content: "\e6f8";
+}
+
+.icon-pintuanchenggong:before {
+ content: "\e6f9";
+}
+
+.icon-pintuanshibai:before {
+ content: "\e6fa";
+}
+
+.icon-shitixing:before {
+ content: "\e6fb";
+}
+
+.icon-kongxinxing:before {
+ content: "\e6fc";
+}
+
+.icon-yituikuan:before {
+ content: "\e6fd";
+}
+
+.icon-tuikuanzhong:before {
+ content: "\e6fe";
+}
+
+.icon-lingxing:before {
+ content: "\e6ff";
+}
+
+.icon-xiangzuo:before {
+ content: "\ebbc";
+}
+
+.icon-shoucang1:before {
+ content: "\e714";
+}
\ No newline at end of file
diff --git a/wx-mini-program/static/images/about.png b/wx-mini-program/static/images/about.png
new file mode 100644
index 0000000..bfd522c
Binary files /dev/null and b/wx-mini-program/static/images/about.png differ
diff --git a/wx-mini-program/static/images/about_us.png b/wx-mini-program/static/images/about_us.png
new file mode 100644
index 0000000..04405ee
Binary files /dev/null and b/wx-mini-program/static/images/about_us.png differ
diff --git a/wx-mini-program/static/images/address-bg-bd.png b/wx-mini-program/static/images/address-bg-bd.png
new file mode 100644
index 0000000..fe06bcd
Binary files /dev/null and b/wx-mini-program/static/images/address-bg-bd.png differ
diff --git a/wx-mini-program/static/images/address.png b/wx-mini-program/static/images/address.png
new file mode 100644
index 0000000..7330ca6
Binary files /dev/null and b/wx-mini-program/static/images/address.png differ
diff --git a/wx-mini-program/static/images/address_right.png b/wx-mini-program/static/images/address_right.png
new file mode 100644
index 0000000..bea650c
Binary files /dev/null and b/wx-mini-program/static/images/address_right.png differ
diff --git a/wx-mini-program/static/images/avatar.png b/wx-mini-program/static/images/avatar.png
new file mode 100644
index 0000000..0a2a396
Binary files /dev/null and b/wx-mini-program/static/images/avatar.png differ
diff --git a/wx-mini-program/static/images/cart.png b/wx-mini-program/static/images/cart.png
new file mode 100644
index 0000000..ab1a3f9
Binary files /dev/null and b/wx-mini-program/static/images/cart.png differ
diff --git a/wx-mini-program/static/images/cart@selected.png b/wx-mini-program/static/images/cart@selected.png
new file mode 100644
index 0000000..7554f3c
Binary files /dev/null and b/wx-mini-program/static/images/cart@selected.png differ
diff --git a/wx-mini-program/static/images/category.png b/wx-mini-program/static/images/category.png
new file mode 100644
index 0000000..ef41b4d
Binary files /dev/null and b/wx-mini-program/static/images/category.png differ
diff --git a/wx-mini-program/static/images/category@selected.png b/wx-mini-program/static/images/category@selected.png
new file mode 100644
index 0000000..84f8e74
Binary files /dev/null and b/wx-mini-program/static/images/category@selected.png differ
diff --git a/wx-mini-program/static/images/channel_category.png b/wx-mini-program/static/images/channel_category.png
new file mode 100644
index 0000000..626b9fb
Binary files /dev/null and b/wx-mini-program/static/images/channel_category.png differ
diff --git a/wx-mini-program/static/images/checkbox.png b/wx-mini-program/static/images/checkbox.png
new file mode 100644
index 0000000..2a686c7
Binary files /dev/null and b/wx-mini-program/static/images/checkbox.png differ
diff --git a/wx-mini-program/static/images/clear_input.png b/wx-mini-program/static/images/clear_input.png
new file mode 100644
index 0000000..08557d5
Binary files /dev/null and b/wx-mini-program/static/images/clear_input.png differ
diff --git a/wx-mini-program/static/images/close.gif b/wx-mini-program/static/images/close.gif
new file mode 100644
index 0000000..4de18b4
Binary files /dev/null and b/wx-mini-program/static/images/close.gif differ
diff --git a/wx-mini-program/static/images/comment.png b/wx-mini-program/static/images/comment.png
new file mode 100644
index 0000000..503ba6f
Binary files /dev/null and b/wx-mini-program/static/images/comment.png differ
diff --git a/wx-mini-program/static/images/complete.png b/wx-mini-program/static/images/complete.png
new file mode 100644
index 0000000..ae63d42
Binary files /dev/null and b/wx-mini-program/static/images/complete.png differ
diff --git a/wx-mini-program/static/images/coupon.png b/wx-mini-program/static/images/coupon.png
new file mode 100644
index 0000000..27e6340
Binary files /dev/null and b/wx-mini-program/static/images/coupon.png differ
diff --git a/wx-mini-program/static/images/customer.png b/wx-mini-program/static/images/customer.png
new file mode 100644
index 0000000..591194b
Binary files /dev/null and b/wx-mini-program/static/images/customer.png differ
diff --git a/wx-mini-program/static/images/del-address.png b/wx-mini-program/static/images/del-address.png
new file mode 100644
index 0000000..db1c05c
Binary files /dev/null and b/wx-mini-program/static/images/del-address.png differ
diff --git a/wx-mini-program/static/images/detail_back.png b/wx-mini-program/static/images/detail_back.png
new file mode 100644
index 0000000..20e290c
Binary files /dev/null and b/wx-mini-program/static/images/detail_back.png differ
diff --git a/wx-mini-program/static/images/dfh.png b/wx-mini-program/static/images/dfh.png
new file mode 100644
index 0000000..a90f528
Binary files /dev/null and b/wx-mini-program/static/images/dfh.png differ
diff --git a/wx-mini-program/static/images/dfk.png b/wx-mini-program/static/images/dfk.png
new file mode 100644
index 0000000..9a68d8a
Binary files /dev/null and b/wx-mini-program/static/images/dfk.png differ
diff --git a/wx-mini-program/static/images/down.png b/wx-mini-program/static/images/down.png
new file mode 100644
index 0000000..a621b1a
Binary files /dev/null and b/wx-mini-program/static/images/down.png differ
diff --git a/wx-mini-program/static/images/dpj.png b/wx-mini-program/static/images/dpj.png
new file mode 100644
index 0000000..6a4777b
Binary files /dev/null and b/wx-mini-program/static/images/dpj.png differ
diff --git a/wx-mini-program/static/images/dsh.png b/wx-mini-program/static/images/dsh.png
new file mode 100644
index 0000000..774f7d1
Binary files /dev/null and b/wx-mini-program/static/images/dsh.png differ
diff --git a/wx-mini-program/static/images/edit-address.png b/wx-mini-program/static/images/edit-address.png
new file mode 100644
index 0000000..8e0bd48
Binary files /dev/null and b/wx-mini-program/static/images/edit-address.png differ
diff --git a/wx-mini-program/static/images/feedback.png b/wx-mini-program/static/images/feedback.png
new file mode 100644
index 0000000..fa27fe3
Binary files /dev/null and b/wx-mini-program/static/images/feedback.png differ
diff --git a/wx-mini-program/static/images/footprint.png b/wx-mini-program/static/images/footprint.png
new file mode 100644
index 0000000..7cbf411
Binary files /dev/null and b/wx-mini-program/static/images/footprint.png differ
diff --git a/wx-mini-program/static/images/friend.png b/wx-mini-program/static/images/friend.png
new file mode 100644
index 0000000..b8a372b
Binary files /dev/null and b/wx-mini-program/static/images/friend.png differ
diff --git a/wx-mini-program/static/images/go.png b/wx-mini-program/static/images/go.png
new file mode 100644
index 0000000..b7af4e7
Binary files /dev/null and b/wx-mini-program/static/images/go.png differ
diff --git a/wx-mini-program/static/images/group.png b/wx-mini-program/static/images/group.png
new file mode 100644
index 0000000..665f149
Binary files /dev/null and b/wx-mini-program/static/images/group.png differ
diff --git a/wx-mini-program/static/images/home.png b/wx-mini-program/static/images/home.png
new file mode 100644
index 0000000..570681b
Binary files /dev/null and b/wx-mini-program/static/images/home.png differ
diff --git a/wx-mini-program/static/images/home@selected.png b/wx-mini-program/static/images/home@selected.png
new file mode 100644
index 0000000..5296945
Binary files /dev/null and b/wx-mini-program/static/images/home@selected.png differ
diff --git a/wx-mini-program/static/images/ic_menu_shoping_nor.png b/wx-mini-program/static/images/ic_menu_shoping_nor.png
new file mode 100644
index 0000000..7959656
Binary files /dev/null and b/wx-mini-program/static/images/ic_menu_shoping_nor.png differ
diff --git a/wx-mini-program/static/images/ic_menu_topic_nor.png b/wx-mini-program/static/images/ic_menu_topic_nor.png
new file mode 100644
index 0000000..4adc4b8
Binary files /dev/null and b/wx-mini-program/static/images/ic_menu_topic_nor.png differ
diff --git a/wx-mini-program/static/images/ic_menu_topic_pressed.png b/wx-mini-program/static/images/ic_menu_topic_pressed.png
new file mode 100644
index 0000000..8208ae6
Binary files /dev/null and b/wx-mini-program/static/images/ic_menu_topic_pressed.png differ
diff --git a/wx-mini-program/static/images/ico-addr.png b/wx-mini-program/static/images/ico-addr.png
new file mode 100644
index 0000000..1b143e1
Binary files /dev/null and b/wx-mini-program/static/images/ico-addr.png differ
diff --git a/wx-mini-program/static/images/icon_close.png b/wx-mini-program/static/images/icon_close.png
new file mode 100644
index 0000000..0c92358
Binary files /dev/null and b/wx-mini-program/static/images/icon_close.png differ
diff --git a/wx-mini-program/static/images/icon_collect.png b/wx-mini-program/static/images/icon_collect.png
new file mode 100644
index 0000000..8dcc682
Binary files /dev/null and b/wx-mini-program/static/images/icon_collect.png differ
diff --git a/wx-mini-program/static/images/icon_collect_checked.png b/wx-mini-program/static/images/icon_collect_checked.png
new file mode 100644
index 0000000..56e68eb
Binary files /dev/null and b/wx-mini-program/static/images/icon_collect_checked.png differ
diff --git a/wx-mini-program/static/images/icon_error.png b/wx-mini-program/static/images/icon_error.png
new file mode 100644
index 0000000..b13c94b
Binary files /dev/null and b/wx-mini-program/static/images/icon_error.png differ
diff --git a/wx-mini-program/static/images/icon_go_more.png b/wx-mini-program/static/images/icon_go_more.png
new file mode 100644
index 0000000..d7c33f2
Binary files /dev/null and b/wx-mini-program/static/images/icon_go_more.png differ
diff --git a/wx-mini-program/static/images/icon_like.png b/wx-mini-program/static/images/icon_like.png
new file mode 100644
index 0000000..46d1928
Binary files /dev/null and b/wx-mini-program/static/images/icon_like.png differ
diff --git a/wx-mini-program/static/images/icon_like_checked.png b/wx-mini-program/static/images/icon_like_checked.png
new file mode 100644
index 0000000..d1cf45d
Binary files /dev/null and b/wx-mini-program/static/images/icon_like_checked.png differ
diff --git a/wx-mini-program/static/images/kefu.png b/wx-mini-program/static/images/kefu.png
new file mode 100644
index 0000000..f66cc74
Binary files /dev/null and b/wx-mini-program/static/images/kefu.png differ
diff --git a/wx-mini-program/static/images/mobile.png b/wx-mini-program/static/images/mobile.png
new file mode 100644
index 0000000..d48b2bc
Binary files /dev/null and b/wx-mini-program/static/images/mobile.png differ
diff --git a/wx-mini-program/static/images/my.png b/wx-mini-program/static/images/my.png
new file mode 100644
index 0000000..0cbc2d8
Binary files /dev/null and b/wx-mini-program/static/images/my.png differ
diff --git a/wx-mini-program/static/images/my@selected.png b/wx-mini-program/static/images/my@selected.png
new file mode 100644
index 0000000..a29aeed
Binary files /dev/null and b/wx-mini-program/static/images/my@selected.png differ
diff --git a/wx-mini-program/static/images/news.png b/wx-mini-program/static/images/news.png
new file mode 100644
index 0000000..bbc5536
Binary files /dev/null and b/wx-mini-program/static/images/news.png differ
diff --git a/wx-mini-program/static/images/noAddress.png b/wx-mini-program/static/images/noAddress.png
new file mode 100644
index 0000000..4b969d9
Binary files /dev/null and b/wx-mini-program/static/images/noAddress.png differ
diff --git a/wx-mini-program/static/images/noCart.png b/wx-mini-program/static/images/noCart.png
new file mode 100644
index 0000000..2321258
Binary files /dev/null and b/wx-mini-program/static/images/noCart.png differ
diff --git a/wx-mini-program/static/images/noCart_old.png b/wx-mini-program/static/images/noCart_old.png
new file mode 100644
index 0000000..94744e5
Binary files /dev/null and b/wx-mini-program/static/images/noCart_old.png differ
diff --git a/wx-mini-program/static/images/open.gif b/wx-mini-program/static/images/open.gif
new file mode 100644
index 0000000..4943b52
Binary files /dev/null and b/wx-mini-program/static/images/open.gif differ
diff --git a/wx-mini-program/static/images/selnum.png b/wx-mini-program/static/images/selnum.png
new file mode 100644
index 0000000..8699194
Binary files /dev/null and b/wx-mini-program/static/images/selnum.png differ
diff --git a/wx-mini-program/static/images/sh.png b/wx-mini-program/static/images/sh.png
new file mode 100644
index 0000000..eaa60f8
Binary files /dev/null and b/wx-mini-program/static/images/sh.png differ
diff --git a/wx-mini-program/static/images/share.png b/wx-mini-program/static/images/share.png
new file mode 100644
index 0000000..acb184b
Binary files /dev/null and b/wx-mini-program/static/images/share.png differ
diff --git a/wx-mini-program/static/images/telephone.png b/wx-mini-program/static/images/telephone.png
new file mode 100644
index 0000000..86500a2
Binary files /dev/null and b/wx-mini-program/static/images/telephone.png differ
diff --git a/wx-mini-program/static/images/title_search.png b/wx-mini-program/static/images/title_search.png
new file mode 100644
index 0000000..4550ee5
Binary files /dev/null and b/wx-mini-program/static/images/title_search.png differ
diff --git a/wx-mini-program/static/images/wechat.png b/wx-mini-program/static/images/wechat.png
new file mode 100644
index 0000000..222857c
Binary files /dev/null and b/wx-mini-program/static/images/wechat.png differ
diff --git a/wx-mini-program/static/images/wxpay.png b/wx-mini-program/static/images/wxpay.png
new file mode 100644
index 0000000..1fb53e5
Binary files /dev/null and b/wx-mini-program/static/images/wxpay.png differ
diff --git a/wx-mini-program/utils/check.js b/wx-mini-program/utils/check.js
new file mode 100644
index 0000000..a368ef2
--- /dev/null
+++ b/wx-mini-program/utils/check.js
@@ -0,0 +1,12 @@
+function isValidPhone(str) {
+ var myreg = /^[1][3,4,5,7,8,9][0-9]{9}$/;
+ if (!myreg.test(str)) {
+ return false;
+ } else {
+ return true;
+ }
+}
+
+module.exports = {
+ isValidPhone
+}
\ No newline at end of file
diff --git a/wx-mini-program/utils/user.js b/wx-mini-program/utils/user.js
new file mode 100644
index 0000000..950d2fb
--- /dev/null
+++ b/wx-mini-program/utils/user.js
@@ -0,0 +1,98 @@
+/**
+ * 用户相关服务
+ */
+const util = require('../utils/util.js');
+const api = require('../config/api.js');
+
+
+/**
+ * Promise封装wx.checkSession
+ */
+function checkSession() {
+ return new Promise(function(resolve, reject) {
+ wx.checkSession({
+ success: function() {
+ resolve(true);
+ },
+ fail: function() {
+ reject(false);
+ }
+ })
+ });
+}
+
+/**
+ * Promise封装wx.login
+ */
+function login() {
+ return new Promise(function(resolve, reject) {
+ wx.login({
+ success: function(res) {
+ if (res.code) {
+ resolve(res);
+ } else {
+ reject(res);
+ }
+ },
+ fail: function(err) {
+ reject(err);
+ }
+ });
+ });
+}
+
+/**
+ * 调用微信登录
+ */
+function loginByWeixin(userInfo) {
+ let shareUserId = wx.getStorageSync('shareUserId');
+ if (!shareUserId || shareUserId =='undefined'){
+ shareUserId = 1;
+ }
+ return new Promise(function(resolve, reject) {
+ return login().then((res) => {
+ //登录远程服务器
+ util.request(api.AuthLoginByWeixin, {
+ code: res.code,
+ userInfo: userInfo,
+ shareUserId: shareUserId
+ }, 'POST').then(res => {
+ if (res.errno === 0) {
+ //存储用户信息
+ wx.setStorageSync('userInfo', res.data.userInfo);
+ wx.setStorageSync('token', res.data.token);
+
+ resolve(res);
+ } else {
+ reject(res);
+ }
+ }).catch((err) => {
+ reject(err);
+ });
+ }).catch((err) => {
+ reject(err);
+ })
+ });
+}
+
+/**
+ * 判断用户是否登录
+ */
+function checkLogin() {
+ return new Promise(function(resolve, reject) {
+ if (wx.getStorageSync('userInfo') && wx.getStorageSync('token')) {
+ checkSession().then(() => {
+ resolve(true);
+ }).catch(() => {
+ reject(false);
+ });
+ } else {
+ reject(false);
+ }
+ });
+}
+
+module.exports = {
+ loginByWeixin,
+ checkLogin,
+};
\ No newline at end of file
diff --git a/wx-mini-program/utils/util.js b/wx-mini-program/utils/util.js
new file mode 100644
index 0000000..6f5136f
--- /dev/null
+++ b/wx-mini-program/utils/util.js
@@ -0,0 +1,119 @@
+var api = require('../config/api.js');
+var app = getApp();
+
+function formatTime(date) {
+ var year = date.getFullYear()
+ var month = date.getMonth() + 1
+ var day = date.getDate()
+
+ var hour = date.getHours()
+ var minute = date.getMinutes()
+ var second = date.getSeconds()
+
+
+ return [year, month, day].map(formatNumber).join('-') + ' ' + [hour, minute, second].map(formatNumber).join(':')
+}
+
+function formatNumber(n) {
+ n = n.toString()
+ return n[1] ? n : '0' + n
+}
+
+/**
+ * 封封微信的的request
+ */
+function request(url, data = {}, method = "GET") {
+ return new Promise(function(resolve, reject) {
+ wx.request({
+ url: url,
+ data: data,
+ method: method,
+ header: {
+ 'Content-Type': 'application/json',
+ 'X-Dts-Token': wx.getStorageSync('token')
+ },
+ success: function(res) {
+
+ if (res.statusCode == 200) {
+
+ if (res.data.errno == 501) {
+ // 清除登录相关内容
+ try {
+ wx.removeStorageSync('userInfo');
+ wx.removeStorageSync('token');
+ } catch (e) {
+ // Do something when catch error
+ }
+ // 切换到登录页面
+ wx.navigateTo({
+ url: '/pages/auth/login/login'
+ });
+ } else {
+ resolve(res.data);
+ }
+ } else {
+ reject(res.errMsg);
+ }
+
+ },
+ fail: function(err) {
+ reject(err)
+ }
+ })
+ });
+}
+
+function redirect(url) {
+
+ //判断页面是否需要登录
+ if (false) {
+ wx.redirectTo({
+ url: '/pages/auth/login/login'
+ });
+ return false;
+ } else {
+ wx.redirectTo({
+ url: url
+ });
+ }
+}
+
+function showErrorToast(msg) {
+ wx.showToast({
+ title: msg,
+ image: '/static/images/icon_error.png'
+ })
+}
+
+function jhxLoadShow(message) {
+ if (wx.showLoading) { // 基础库 1.1.0 微信6.5.6版本开始支持,低版本需做兼容处理
+ wx.showLoading({
+ title: message,
+ mask: true
+ });
+ } else { // 低版本采用Toast兼容处理并将时间设为20秒以免自动消失
+ wx.showToast({
+ title: message,
+ icon: 'loading',
+ mask: true,
+ duration: 20000
+ });
+ }
+}
+
+function jhxLoadHide() {
+ if (wx.hideLoading) { // 基础库 1.1.0 微信6.5.6版本开始支持,低版本需做兼容处理
+ wx.hideLoading();
+ } else {
+ wx.hideToast();
+ }
+}
+
+module.exports = {
+ formatTime,
+ request,
+ redirect,
+ showErrorToast,
+ jhxLoadShow,
+ jhxLoadHide
+}
\ No newline at end of file