diff --git "a/\344\275\234\344\270\232/.keep" "b/\344\275\234\344\270\232/.keep"
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git "a/\344\275\234\344\270\232/\345\225\206\345\223\201\351\241\265\344\275\234\344\270\232/1.jpg" "b/\344\275\234\344\270\232/\345\225\206\345\223\201\351\241\265\344\275\234\344\270\232/1.jpg"
new file mode 100644
index 0000000000000000000000000000000000000000..bcf49b75dbe79f28ccc77e0ea0731790e7ddef37
Binary files /dev/null and "b/\344\275\234\344\270\232/\345\225\206\345\223\201\351\241\265\344\275\234\344\270\232/1.jpg" differ
diff --git "a/\344\275\234\344\270\232/\345\225\206\345\223\201\351\241\265\344\275\234\344\270\232/goods.html" "b/\344\275\234\344\270\232/\345\225\206\345\223\201\351\241\265\344\275\234\344\270\232/goods.html"
new file mode 100644
index 0000000000000000000000000000000000000000..c1fd641f551eacdf618897fc872305b4365e64c5
--- /dev/null
+++ "b/\344\275\234\344\270\232/\345\225\206\345\223\201\351\241\265\344\275\234\344\270\232/goods.html"
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+ vue商品页
+
+
+
+
+
+
+
商品列表
+
+
+
+
{{description}}
+
+ {{price}}
+
+
+
+
+
+
+
+
+
{{description}}
+
+ {{price}}
+
+
+
+
+
+
+
+
+
{{description}}
+
+ {{price}}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/\344\275\234\344\270\232/\345\225\206\345\223\201\351\241\265\344\275\234\344\270\2322/goods.css" "b/\344\275\234\344\270\232/\345\225\206\345\223\201\351\241\265\344\275\234\344\270\2322/goods.css"
new file mode 100644
index 0000000000000000000000000000000000000000..97f8cd092aecf0724d4e8aadf1e3bc74a3442f8e
--- /dev/null
+++ "b/\344\275\234\344\270\232/\345\225\206\345\223\201\351\241\265\344\275\234\344\270\2322/goods.css"
@@ -0,0 +1,85 @@
+* {
+ list-style: none;
+}
+
+body {
+ margin: 0;
+ padding: 0;
+}
+
+.main {
+ width: 400px;
+ height: 200px;
+ margin: auto;
+ display: flex;
+ flex-direction: column;
+
+}
+
+.title {
+ width: 400px;
+ height: 50px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ font-size: 20px;
+
+}
+
+.goods {
+ width: 400px;
+ height: 120px;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+ align-content: center;
+ margin-top: 5px;
+ background-color: rgb(238, 238, 238);
+}
+
+.left {
+ display: flex;
+ width: 100px;
+ height: 100px;
+}
+
+.right {
+ width: 240px;
+ height: 100px;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+}
+
+
+.price {
+ color: red;
+ font-size: 20px;
+ font-weight: 1000;
+}
+
+.bottom {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+}
+
+.buy {
+ width: 50px;
+ color: white;
+ background-color: gray;
+ border: none;
+}
+
+.buy:hover {
+ background-color: cadetblue;
+}
+
+.input{
+ margin: auto;
+}
+
+input{
+ width: 40px;
+ height: 20px;
+}
\ No newline at end of file
diff --git "a/\344\275\234\344\270\232/\345\225\206\345\223\201\351\241\265\344\275\234\344\270\2322/goods.html" "b/\344\275\234\344\270\232/\345\225\206\345\223\201\351\241\265\344\275\234\344\270\2322/goods.html"
new file mode 100644
index 0000000000000000000000000000000000000000..bfa0e623e09d7f7de19e1e0840970f4fae10a97b
--- /dev/null
+++ "b/\344\275\234\344\270\232/\345\225\206\345\223\201\351\241\265\344\275\234\344\270\2322/goods.html"
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+ vue商品页
+
+
+
+
+
+
刷怪笼
+
+
+
+
+
{{item.description}}
+
剩余 {{item.totalNum-item.buyNum}} 只
+
+ {{item.price}}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/\344\275\234\344\270\232/\345\225\206\345\223\201\351\241\265\344\275\234\344\270\2323/goods.css" "b/\344\275\234\344\270\232/\345\225\206\345\223\201\351\241\265\344\275\234\344\270\2323/goods.css"
new file mode 100644
index 0000000000000000000000000000000000000000..037d0541b0ef367b831a36c2a711465a51eb1d68
--- /dev/null
+++ "b/\344\275\234\344\270\232/\345\225\206\345\223\201\351\241\265\344\275\234\344\270\2323/goods.css"
@@ -0,0 +1,66 @@
+* {
+ list-style: none;
+}
+
+body {
+ margin: 0;
+ padding: 0;
+}
+
+.main {
+ width: 300px;
+ margin: auto;
+ display: flex;
+}
+
+.bigBox{
+ width: 300px;
+ border: 1px gray solid;
+ display: flex;
+ flex-direction: column;
+}
+
+.title{
+ width: 300px;
+ height: 50px;
+ text-align: center;
+ font-size: 20px;
+ color: black;
+ line-height: 50px;
+}
+
+.goodsList{
+ width: 300px;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ align-content: center;
+ margin-bottom: 10px;
+}
+
+.img img{
+ width: 150px;
+ height: 150px;
+}
+
+#inp{
+ width: 40px;
+ margin: 5px;
+}
+
+.description{
+ font-size: 16px;
+ color: black;
+}
+
+.price{
+ font-size: 16px;
+ color: orange;
+}
+
+.remainder{
+ font-size: 10px;
+ color: gray;
+}
+
diff --git "a/\344\275\234\344\270\232/\345\225\206\345\223\201\351\241\265\344\275\234\344\270\2323/goods.html" "b/\344\275\234\344\270\232/\345\225\206\345\223\201\351\241\265\344\275\234\344\270\2323/goods.html"
new file mode 100644
index 0000000000000000000000000000000000000000..c17f2c0f4de32ce5624a3f19c16ef2b9013a169c
--- /dev/null
+++ "b/\344\275\234\344\270\232/\345\225\206\345\223\201\351\241\265\344\275\234\344\270\2323/goods.html"
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+ vue商品页
+
+
+
+
+
+
+
商品列表
+
+
+
+
{{item.goodsName}}
+
{{item.description}}
+
价格:{{item.price}} ¥
+
剩余:{{item.totalNum-item.buyNum}}
+
+
+ |
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/\344\275\234\344\270\232/\345\225\206\345\223\201\351\241\265\344\275\234\344\270\2323/vue.global.js" "b/\344\275\234\344\270\232/\345\225\206\345\223\201\351\241\265\344\275\234\344\270\2323/vue.global.js"
new file mode 100644
index 0000000000000000000000000000000000000000..db18856d98ce912ea0179a180779372023a1d649
--- /dev/null
+++ "b/\344\275\234\344\270\232/\345\225\206\345\223\201\351\241\265\344\275\234\344\270\2323/vue.global.js"
@@ -0,0 +1,16159 @@
+var Vue = (function (exports) {
+ 'use strict';
+
+ /**
+ * Make a map and return a function for checking if a key
+ * is in that map.
+ * IMPORTANT: all calls of this function must be prefixed with
+ * \/\*#\_\_PURE\_\_\*\/
+ * So that rollup can tree-shake them if necessary.
+ */
+ function makeMap(str, expectsLowerCase) {
+ const map = Object.create(null);
+ const list = str.split(',');
+ for (let i = 0; i < list.length; i++) {
+ map[list[i]] = true;
+ }
+ return expectsLowerCase ? val => !!map[val.toLowerCase()] : val => !!map[val];
+ }
+
+ /**
+ * dev only flag -> name mapping
+ */
+ const PatchFlagNames = {
+ [1 /* PatchFlags.TEXT */]: `TEXT`,
+ [2 /* PatchFlags.CLASS */]: `CLASS`,
+ [4 /* PatchFlags.STYLE */]: `STYLE`,
+ [8 /* PatchFlags.PROPS */]: `PROPS`,
+ [16 /* PatchFlags.FULL_PROPS */]: `FULL_PROPS`,
+ [32 /* PatchFlags.HYDRATE_EVENTS */]: `HYDRATE_EVENTS`,
+ [64 /* PatchFlags.STABLE_FRAGMENT */]: `STABLE_FRAGMENT`,
+ [128 /* PatchFlags.KEYED_FRAGMENT */]: `KEYED_FRAGMENT`,
+ [256 /* PatchFlags.UNKEYED_FRAGMENT */]: `UNKEYED_FRAGMENT`,
+ [512 /* PatchFlags.NEED_PATCH */]: `NEED_PATCH`,
+ [1024 /* PatchFlags.DYNAMIC_SLOTS */]: `DYNAMIC_SLOTS`,
+ [2048 /* PatchFlags.DEV_ROOT_FRAGMENT */]: `DEV_ROOT_FRAGMENT`,
+ [-1 /* PatchFlags.HOISTED */]: `HOISTED`,
+ [-2 /* PatchFlags.BAIL */]: `BAIL`
+ };
+
+ /**
+ * Dev only
+ */
+ const slotFlagsText = {
+ [1 /* SlotFlags.STABLE */]: 'STABLE',
+ [2 /* SlotFlags.DYNAMIC */]: 'DYNAMIC',
+ [3 /* SlotFlags.FORWARDED */]: 'FORWARDED'
+ };
+
+ const GLOBALS_WHITE_LISTED = 'Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,' +
+ 'decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,' +
+ 'Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt';
+ const isGloballyWhitelisted = /*#__PURE__*/ makeMap(GLOBALS_WHITE_LISTED);
+
+ const range = 2;
+ function generateCodeFrame(source, start = 0, end = source.length) {
+ // Split the content into individual lines but capture the newline sequence
+ // that separated each line. This is important because the actual sequence is
+ // needed to properly take into account the full line length for offset
+ // comparison
+ let lines = source.split(/(\r?\n)/);
+ // Separate the lines and newline sequences into separate arrays for easier referencing
+ const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);
+ lines = lines.filter((_, idx) => idx % 2 === 0);
+ let count = 0;
+ const res = [];
+ for (let i = 0; i < lines.length; i++) {
+ count +=
+ lines[i].length +
+ ((newlineSequences[i] && newlineSequences[i].length) || 0);
+ if (count >= start) {
+ for (let j = i - range; j <= i + range || end > count; j++) {
+ if (j < 0 || j >= lines.length)
+ continue;
+ const line = j + 1;
+ res.push(`${line}${' '.repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}`);
+ const lineLength = lines[j].length;
+ const newLineSeqLength = (newlineSequences[j] && newlineSequences[j].length) || 0;
+ if (j === i) {
+ // push underline
+ const pad = start - (count - (lineLength + newLineSeqLength));
+ const length = Math.max(1, end > count ? lineLength - pad : end - start);
+ res.push(` | ` + ' '.repeat(pad) + '^'.repeat(length));
+ }
+ else if (j > i) {
+ if (end > count) {
+ const length = Math.max(Math.min(end - count, lineLength), 1);
+ res.push(` | ` + '^'.repeat(length));
+ }
+ count += lineLength + newLineSeqLength;
+ }
+ }
+ break;
+ }
+ }
+ return res.join('\n');
+ }
+
+ function normalizeStyle(value) {
+ if (isArray(value)) {
+ const res = {};
+ for (let i = 0; i < value.length; i++) {
+ const item = value[i];
+ const normalized = isString(item)
+ ? parseStringStyle(item)
+ : normalizeStyle(item);
+ if (normalized) {
+ for (const key in normalized) {
+ res[key] = normalized[key];
+ }
+ }
+ }
+ return res;
+ }
+ else if (isString(value)) {
+ return value;
+ }
+ else if (isObject(value)) {
+ return value;
+ }
+ }
+ const listDelimiterRE = /;(?![^(]*\))/g;
+ const propertyDelimiterRE = /:([^]+)/;
+ const styleCommentRE = /\/\*.*?\*\//gs;
+ function parseStringStyle(cssText) {
+ const ret = {};
+ cssText
+ .replace(styleCommentRE, '')
+ .split(listDelimiterRE)
+ .forEach(item => {
+ if (item) {
+ const tmp = item.split(propertyDelimiterRE);
+ tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());
+ }
+ });
+ return ret;
+ }
+ function normalizeClass(value) {
+ let res = '';
+ if (isString(value)) {
+ res = value;
+ }
+ else if (isArray(value)) {
+ for (let i = 0; i < value.length; i++) {
+ const normalized = normalizeClass(value[i]);
+ if (normalized) {
+ res += normalized + ' ';
+ }
+ }
+ }
+ else if (isObject(value)) {
+ for (const name in value) {
+ if (value[name]) {
+ res += name + ' ';
+ }
+ }
+ }
+ return res.trim();
+ }
+ function normalizeProps(props) {
+ if (!props)
+ return null;
+ let { class: klass, style } = props;
+ if (klass && !isString(klass)) {
+ props.class = normalizeClass(klass);
+ }
+ if (style) {
+ props.style = normalizeStyle(style);
+ }
+ return props;
+ }
+
+ // These tag configs are shared between compiler-dom and runtime-dom, so they
+ // https://developer.mozilla.org/en-US/docs/Web/HTML/Element
+ const HTML_TAGS = 'html,body,base,head,link,meta,style,title,address,article,aside,footer,' +
+ 'header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,' +
+ 'figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,' +
+ 'data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,' +
+ 'time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,' +
+ 'canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,' +
+ 'th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,' +
+ 'option,output,progress,select,textarea,details,dialog,menu,' +
+ 'summary,template,blockquote,iframe,tfoot';
+ // https://developer.mozilla.org/en-US/docs/Web/SVG/Element
+ const SVG_TAGS = 'svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,' +
+ 'defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,' +
+ 'feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,' +
+ 'feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,' +
+ 'feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,' +
+ 'fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,' +
+ 'foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,' +
+ 'mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,' +
+ 'polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,' +
+ 'text,textPath,title,tspan,unknown,use,view';
+ const VOID_TAGS = 'area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr';
+ /**
+ * Compiler only.
+ * Do NOT use in runtime code paths unless behind `true` flag.
+ */
+ const isHTMLTag = /*#__PURE__*/ makeMap(HTML_TAGS);
+ /**
+ * Compiler only.
+ * Do NOT use in runtime code paths unless behind `true` flag.
+ */
+ const isSVGTag = /*#__PURE__*/ makeMap(SVG_TAGS);
+ /**
+ * Compiler only.
+ * Do NOT use in runtime code paths unless behind `true` flag.
+ */
+ const isVoidTag = /*#__PURE__*/ makeMap(VOID_TAGS);
+
+ /**
+ * On the client we only need to offer special cases for boolean attributes that
+ * have different names from their corresponding dom properties:
+ * - itemscope -> N/A
+ * - allowfullscreen -> allowFullscreen
+ * - formnovalidate -> formNoValidate
+ * - ismap -> isMap
+ * - nomodule -> noModule
+ * - novalidate -> noValidate
+ * - readonly -> readOnly
+ */
+ const specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;
+ const isSpecialBooleanAttr = /*#__PURE__*/ makeMap(specialBooleanAttrs);
+ /**
+ * Boolean attributes should be included if the value is truthy or ''.
+ * e.g. `