Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
jinli gu
Litemall
Commits
9eaf2db3
Commit
9eaf2db3
authored
Aug 01, 2018
by
Menethil
Browse files
修复上传TOKEN问题
parent
23311bab
Changes
14
Hide whitespace changes
Inline
Side-by-side
litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/annotation/support/LoginAdminHandlerMethodArgumentResolver.java
View file @
9eaf2db3
...
...
@@ -10,7 +10,7 @@ import org.springframework.web.method.support.ModelAndViewContainer;
public
class
LoginAdminHandlerMethodArgumentResolver
implements
HandlerMethodArgumentResolver
{
public
static
final
String
LOGIN_TOKEN_KEY
=
"
X
-Token"
;
public
static
final
String
LOGIN_TOKEN_KEY
=
"
Admin
-Token"
;
@Override
public
boolean
supportsParameter
(
MethodParameter
parameter
)
{
return
parameter
.
getParameterType
().
isAssignableFrom
(
Integer
.
class
)&&
parameter
.
hasParameterAnnotation
(
LoginAdmin
.
class
);
...
...
litemall-admin/config/dep.env.js
View file @
9eaf2db3
module
.
exports
=
{
NODE_ENV
:
'
"production"
'
,
ENV_CONFIG
:
'
"dep"
'
,
BASE_API
:
'
"http://
122.152.206.172
:8080/admin"
'
BASE_API
:
'
"http://
localhost
:8080/admin"
'
}
litemall-admin/src/components/Upload/singleImage.vue
View file @
9eaf2db3
<
template
>
<div
class=
"upload-container"
>
<el-upload
class=
"image-uploader"
:data=
"dataObj"
drag
:multiple=
"false"
:show-file-list=
"false"
action=
"https://httpbin.org/post"
<el-upload
class=
"image-uploader"
:data=
"dataObj"
:headers=
"headers"
drag
:multiple=
"false"
:show-file-list=
"false"
action=
"https://httpbin.org/post"
:on-success=
"handleImageScucess"
>
<i
class=
"el-icon-upload"
></i>
<div
class=
"el-upload__text"
>
将文件拖到此处,或
<em>
点击上传
</em></div>
...
...
@@ -28,6 +28,11 @@ export default {
computed
:
{
imageUrl
()
{
return
this
.
value
},
headers
()
{
return
{
'
Admin-Token
'
:
getToken
()
}
}
},
data
()
{
...
...
litemall-admin/src/components/Upload/singleImage2.vue
View file @
9eaf2db3
<
template
>
<div
class=
"singleImageUpload2 upload-container"
>
<el-upload
class=
"image-uploader"
:data=
"dataObj"
drag
:multiple=
"false"
:show-file-list=
"false"
action=
"https://httpbin.org/post"
<el-upload
class=
"image-uploader"
:data=
"dataObj"
:headers=
"headers"
drag
:multiple=
"false"
:show-file-list=
"false"
action=
"https://httpbin.org/post"
:on-success=
"handleImageScucess"
>
<i
class=
"el-icon-upload"
></i>
<div
class=
"el-upload__text"
>
Drag或
<em>
点击上传
</em></div>
...
...
@@ -27,6 +27,11 @@ export default {
computed
:
{
imageUrl
()
{
return
this
.
value
},
headers
()
{
return
{
'
Admin-Token
'
:
getToken
()
}
}
},
data
()
{
...
...
litemall-admin/src/components/Upload/singleImage3.vue
View file @
9eaf2db3
<
template
>
<div
class=
"upload-container"
>
<el-upload
class=
"image-uploader"
:data=
"dataObj"
drag
:multiple=
"false"
:show-file-list=
"false"
action=
"https://httpbin.org/post"
<el-upload
class=
"image-uploader"
:data=
"dataObj"
:headers=
"headers"
drag
:multiple=
"false"
:show-file-list=
"false"
action=
"https://httpbin.org/post"
:on-success=
"handleImageScucess"
>
<i
class=
"el-icon-upload"
></i>
<div
class=
"el-upload__text"
>
将文件拖到此处,或
<em>
点击上传
</em></div>
...
...
@@ -35,6 +35,11 @@ export default {
computed
:
{
imageUrl
()
{
return
this
.
value
},
headers
()
{
return
{
'
Admin-Token
'
:
getToken
()
}
}
},
data
()
{
...
...
litemall-admin/src/utils/request.js
View file @
9eaf2db3
...
...
@@ -13,7 +13,7 @@ const service = axios.create({
service
.
interceptors
.
request
.
use
(
config
=>
{
// Do something before request is sent
if
(
store
.
getters
.
token
)
{
config
.
headers
[
'
X
-Token
'
]
=
getToken
()
// 让每个请求携带token-- ['
X
-Token']为自定义key 请根据实际情况自行修改
config
.
headers
[
'
Admin
-Token
'
]
=
getToken
()
// 让每个请求携带token-- ['
Admin
-Token']为自定义key 请根据实际情况自行修改
}
return
config
},
error
=>
{
...
...
litemall-admin/src/views/goods/comment.vue
View file @
9eaf2db3
...
...
@@ -66,7 +66,7 @@
</el-form-item>
<el-form-item
label=
"评论图片"
prop=
"picUrls"
>
<!-- <el-input v-model="dataForm.picUrls"></el-input> -->
<el-upload
action=
"#"
list-type=
"picture"
:show-file-list=
"false"
:limit=
"5"
:http-request=
"uploadPicUrls"
>
<el-upload
action=
"#"
list-type=
"picture"
:headers=
"headers"
:show-file-list=
"false"
:limit=
"5"
:http-request=
"uploadPicUrls"
>
<el-button
size=
"small"
type=
"primary"
>
点击上传
</el-button>
</el-upload>
</el-form-item>
...
...
@@ -98,9 +98,17 @@
<
script
>
import
{
listComment
,
createComment
,
updateComment
,
deleteComment
}
from
'
@/api/comment
'
import
{
createStorage
}
from
'
@/api/storage
'
import
{
getToken
}
from
'
@/utils/auth
'
export
default
{
name
:
'
Comment
'
,
computed
:
{
headers
()
{
return
{
'
Admin-Token
'
:
getToken
()
}
}
},
data
()
{
return
{
list
:
undefined
,
...
...
@@ -260,4 +268,4 @@ export default {
}
}
}
</
script
>
\ No newline at end of file
</
script
>
litemall-admin/src/views/goods/create.vue
View file @
9eaf2db3
<
template
>
<div
class=
"app-container calendar-list-container"
>
<el-card
class=
"box-card"
>
<h3>
商品介绍
</h3>
<el-form
:rules=
"rules"
ref=
"goods"
:model=
"goods"
label-width=
"150px"
>
<el-card
class=
"box-card"
>
<h3>
商品介绍
</h3>
<el-form
:rules=
"rules"
ref=
"goods"
:model=
"goods"
label-width=
"150px"
>
<el-form-item
label=
"商品编号"
prop=
"goodsSn"
>
<el-input
v-model=
"goods.goodsSn"
></el-input>
</el-form-item>
<el-form-item
label=
"商品名称"
prop=
"name"
>
<el-input
v-model=
"goods.name"
></el-input>
</el-form-item>
</el-form-item>
<el-form-item
label=
"专柜价格"
prop=
"counterPrice"
>
<el-input
v-model=
"goods.counterPrice"
placeholder=
"0.00"
>
<template
slot=
"append"
>
元
</
template
>
...
...
@@ -19,7 +19,7 @@
<el-input
v-model=
"goods.retailPrice"
placeholder=
"0.00"
>
<
template
slot=
"append"
>
元
</
template
>
</el-input>
</el-form-item>
</el-form-item>
<el-form-item
label=
"是否新品"
prop=
"isNew"
>
<el-radio-group
v-model=
"goods.isNew"
>
<el-radio
:label=
"true"
>
新品
</el-radio>
...
...
@@ -31,44 +31,47 @@
<el-radio
:label=
"false"
>
普通
</el-radio>
<el-radio
:label=
"true"
>
热卖
</el-radio>
</el-radio-group>
</el-form-item>
</el-form-item>
<el-form-item
label=
"是否在售"
prop=
"isOnSale"
>
<el-radio-group
v-model=
"goods.isOnSale"
>
<el-radio
:label=
"true"
>
在售
</el-radio>
<el-radio
:label=
"false"
>
未售
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"商品图片"
>
<el-upload
class=
"avatar-uploader"
:action=
"uploadPath"
list-type=
"picture-card"
:show-file-list=
"false"
accept=
".jpg,.jpeg,.png,.gif"
:on-success=
"uploadPicUrl"
>
<img
v-if=
"goods.picUrl"
:src=
"goods.picUrl"
class=
"avatar"
>
<i
v-else
class=
"el-icon-plus avatar-uploader-icon"
></i>
<el-upload
class=
"avatar-uploader"
:action=
"uploadPath"
list-type=
"picture-card"
:show-file-list=
"false"
:headers=
"headers"
accept=
".jpg,.jpeg,.png,.gif"
:on-success=
"uploadPicUrl"
>
<img
v-if=
"goods.picUrl"
:src=
"goods.picUrl"
class=
"avatar"
>
<i
v-else
class=
"el-icon-plus avatar-uploader-icon"
></i>
</el-upload>
</el-form-item>
<el-form-item
label=
"宣传画廊"
>
<el-upload
:action=
"uploadPath"
:limit=
"5"
multiple
accept=
".jpg,.jpeg,.png,.gif"
list-type=
"picture-card"
:on-exceed=
"uploadOverrun"
:on-success=
"handleGalleryUrl"
:on-remove=
"handleRemove"
>
<i
class=
"el-icon-plus"
></i>
<el-upload
:action=
"uploadPath"
:limit=
"5"
multiple
accept=
".jpg,.jpeg,.png,.gif"
list-type=
"picture-card"
:headers=
"headers"
:on-exceed=
"uploadOverrun"
:on-success=
"handleGalleryUrl"
:on-remove=
"handleRemove"
>
<i
class=
"el-icon-plus"
></i>
</el-upload>
</el-form-item>
</el-form-item>
<el-form-item
label=
"商品单位"
>
<el-input
v-model=
"goods.unit"
placeholder=
"件 / 个 / 盒"
></el-input>
</el-form-item>
<el-form-item
label=
"关键字"
>
<el-tag
:key=
"tag"
v-for=
"tag in keywords"
closable
type=
"primary"
@
close=
"handleClose(tag)"
>
{{tag}}
</el-tag>
<el-input
class=
"input-new-keyword"
v-if=
"newKeywordVisible"
v-model=
"newKeyword"
ref=
"newKeywordInput"
size=
"small"
@
keyup.enter.native=
"handleInputConfirm"
@
blur=
"handleInputConfirm"
>
<el-input
class=
"input-new-keyword"
v-if=
"newKeywordVisible"
v-model=
"newKeyword"
ref=
"newKeywordInput"
size=
"small"
@
keyup.enter.native=
"handleInputConfirm"
@
blur=
"handleInputConfirm"
>
</el-input>
<el-button
v-else
class=
"button-new-keyword"
size=
"small"
type=
"primary"
@
click=
"showInput"
>
+ 增加
</el-button>
</el-form-item>
<el-form-item
label=
"所属分类"
>
<el-cascader
expand-trigger=
"hover"
:options=
"categoryList"
@
change=
"handleCategoryChange"
></el-cascader>
</el-form-item>
<el-form-item
label=
"所属品牌商"
>
<el-select
v-model=
"goods.brandId"
>
<el-option
v-for=
"item in brandList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
>
...
...
@@ -78,20 +81,20 @@
<el-form-item
label=
"商品简介"
>
<el-input
v-model=
"goods.brief"
></el-input>
</el-form-item>
</el-form-item>
<el-form-item
label=
"商品详细介绍"
>
<editor
:init=
"editorInit"
v-model=
"goods.detail"
></editor>
</el-form-item>
</el-form>
</el-card>
</el-form-item>
</el-form>
</el-card>
<el-card
class=
"box-card"
>
<el-card
class=
"box-card"
>
<h3>
商品规格
</h3>
<el-row
type=
"flex"
align=
"middle"
:gutter=
"20"
style=
"padding:20px 0;"
>
<el-col
:span=
"10"
>
<el-col
:span=
"10"
>
<el-radio-group
v-model=
"multipleSpec"
@
change=
"specChanged"
>
<el-radio-button
:label=
"false"
>
默认标准规格
</el-radio-button>
<el-radio-button
:label=
"false"
>
默认标准规格
</el-radio-button>
<el-radio-button
:label=
"true"
>
多规格支持
</el-radio-button>
</el-radio-group>
</el-col>
...
...
@@ -101,8 +104,8 @@
</el-row>
<el-table
:data=
"specifications"
>
<el-table-column
property=
"specification"
label=
"规格名"
></el-table-column>
<el-table-column
property=
"value"
label=
"规格值"
>
<el-table-column
property=
"specification"
label=
"规格名"
></el-table-column>
<el-table-column
property=
"value"
label=
"规格值"
>
<
template
slot-scope=
"scope"
>
<el-tag
type=
"primary"
>
{{
scope
.
row
.
value
}}
...
...
@@ -114,39 +117,42 @@
<img
:src=
"scope.row.picUrl"
width=
"40"
v-if=
"scope.row.picUrl"
/>
</
template
>
</el-table-column>
<el-table-column
align=
"center"
label=
"操作"
width=
"250"
class-name=
"small-padding fixed-width"
v-if=
"multipleSpec"
>
<el-table-column
align=
"center"
label=
"操作"
width=
"250"
class-name=
"small-padding fixed-width"
v-if=
"multipleSpec"
>
<
template
slot-scope=
"scope"
>
<el-button
type=
"danger"
size=
"mini"
@
click=
"handleSpecificationDelete(scope.row)"
>
删除
</el-button>
<el-button
type=
"danger"
size=
"mini"
@
click=
"handleSpecificationDelete(scope.row)"
>
删除
</el-button>
</
template
>
</el-table-column>
</el-table-column>
</el-table>
<el-dialog
title=
"设置规格"
:visible.sync=
"specVisiable"
>
<el-form
:rules=
"rules"
ref=
"specForm"
:model=
"specForm"
status-icon
label-position=
"left"
label-width=
"100px"
style=
'width: 400px; margin-left:50px;'
>
<el-form-item
label=
"规格名"
prop=
"specification"
>
<el-input
v-model=
"specForm.specification"
></el-input>
</el-form-item>
<el-form-item
label=
"规格值"
prop=
"value"
>
<el-input
v-model=
"specForm.value"
></el-input>
</el-form-item>
<el-form-item
label=
"规格图片"
prop=
"picUrl"
>
<el-upload
class=
"avatar-uploader"
:action=
'uploadPath'
list-type=
"picture-card"
:show-file-list=
"false"
accept=
".jpg,.jpeg,.png,.gif"
:on-success=
"uploadSpecPicUrl"
>
<img
v-if=
"specForm.picUrl"
:src=
"specForm.picUrl"
class=
"avatar"
>
<i
v-else
class=
"el-icon-plus avatar-uploader-icon"
></i>
</el-upload>
</el-form-item>
</el-form>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"specVisiable = false"
>
取消
</el-button>
<el-button
type=
"primary"
@
click=
"handleSpecificationAdd"
>
确定
</el-button>
</div>
<el-form
:rules=
"rules"
ref=
"specForm"
:model=
"specForm"
status-icon
label-position=
"left"
label-width=
"100px"
style=
'width: 400px; margin-left:50px;'
>
<el-form-item
label=
"规格名"
prop=
"specification"
>
<el-input
v-model=
"specForm.specification"
></el-input>
</el-form-item>
<el-form-item
label=
"规格值"
prop=
"value"
>
<el-input
v-model=
"specForm.value"
></el-input>
</el-form-item>
<el-form-item
label=
"规格图片"
prop=
"picUrl"
>
<el-upload
class=
"avatar-uploader"
:action=
'uploadPath'
list-type=
"picture-card"
:show-file-list=
"false"
:headers=
"headers"
accept=
".jpg,.jpeg,.png,.gif"
:on-success=
"uploadSpecPicUrl"
>
<img
v-if=
"specForm.picUrl"
:src=
"specForm.picUrl"
class=
"avatar"
>
<i
v-else
class=
"el-icon-plus avatar-uploader-icon"
></i>
</el-upload>
</el-form-item>
</el-form>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"specVisiable = false"
>
取消
</el-button>
<el-button
type=
"primary"
@
click=
"handleSpecificationAdd"
>
确定
</el-button>
</div>
</el-dialog>
</el-card>
<el-card
class=
"box-card"
>
<h3>
商品库存
</h3>
<el-table
:data=
"products"
>
<el-table-column
property=
"value"
label=
"货品规格"
>
<el-table
:data=
"products"
>
<el-table-column
property=
"value"
label=
"货品规格"
>
<
template
slot-scope=
"scope"
>
<el-tag
:key=
"tag"
v-for=
"tag in scope.row.specifications"
>
{{
tag
}}
...
...
@@ -166,33 +172,35 @@
<
template
slot-scope=
"scope"
>
<el-button
type=
"primary"
size=
"mini"
@
click=
"handleProductShow(scope.row)"
>
设置
</el-button>
</
template
>
</el-table-column>
</el-table-column>
</el-table>
<el-dialog
title=
"设置货品"
:visible.sync=
"productVisiable"
>
<el-form
ref=
"productForm"
:model=
"productForm"
status-icon
label-position=
"left"
label-width=
"100px"
style=
'width: 400px; margin-left:50px;'
>
<el-form-item
label=
"货品规格列"
prop=
"specifications"
>
<el-tag
:key=
"tag"
v-for=
"tag in productForm.specifications"
>
{{tag}}
</el-tag>
</el-form-item>
<el-form-item
label=
"货品售价"
prop=
"price"
>
<el-input
v-model=
"productForm.price"
></el-input>
</el-form-item>
<el-form-item
label=
"货品数量"
prop=
"number"
>
<el-input
v-model=
"productForm.number"
></el-input>
</el-form-item>
<el-form-item
label=
"货品图片"
prop=
"url"
>
<el-upload
class=
"avatar-uploader"
:action=
'uploadPath'
list-type=
"picture-card"
:show-file-list=
"false"
accept=
".jpg,.jpeg,.png,.gif"
:on-success=
"uploadProductUrl"
>
<img
v-if=
"productForm.url"
:src=
"productForm.url"
class=
"avatar"
>
<i
v-else
class=
"el-icon-plus avatar-uploader-icon"
></i>
</el-upload>
</el-form-item>
</el-form>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"productVisiable = false"
>
取消
</el-button>
<el-button
type=
"primary"
@
click=
"handleProductEdit"
>
确定
</el-button>
</div>
<el-form
ref=
"productForm"
:model=
"productForm"
status-icon
label-position=
"left"
label-width=
"100px"
style=
'width: 400px; margin-left:50px;'
>
<el-form-item
label=
"货品规格列"
prop=
"specifications"
>
<el-tag
:key=
"tag"
v-for=
"tag in productForm.specifications"
>
{{tag}}
</el-tag>
</el-form-item>
<el-form-item
label=
"货品售价"
prop=
"price"
>
<el-input
v-model=
"productForm.price"
></el-input>
</el-form-item>
<el-form-item
label=
"货品数量"
prop=
"number"
>
<el-input
v-model=
"productForm.number"
></el-input>
</el-form-item>
<el-form-item
label=
"货品图片"
prop=
"url"
>
<el-upload
class=
"avatar-uploader"
:action=
'uploadPath'
list-type=
"picture-card"
:show-file-list=
"false"
:headers=
"headers"
accept=
".jpg,.jpeg,.png,.gif"
:on-success=
"uploadProductUrl"
>
<img
v-if=
"productForm.url"
:src=
"productForm.url"
class=
"avatar"
>
<i
v-else
class=
"el-icon-plus avatar-uploader-icon"
></i>
</el-upload>
</el-form-item>
</el-form>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"productVisiable = false"
>
取消
</el-button>
<el-button
type=
"primary"
@
click=
"handleProductEdit"
>
确定
</el-button>
</div>
</el-dialog>
</el-card>
...
...
@@ -206,24 +214,25 @@
</el-table-column>
<el-table-column
align=
"center"
label=
"操作"
width=
"100"
class-name=
"small-padding fixed-width"
>
<
template
slot-scope=
"scope"
>
<el-button
type=
"danger"
size=
"mini"
@
click=
"handleAttributeDelete(scope.row)"
>
删除
</el-button>
<el-button
type=
"danger"
size=
"mini"
@
click=
"handleAttributeDelete(scope.row)"
>
删除
</el-button>
</
template
>
</el-table-column>
</el-table-column>
</el-table>
<el-dialog
title=
"设置商品参数"
:visible.sync=
"attributeVisiable"
>
<el-form
ref=
"attributeForm"
:model=
"attributeForm"
status-icon
label-position=
"left"
label-width=
"100px"
style=
'width: 400px; margin-left:50px;'
>
<el-form-item
label=
"商品参数名称"
prop=
"attribute"
>
<el-input
v-model=
"attributeForm.attribute"
></el-input>
</el-form-item>
<el-form-item
label=
"商品参数值"
prop=
"value"
>
<el-input
v-model=
"attributeForm.value"
></el-input>
</el-form-item>
</el-form>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"attributeVisiable = false"
>
取消
</el-button>
<el-button
type=
"primary"
@
click=
"handleAttributeAdd"
>
确定
</el-button>
</div>
<el-form
ref=
"attributeForm"
:model=
"attributeForm"
status-icon
label-position=
"left"
label-width=
"100px"
style=
'width: 400px; margin-left:50px;'
>
<el-form-item
label=
"商品参数名称"
prop=
"attribute"
>
<el-input
v-model=
"attributeForm.attribute"
></el-input>
</el-form-item>
<el-form-item
label=
"商品参数值"
prop=
"value"
>
<el-input
v-model=
"attributeForm.value"
></el-input>
</el-form-item>
</el-form>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"attributeVisiable = false"
>
取消
</el-button>
<el-button
type=
"primary"
@
click=
"handleAttributeAdd"
>
确定
</el-button>
</div>
</el-dialog>
</el-card>
...
...
@@ -239,305 +248,321 @@
.el-card
{
margin-bottom
:
10px
;
}
.el-tag
+
.el-tag
{
margin-left
:
10px
;
}
.input-new-keyword
{
width
:
90px
;
margin-left
:
10px
;
vertical-align
:
bottom
;
}
.avatar-uploader
.el-upload
{
border
:
1px
dashed
#d9d9d9
;
border-radius
:
6px
;
cursor
:
pointer
;
position
:
relative
;
overflow
:
hidden
;
}
.avatar-uploader
.el-upload
:hover
{
border-color
:
#20a0ff
;
}
.avatar-uploader-icon
{
font-size
:
28px
;
color
:
#8c939d
;
width
:
120px
;
height
:
120px
;
line-height
:
120px
;
text-align
:
center
;
}
.avatar
{
width
:
120px
;
height
:
120px
;
display
:
block
;
}
border
:
1px
dashed
#d9d9d9
;
border-radius
:
6px
;
cursor
:
pointer
;
position
:
relative
;
overflow
:
hidden
;
}
.avatar-uploader
.el-upload
:hover
{
border-color
:
#20a0ff
;
}
.avatar-uploader-icon
{
font-size
:
28px
;
color
:
#8c939d
;
width
:
120px
;
height
:
120px
;
line-height
:
120px
;
text-align
:
center
;
}
.avatar
{
width
:
120px
;
height
:
120px
;
display
:
block
;
}
</
style
>
<
script
>
import
{
publishGoods
,
listCatAndBrand
}
from
'
@/api/goods
'
import
{
createStorage
,
uploadPath
}
from
'
@/api/storage
'
import
Editor
from
'
@tinymce/tinymce-vue
'
import
{
MessageBox
}
from
'
element-ui
'
export
default
{
name
:
'
GoodsCreate
'
,
components
:
{
Editor
},
data
()
{
return
{
uploadPath
,
newKeywordVisible
:
false
,
newKeyword
:
''
,
keywords
:
[],
categoryList
:
[],
brandList
:
[],
goods
:
{
picUrl
:
''
,
gallery
:
[]
},
specVisiable
:
false
,
specForm
:
{
specification
:
''
,
value
:
''
,
picUrl
:
''
},
multipleSpec
:
false
,
specifications
:
[{
specification
:
'
规格
'
,
value
:
'
标准
'
,
picUrl
:
''
}],
productVisiable
:
false
,
productForm
:
{
id
:
0
,
specifications
:
[],
price
:
0.00
,
number
:
0
,
url
:
''
},
products
:
[{
id
:
0
,
specifications
:
[
'
标准
'
],
price
:
0.00
,
number
:
0
,
url
:
''
}],
attributeVisiable
:
false
,
attributeForm
:
{
attribute
:
''
,
value
:
''
},
attributes
:
[],
rules
:
{
goodsSn
:
[{
required
:
true
,
message
:
'
商品编号不能为空
'
,
trigger
:
'
blur
'
}],
name
:
[{
required
:
true
,
message
:
'
商品名称不能为空
'
,
trigger
:
'
blur
'
}]
},
editorInit
:
{
language
:
'
zh_CN
'
,
plugins
:
[
'
advlist anchor autolink autoresize autosave emoticons fullscreen hr image imagetools importcss insertdatetime legacyoutput link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace tabfocus table template textcolor textpattern visualblocks visualchars wordcount
'
],
toolbar
:
[
'
bold italic underline strikethrough alignleft aligncenter alignright outdent indent blockquote undo redo removeformat subscript superscript
'
,
'
hr bullist numlist link image charmap preview anchor pagebreak fullscreen media table emoticons forecolor backcolor
'
],
images_upload_handler
:
function
(
blobInfo
,
success
,
failure
)
{
const
formData
=
new
FormData
()
formData
.
append
(
'
file
'
,
blobInfo
.
blob
())
createStorage
(
formData
).
then
(
res
=>
{
success
(
res
.
data
.
data
.
url
)
}).
catch
(()
=>
{
failure
(
'
上传失败,请重新上传
'
)
})
import
{
publishGoods
,
listCatAndBrand
}
from
'
@/api/goods
'
import
{
createStorage
,
uploadPath
}
from
'
@/api/storage
'
import
Editor
from
'
@tinymce/tinymce-vue
'
import
{
MessageBox
}
from
'
element-ui
'
import
{
getToken
}
from
'
@/utils/auth
'
export
default
{
name
:
'
GoodsCreate
'
,
components
:
{
Editor
},
computed
:
{
headers
()
{
return
{
'
Admin-Token
'
:
getToken
()
}
}
}
},
created
()
{
this
.
init
()
},
methods
:
{
init
:
function
()
{
listCatAndBrand
().
then
(
response
=>
{
this
.
categoryList
=
response
.
data
.
data
.
categoryList
this
.
brandList
=
response
.
data
.
data
.
brandList
})
},
handleCategoryChange
(
value
)
{
this
.
goods
.
categoryId
=
value
[
value
.
length
-
1
]
data
()
{
return
{
uploadPath
,
newKeywordVisible
:
false
,
newKeyword
:
''
,
keywords
:
[],
categoryList
:
[],
brandList
:
[],
goods
:
{
picUrl
:
''
,
gallery
:
[]
},
specVisiable
:
false
,
specForm
:
{
specification
:
''
,
value
:
''
,
picUrl
:
''
},
multipleSpec
:
false
,
specifications
:
[{
specification
:
'
规格
'
,
value
:
'
标准
'
,
picUrl
:
''
}],
productVisiable
:
false
,
productForm
:
{
id
:
0
,
specifications
:
[],
price
:
0.00
,
number
:
0
,
url
:
''
},
products
:
[{
id
:
0
,
specifications
:
[
'
标准
'
],
price
:
0.00
,
number
:
0
,
url
:
''
}],
attributeVisiable
:
false
,
attributeForm
:
{
attribute
:
''
,
value
:
''
},
attributes
:
[],
rules
:
{
goodsSn
:
[{
required
:
true
,
message
:
'
商品编号不能为空
'
,
trigger
:
'
blur
'
}],
name
:
[{
required
:
true
,
message
:
'
商品名称不能为空
'
,
trigger
:
'
blur
'
}]
},
editorInit
:
{
language
:
'
zh_CN
'
,
plugins
:
[
'
advlist anchor autolink autoresize autosave emoticons fullscreen hr image imagetools importcss insertdatetime legacyoutput link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace tabfocus table template textcolor textpattern visualblocks visualchars wordcount
'
],
toolbar
:
[
'
bold italic underline strikethrough alignleft aligncenter alignright outdent indent blockquote undo redo removeformat subscript superscript
'
,
'
hr bullist numlist link image charmap preview anchor pagebreak fullscreen media table emoticons forecolor backcolor
'
],
images_upload_handler
:
function
(
blobInfo
,
success
,
failure
)
{
const
formData
=
new
FormData
()
formData
.
append
(
'
file
'
,
blobInfo
.
blob
())
createStorage
(
formData
).
then
(
res
=>
{
success
(
res
.
data
.
data
.
url
)
}).
catch
(()
=>
{
failure
(
'
上传失败,请重新上传
'
)
})
}
}
}
},
handleCancel
:
function
()
{
this
.
$router
.
push
({
path
:
'
/goods/goods
'
}
)
created
()
{
this
.
init
(
)
},
handlePublish
:
function
()
{
const
finalGoods
=
{
goods
:
this
.
goods
,
specifications
:
this
.
specifications
,
products
:
this
.
products
,
attributes
:
this
.
attributes
}
publishGoods
(
finalGoods
).
then
(
response
=>
{
this
.
$notify
({
title
:
'
成功
'
,
message
:
'
创建成功
'
,
type
:
'
success
'
,
duration
:
2000
methods
:
{
init
:
function
()
{
listCatAndBrand
().
then
(
response
=>
{
this
.
categoryList
=
response
.
data
.
data
.
categoryList
this
.
brandList
=
response
.
data
.
data
.
brandList
})
this
.
$router
.
push
({
path
:
'
/goods/list
'
})
}).
catch
(
response
=>
{
MessageBox
.
alert
(
'
业务错误:
'
+
response
.
data
.
errmsg
,
'
警告
'
,
{
confirmButtonText
:
'
确定
'
,
type
:
'
error
'
},
handleCategoryChange
(
value
)
{
this
.
goods
.
categoryId
=
value
[
value
.
length
-
1
]
},
handleCancel
:
function
()
{
this
.
$router
.
push
({
path
:
'
/goods/goods
'
})
},
handlePublish
:
function
()
{
const
finalGoods
=
{
goods
:
this
.
goods
,
specifications
:
this
.
specifications
,
products
:
this
.
products
,
attributes
:
this
.
attributes
}
publishGoods
(
finalGoods
).
then
(
response
=>
{
this
.
$notify
({
title
:
'
成功
'
,
message
:
'
创建成功
'
,
type
:
'
success
'
,
duration
:
2000
})
this
.
$router
.
push
({
path
:
'
/goods/list
'
})
}).
catch
(
response
=>
{
MessageBox
.
alert
(
'
业务错误:
'
+
response
.
data
.
errmsg
,
'
警告
'
,
{
confirmButtonText
:
'
确定
'
,
type
:
'
error
'
})
})
})
},
handleClose
(
tag
)
{
this
.
keywords
.
splice
(
this
.
keywords
.
indexOf
(
tag
),
1
)
this
.
goods
.
keywords
=
this
.
keywords
.
toString
()
},
showInput
()
{
this
.
newKeywordVisible
=
true
this
.
$nextTick
(
_
=>
{
this
.
$refs
.
newKeywordInput
.
$refs
.
input
.
focus
()
})
},
handleInputConfirm
()
{
const
newKeyword
=
this
.
newKeyword
if
(
newKeyword
)
{
this
.
keywords
.
push
(
newKeyword
)
},
handleClose
(
tag
)
{
this
.
keywords
.
splice
(
this
.
keywords
.
indexOf
(
tag
),
1
)
this
.
goods
.
keywords
=
this
.
keywords
.
toString
()
}
this
.
newKeywordVisible
=
false
this
.
newKeyword
=
''
},
uploadPicUrl
:
function
(
response
)
{
this
.
goods
.
picUrl
=
response
.
data
.
url
},
uploadOverrun
:
function
()
{
this
.
$message
({
type
:
'
error
'
,
message
:
'
上传文件个数超出限制!最多上传5张图片!
'
})
},
handleGalleryUrl
(
response
,
file
,
fileList
)
{
if
(
response
.
errno
===
0
)
{
this
.
goods
.
gallery
.
push
(
response
.
data
.
url
)
}
},
handleRemove
:
function
(
file
,
fileList
)
{
for
(
var
i
=
0
;
i
<
this
.
goods
.
gallery
.
length
;
i
++
)
{
// 这里存在两种情况
// 1. 如果所删除图片是刚刚上传的图片,那么图片地址是file.response.data.url
// 此时的file.url虽然存在,但是是本机地址,而不是远程地址。
// 2. 如果所删除图片是后台返回的已有图片,那么图片地址是file.url
var
url
if
(
file
.
response
===
undefined
)
{
url
=
file
.
url
}
else
{
url
=
file
.
response
.
data
.
url
},
showInput
()
{
this
.
newKeywordVisible
=
true
this
.
$nextTick
(
_
=>
{
this
.
$refs
.
newKeywordInput
.
$refs
.
input
.
focus
()
})
},
handleInputConfirm
()
{
const
newKeyword
=
this
.
newKeyword
if
(
newKeyword
)
{
this
.
keywords
.
push
(
newKeyword
)
this
.
goods
.
keywords
=
this
.
keywords
.
toString
()
}
this
.
newKeywordVisible
=
false
this
.
newKeyword
=
''
},
uploadPicUrl
:
function
(
response
)
{
this
.
goods
.
picUrl
=
response
.
data
.
url
},
uploadOverrun
:
function
()
{
this
.
$message
({
type
:
'
error
'
,
message
:
'
上传文件个数超出限制!最多上传5张图片!
'
})
},
handleGalleryUrl
(
response
,
file
,
fileList
)
{
if
(
response
.
errno
===
0
)
{
this
.
goods
.
gallery
.
push
(
response
.
data
.
url
)
}
},
handleRemove
:
function
(
file
,
fileList
)
{
for
(
var
i
=
0
;
i
<
this
.
goods
.
gallery
.
length
;
i
++
)
{
// 这里存在两种情况
// 1. 如果所删除图片是刚刚上传的图片,那么图片地址是file.response.data.url
// 此时的file.url虽然存在,但是是本机地址,而不是远程地址。
// 2. 如果所删除图片是后台返回的已有图片,那么图片地址是file.url
var
url
if
(
file
.
response
===
undefined
)
{
url
=
file
.
url
}
else
{
url
=
file
.
response
.
data
.
url
}
if
(
this
.
goods
.
gallery
[
i
]
===
url
)
{
this
.
goods
.
gallery
.
splice
(
i
,
1
)
if
(
this
.
goods
.
gallery
[
i
]
===
url
)
{
this
.
goods
.
gallery
.
splice
(
i
,
1
)
}
}
}
},
specChanged
:
function
(
label
)
{
if
(
label
===
false
)
{
this
.
specifications
=
[{
specification
:
'
规格
'
,
value
:
'
标准
'
,
picU
rl
:
''
}]
this
.
products
=
[{
id
:
0
,
specifications
:
[
'
标准
'
],
price
:
0.00
,
number
:
0
,
url
:
''
}]
}
else
{
this
.
specification
s
=
[]
this
.
products
=
[]
}
},
uploadSpecPicUrl
:
function
(
response
)
{
this
.
specForm
.
picUrl
=
response
.
data
.
url
},
handleSpecificationShow
()
{
this
.
spec
Form
=
{
specification
:
''
,
value
:
''
,
picUrl
:
''
}
this
.
specVisiable
=
true
},
handleSpecificationAdd
()
{
var
index
=
this
.
specifications
.
length
-
1
for
(
var
i
=
0
;
i
<
this
.
specifications
.
length
;
i
++
)
{
const
v
=
this
.
specification
s
[
i
]
if
(
v
.
specification
===
this
.
specForm
.
specification
)
{
index
=
i
}
,
specChanged
:
function
(
label
)
{
if
(
label
===
false
)
{
this
.
specifications
=
[{
specification
:
'
规格
'
,
value
:
'
标准
'
,
picUrl
:
''
}]
this
.
products
=
[{
id
:
0
,
specification
s
:
[
'
标准
'
],
price
:
0.00
,
number
:
0
,
u
rl
:
''
}]
}
else
{
this
.
specifications
=
[]
this
.
product
s
=
[]
}
}
,
uploadSpecPicUrl
:
function
(
response
)
{
this
.
specForm
.
picUrl
=
response
.
data
.
url
},
handleSpecificationShow
()
{
this
.
specForm
=
{
specification
:
''
,
value
:
''
,
picUrl
:
''
}
this
.
spec
Visiable
=
true
},
handleSpecificationAdd
()
{
var
index
=
this
.
specifications
.
length
-
1
for
(
var
i
=
0
;
i
<
this
.
specifications
.
length
;
i
++
)
{
const
v
=
this
.
specifications
[
i
]
if
(
v
.
specification
==
=
this
.
specForm
.
specification
)
{
index
=
i
}
}
}
this
.
specifications
.
splice
(
index
+
1
,
0
,
this
.
specForm
)
this
.
specVisiable
=
false
this
.
specifications
.
splice
(
index
+
1
,
0
,
this
.
specForm
)
this
.
specVisiable
=
false
this
.
specToProduct
()
},
handleSpecificationDelete
(
row
)
{
const
index
=
this
.
specifications
.
indexOf
(
row
)
this
.
specifications
.
splice
(
index
,
1
)
this
.
specToProduct
()
},
specToProduct
()
{
if
(
this
.
specifications
.
length
===
0
)
{
return
}
// 根据specifications创建临时规格列表
var
specValues
=
[]
var
spec
=
this
.
specifications
[
0
].
specification
var
values
=
[]
values
.
push
(
0
)
this
.
specToProduct
()
},
handleSpecificationDelete
(
row
)
{
const
index
=
this
.
specifications
.
indexOf
(
row
)
this
.
specifications
.
splice
(
index
,
1
)
this
.
specToProduct
()
},
specToProduct
()
{
if
(
this
.
specifications
.
length
===
0
)
{
return
}
// 根据specifications创建临时规格列表
var
specValues
=
[]
var
spec
=
this
.
specifications
[
0
].
specification
var
values
=
[]
values
.
push
(
0
)
for
(
var
i
=
1
;
i
<
this
.
specifications
.
length
;
i
++
)
{
const
aspec
=
this
.
specifications
[
i
].
specification
for
(
var
i
=
1
;
i
<
this
.
specifications
.
length
;
i
++
)
{
const
aspec
=
this
.
specifications
[
i
].
specification
if
(
aspec
===
spec
)
{
values
.
push
(
i
)
}
else
{
specValues
.
push
(
values
)
spec
=
aspec
values
=
[]
values
.
push
(
i
)
if
(
aspec
===
spec
)
{
values
.
push
(
i
)
}
else
{
specValues
.
push
(
values
)
spec
=
aspec
values
=
[]
values
.
push
(
i
)
}
}
}
specValues
.
push
(
values
)
// 根据临时规格列表生产货品规格
// 算法基于 https://blog.csdn.net/tyhj_sf/article/details/53893125
var
productsIndex
=
0
var
products
=
[]
var
combination
=
[]
var
n
=
specValues
.
length
for
(
var
s
=
0
;
s
<
n
;
s
++
)
{
combination
[
s
]
=
0
}
var
index
=
0
var
isContinue
=
false
do
{
var
specifications
=
[]
for
(
var
x
=
0
;
x
<
n
;
x
++
)
{
var
z
=
specValues
[
x
][
combination
[
x
]]
specifications
.
push
(
this
.
specifications
[
z
].
value
)
specValues
.
push
(
values
)
// 根据临时规格列表生产货品规格
// 算法基于 https://blog.csdn.net/tyhj_sf/article/details/53893125
var
productsIndex
=
0
var
products
=
[]
var
combination
=
[]
var
n
=
specValues
.
length
for
(
var
s
=
0
;
s
<
n
;
s
++
)
{
combination
[
s
]
=
0
}
products
[
productsIndex
]
=
{
id
:
productsIndex
,
specifications
:
specifications
,
price
:
0.00
,
number
:
0
,
url
:
''
}
productsIndex
++
index
++
combination
[
n
-
1
]
=
index
for
(
var
j
=
n
-
1
;
j
>=
0
;
j
--
)
{
if
(
combination
[
j
]
>=
specValues
[
j
].
length
)
{
combination
[
j
]
=
0
index
=
0
if
(
j
-
1
>=
0
)
{
combination
[
j
-
1
]
=
combination
[
j
-
1
]
+
1
var
index
=
0
var
isContinue
=
false
do
{
var
specifications
=
[]
for
(
var
x
=
0
;
x
<
n
;
x
++
)
{
var
z
=
specValues
[
x
][
combination
[
x
]]
specifications
.
push
(
this
.
specifications
[
z
].
value
)
}
products
[
productsIndex
]
=
{
id
:
productsIndex
,
specifications
:
specifications
,
price
:
0.00
,
number
:
0
,
url
:
''
}
productsIndex
++
index
++
combination
[
n
-
1
]
=
index
for
(
var
j
=
n
-
1
;
j
>=
0
;
j
--
)
{
if
(
combination
[
j
]
>=
specValues
[
j
].
length
)
{
combination
[
j
]
=
0
index
=
0
if
(
j
-
1
>=
0
)
{
combination
[
j
-
1
]
=
combination
[
j
-
1
]
+
1
}
}
}
}
isContinue
=
false
for
(
var
p
=
0
;
p
<
n
;
p
++
)
{
if
(
combination
[
p
]
!==
0
)
{
isContinue
=
true
isContinue
=
false
for
(
var
p
=
0
;
p
<
n
;
p
++
)
{
if
(
combination
[
p
]
!==
0
)
{
isContinue
=
true
}
}
}
}
while
(
isContinue
)
}
while
(
isContinue
)
this
.
products
=
products
},
handleProductShow
(
row
)
{
this
.
productForm
=
Object
.
assign
({},
row
)
this
.
productVisiable
=
true
},
uploadProductUrl
:
function
(
response
)
{
this
.
productForm
.
url
=
response
.
data
.
url
},
handleProductEdit
()
{
for
(
var
i
=
0
;
i
<
this
.
products
.
length
;
i
++
)
{
const
v
=
this
.
products
[
i
]
if
(
v
.
id
===
this
.
productForm
.
id
)
{
this
.
products
.
splice
(
i
,
1
,
this
.
productForm
)
break
this
.
products
=
products
},
handleProductShow
(
row
)
{
this
.
productForm
=
Object
.
assign
({},
row
)
this
.
productVisiable
=
true
},
uploadProductUrl
:
function
(
response
)
{
this
.
productForm
.
url
=
response
.
data
.
url
},
handleProductEdit
()
{
for
(
var
i
=
0
;
i
<
this
.
products
.
length
;
i
++
)
{
const
v
=
this
.
products
[
i
]
if
(
v
.
id
===
this
.
productForm
.
id
)
{
this
.
products
.
splice
(
i
,
1
,
this
.
productForm
)
break
}
}
this
.
productVisiable
=
false
},
handleAttributeShow
()
{
this
.
attributeForm
=
{}
this
.
attributeVisiable
=
true
},
handleAttributeAdd
()
{
this
.
attributes
.
unshift
(
this
.
attributeForm
)
this
.
attributeVisiable
=
false
},
handleAttributeDelete
(
row
)
{
const
index
=
this
.
attributes
.
indexOf
(
row
)
this
.
attributes
.
splice
(
index
,
1
)
}
this
.
productVisiable
=
false
},
handleAttributeShow
()
{
this
.
attributeForm
=
{}
this
.
attributeVisiable
=
true
},
handleAttributeAdd
()
{
this
.
attributes
.
unshift
(
this
.
attributeForm
)
this
.
attributeVisiable
=
false
},
handleAttributeDelete
(
row
)
{
const
index
=
this
.
attributes
.
indexOf
(
row
)
this
.
attributes
.
splice
(
index
,
1
)
}
}
}
</
script
>
\ No newline at end of file
</
script
>
litemall-admin/src/views/goods/edit.vue
View file @
9eaf2db3
...
...
@@ -9,7 +9,7 @@
</el-form-item>
<el-form-item
label=
"商品名称"
prop=
"name"
>
<el-input
v-model=
"goods.name"
></el-input>
</el-form-item>
</el-form-item>
<el-form-item
label=
"专柜价格"
prop=
"counterPrice"
>
<el-input
v-model=
"goods.counterPrice"
placeholder=
"0.00"
>
<template
slot=
"append"
>
元
</
template
>
...
...
@@ -19,7 +19,7 @@
<el-input
v-model=
"goods.retailPrice"
placeholder=
"0.00"
>
<
template
slot=
"append"
>
元
</
template
>
</el-input>
</el-form-item>
</el-form-item>
<el-form-item
label=
"是否新品"
prop=
"isNew"
>
<el-radio-group
v-model=
"goods.isNew"
>
<el-radio
:label=
"true"
>
新品
</el-radio>
...
...
@@ -31,31 +31,31 @@
<el-radio
:label=
"false"
>
普通
</el-radio>
<el-radio
:label=
"true"
>
热卖
</el-radio>
</el-radio-group>
</el-form-item>
</el-form-item>
<el-form-item
label=
"是否在售"
prop=
"isOnSale"
>
<el-radio-group
v-model=
"goods.isOnSale"
>
<el-radio
:label=
"true"
>
在售
</el-radio>
<el-radio
:label=
"false"
>
未售
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"商品图片"
>
<el-upload
class=
"avatar-uploader"
:action=
'uploadPath'
list-type=
"picture-card"
:show-file-list=
"false"
accept=
".jpg,.jpeg,.png,.gif"
:on-success=
"uploadPicUrl"
>
<el-upload
class=
"avatar-uploader"
:headers=
"headers"
:action=
'uploadPath'
list-type=
"picture-card"
:show-file-list=
"false"
accept=
".jpg,.jpeg,.png,.gif"
:on-success=
"uploadPicUrl"
>
<img
v-if=
"goods.picUrl"
:src=
"goods.picUrl"
class=
"avatar"
>
<i
v-else
class=
"el-icon-plus avatar-uploader-icon"
></i>
</el-upload>
</el-form-item>
<el-form-item
label=
"宣传画廊"
>
<el-upload
:action=
'uploadPath'
:limit=
'5'
multiple
accept=
".jpg,.jpeg,.png,.gif"
:file-list=
"galleryFileList"
list-type=
"picture-card"
:on-exceed=
'uploadOverrun'
:on-success=
"handleGalleryUrl"
:on-remove=
"handleRemove"
>
<el-upload
:action=
'uploadPath'
:headers=
"headers"
:limit=
'5'
multiple
accept=
".jpg,.jpeg,.png,.gif"
:file-list=
"galleryFileList"
list-type=
"picture-card"
:on-exceed=
'uploadOverrun'
:on-success=
"handleGalleryUrl"
:on-remove=
"handleRemove"
>
<i
class=
"el-icon-plus"
></i>
</el-upload>
</el-form-item>
</el-form-item>
<el-form-item
label=
"商品单位"
>
<el-input
v-model=
"goods.unit"
placeholder=
"件 / 个 / 盒"
></el-input>
</el-form-item>
<el-form-item
label=
"关键字"
>
<el-tag
:key=
"tag"
v-for=
"tag in keywords"
closable
type=
"primary"
@
close=
"handleClose(tag)"
>
{{tag}}
...
...
@@ -64,11 +64,11 @@
</el-input>
<el-button
v-else
class=
"button-new-keyword"
size=
"small"
type=
"primary"
@
click=
"showInput"
>
+ 增加
</el-button>
</el-form-item>
<el-form-item
label=
"所属分类"
>
<el-cascader
expand-trigger=
"hover"
:options=
"categoryList"
v-model=
"categoryIds"
@
change=
"handleCategoryChange"
></el-cascader>
</el-form-item>
<el-form-item
label=
"所属品牌商"
>
<el-select
v-model=
"goods.brandId"
>
<el-option
v-for=
"item in brandList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
>
...
...
@@ -78,11 +78,11 @@
<el-form-item
label=
"商品简介"
>
<el-input
v-model=
"goods.brief"
></el-input>
</el-form-item>
</el-form-item>
<el-form-item
label=
"商品详细介绍"
>
<editor
:init=
"editorInit"
v-model=
"goods.detail"
></editor>
</el-form-item>
</el-form-item>
</el-form>
</el-card>
...
...
@@ -120,11 +120,11 @@
<el-input
v-model=
"specForm.value"
></el-input>
</el-form-item>
<el-form-item
label=
"规格图片"
prop=
"picUrl"
>
<el-upload
class=
"avatar-uploader"
:action=
'uploadPath'
list-type=
"picture-card"
:show-file-list=
"false"
accept=
".jpg,.jpeg,.png,.gif"
:on-success=
"uploadSpecPicUrl"
>
<el-upload
class=
"avatar-uploader"
:headers=
"headers"
:action=
'uploadPath'
list-type=
"picture-card"
:show-file-list=
"false"
accept=
".jpg,.jpeg,.png,.gif"
:on-success=
"uploadSpecPicUrl"
>
<img
v-if=
"specForm.picUrl"
:src=
"specForm.picUrl"
class=
"avatar"
>
<i
v-else
class=
"el-icon-plus avatar-uploader-icon"
></i>
</el-upload>
</el-form-item>
</el-form-item>
</el-form>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"specVisiable = false"
>
取消
</el-button>
...
...
@@ -132,7 +132,7 @@
</div>
</el-dialog>
</el-card>
<el-card
class=
"box-card"
>
<h3>
商品库存
</h3>
<el-table
:data=
"products"
>
...
...
@@ -173,11 +173,11 @@
<el-input
v-model=
"productForm.number"
></el-input>
</el-form-item>
<el-form-item
label=
"货品图片"
prop=
"url"
>
<el-upload
class=
"avatar-uploader"
:action=
'uploadPath'
list-type=
"picture-card"
:show-file-list=
"false"
accept=
".jpg,.jpeg,.png,.gif"
:on-success=
"uploadProductUrl"
>
<el-upload
class=
"avatar-uploader"
:headers=
"headers"
:action=
'uploadPath'
list-type=
"picture-card"
:show-file-list=
"false"
accept=
".jpg,.jpeg,.png,.gif"
:on-success=
"uploadProductUrl"
>
<img
v-if=
"productForm.url"
:src=
"productForm.url"
class=
"avatar"
>
<i
v-else
class=
"el-icon-plus avatar-uploader-icon"
></i>
</el-upload>
</el-form-item>
</el-form-item>
</el-form>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"productVisiable = false"
>
取消
</el-button>
...
...
@@ -208,7 +208,7 @@
</el-form-item>
<el-form-item
label=
"商品参数值"
prop=
"value"
>
<el-input
v-model=
"attributeForm.value"
></el-input>
</el-form-item>
</el-form-item>
</el-form>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"attributeVisiable = false"
>
取消
</el-button>
...
...
@@ -267,10 +267,18 @@ import { detailGoods, editGoods, listCatAndBrand } from '@/api/goods'
import
{
createStorage
,
uploadPath
}
from
'
@/api/storage
'
import
Editor
from
'
@tinymce/tinymce-vue
'
import
{
MessageBox
}
from
'
element-ui
'
import
{
getToken
}
from
'
@/utils/auth
'
export
default
{
name
:
'
GoodsEdit
'
,
components
:
{
Editor
},
computed
:
{
headers
()
{
return
{
'
Admin-Token
'
:
getToken
()
}
}
},
data
()
{
return
{
uploadPath
,
...
...
@@ -551,4 +559,4 @@ export default {
}
}
}
</
script
>
\ No newline at end of file
</
script
>
litemall-admin/src/views/mall/brand.vue
View file @
9eaf2db3
...
...
@@ -31,7 +31,7 @@
</el-table-column>
<el-table-column
align=
"center"
label=
"底价"
prop=
"floorPrice"
>
</el-table-column>
</el-table-column>
<el-table-column
align=
"center"
label=
"操作"
width=
"200"
class-name=
"small-padding fixed-width"
>
<
template
slot-scope=
"scope"
>
...
...
@@ -58,11 +58,11 @@
<el-input
v-model=
"dataForm.desc"
></el-input>
</el-form-item>
<el-form-item
label=
"品牌商图片"
prop=
"picUrl"
>
<el-upload
class=
"avatar-uploader"
:action=
'uploadPath'
list-type=
"picture-card"
:show-file-list=
"false"
accept=
".jpg,.jpeg,.png,.gif"
:on-success=
"uploadPicUrl"
>
<el-upload
class=
"avatar-uploader"
:headers=
"headers"
:action=
'uploadPath'
list-type=
"picture-card"
:show-file-list=
"false"
accept=
".jpg,.jpeg,.png,.gif"
:on-success=
"uploadPicUrl"
>
<img
v-if=
"dataForm.picUrl"
:src=
"dataForm.picUrl"
class=
"avatar"
>
<i
v-else
class=
"el-icon-plus avatar-uploader-icon"
></i>
</el-upload>
</el-form-item>
</el-form-item>
<el-form-item
label=
"底价"
prop=
"floorPrice"
>
<el-input
v-model=
"dataForm.floorPrice"
></el-input>
</el-form-item>
...
...
@@ -106,9 +106,17 @@
<
script
>
import
{
listBrand
,
createBrand
,
updateBrand
,
deleteBrand
}
from
'
@/api/brand
'
import
{
uploadPath
}
from
'
@/api/storage
'
import
{
getToken
}
from
'
@/utils/auth
'
export
default
{
name
:
'
Brand
'
,
computed
:
{
headers
()
{
return
{
'
Admin-Token
'
:
getToken
()
}
}
},
data
()
{
return
{
uploadPath
,
...
...
litemall-admin/src/views/mall/category.vue
View file @
9eaf2db3
...
...
@@ -35,7 +35,7 @@
<el-table-column
align=
"center"
label=
"关键字"
prop=
"keyword"
>
</el-table-column>
<el-table-column
align=
"center"
min-width=
"100"
label=
"简介"
prop=
"desc"
>
</el-table-column>
...
...
@@ -44,10 +44,10 @@
<
template
slot-scope=
"scope"
>
<el-tag
:type=
"scope.row.level === 'L1' ? 'primary' : 'info' "
>
{{
scope
.
row
.
level
===
'
L1
'
?
'
一级类目
'
:
'
二级类目
'
}}
</el-tag>
</
template
>
</el-table-column>
</el-table-column>
<el-table-column
align=
"center"
label=
"父类目ID"
prop=
"pid"
>
</el-table-column>
</el-table-column>
<el-table-column
align=
"center"
label=
"操作"
width=
"200"
class-name=
"small-padding fixed-width"
>
<
template
slot-scope=
"scope"
>
...
...
@@ -88,20 +88,20 @@
</el-select>
</el-form-item>
<el-form-item
label=
"类目图标"
prop=
"iconUrl"
>
<el-upload
class=
"avatar-uploader"
:action=
'uploadPath'
list-type=
"picture-card"
:show-file-list=
"false"
accept=
".jpg,.jpeg,.png,.gif"
:on-success=
"uploadIconUrl"
>
<el-upload
class=
"avatar-uploader"
:headers=
"headers"
:action=
'uploadPath'
list-type=
"picture-card"
:show-file-list=
"false"
accept=
".jpg,.jpeg,.png,.gif"
:on-success=
"uploadIconUrl"
>
<img
v-if=
"dataForm.iconUrl"
:src=
"dataForm.iconUrl"
class=
"avatar"
>
<i
v-else
class=
"el-icon-plus avatar-uploader-icon"
></i>
</el-upload>
</el-form-item>
<el-form-item
label=
"类目图片"
prop=
"picUrl"
>
<el-upload
class=
"avatar-uploader"
:action=
'uploadPath'
list-type=
"picture-card"
:show-file-list=
"false"
accept=
".jpg,.jpeg,.png,.gif"
:on-success=
"uploadPicUrl"
>
<el-upload
class=
"avatar-uploader"
:headers=
"headers"
:action=
'uploadPath'
list-type=
"picture-card"
:show-file-list=
"false"
accept=
".jpg,.jpeg,.png,.gif"
:on-success=
"uploadPicUrl"
>
<img
v-if=
"dataForm.picUrl"
:src=
"dataForm.picUrl"
class=
"avatar"
>
<i
v-else
class=
"el-icon-plus avatar-uploader-icon"
></i>
</el-upload>
</el-form-item>
</el-form-item>
<el-form-item
label=
"类目简介"
prop=
"desc"
>
<el-input
v-model=
"dataForm.desc"
></el-input>
</el-form-item>
</el-form-item>
</el-form>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"dialogFormVisible = false"
>
取消
</el-button>
...
...
@@ -142,9 +142,17 @@
<
script
>
import
{
listCategory
,
listCatL1
,
createCategory
,
updateCategory
,
deleteCategory
}
from
'
@/api/category
'
import
{
uploadPath
}
from
'
@/api/storage
'
import
{
getToken
}
from
'
@/utils/auth
'
export
default
{
name
:
'
Category
'
,
computed
:
{
headers
()
{
return
{
'
Admin-Token
'
:
getToken
()
}
}
},
data
()
{
return
{
uploadPath
,
...
...
litemall-admin/src/views/promotion/ad.vue
View file @
9eaf2db3
...
...
@@ -68,7 +68,7 @@
<el-input
v-model=
"dataForm.content"
></el-input>
</el-form-item>
<el-form-item
label=
"广告图片"
prop=
"url"
>
<el-upload
class=
"avatar-uploader"
:action=
"uploadPath"
list-type=
"picture-card"
:show-file-list=
"false"
accept=
".jpg,.jpeg,.png,.gif"
:on-success=
"uploadUrl"
>
<el-upload
class=
"avatar-uploader"
:headers=
"headers"
:action=
"uploadPath"
list-type=
"picture-card"
:show-file-list=
"false"
accept=
".jpg,.jpeg,.png,.gif"
:on-success=
"uploadUrl"
>
<img
v-if=
"dataForm.url"
:src=
"dataForm.url"
class=
"avatar"
>
<i
v-else
class=
"el-icon-plus avatar-uploader-icon"
></i>
</el-upload>
...
...
@@ -78,7 +78,7 @@
<el-option
label=
"首页"
:value=
"1"
>
</el-option>
</el-select>
</el-form-item>
</el-form-item>
<el-form-item
label=
"活动链接"
prop=
"link"
>
<el-input
v-model=
"dataForm.link"
></el-input>
</el-form-item>
...
...
@@ -130,9 +130,17 @@
<
script
>
import
{
listAd
,
createAd
,
updateAd
,
deleteAd
}
from
'
@/api/ad
'
import
{
uploadPath
}
from
'
@/api/storage
'
import
{
getToken
}
from
'
@/utils/auth
'
export
default
{
name
:
'
Ad
'
,
computed
:
{
headers
()
{
return
{
'
Admin-Token
'
:
getToken
()
}
}
},
data
()
{
return
{
uploadPath
,
...
...
@@ -289,4 +297,4 @@ export default {
}
}
}
</
script
>
\ No newline at end of file
</
script
>
litemall-admin/src/views/promotion/topic.vue
View file @
9eaf2db3
...
...
@@ -59,7 +59,7 @@
<el-tooltip
placement=
"top"
content=
"返回顶部"
>
<back-to-top
:visibilityHeight=
"100"
></back-to-top>
</el-tooltip>
<!-- 添加或修改对话框 -->
<el-dialog
:title=
"textMap[dialogStatus]"
:visible.sync=
"dialogFormVisible"
>
<el-form
:rules=
"rules"
ref=
"dataForm"
:model=
"dataForm"
status-icon
label-position=
"left"
label-width=
"100px"
style=
'width: 400px; margin-left:50px;'
>
...
...
@@ -70,14 +70,14 @@
<el-input
v-model=
"dataForm.subtitle"
></el-input>
</el-form-item>
<el-form-item
label=
"专题图片"
prop=
"picUrl"
>
<el-upload
class=
"avatar-uploader"
:action=
"uploadPath"
list-type=
"picture-card"
:show-file-list=
"false"
accept=
".jpg,.jpeg,.png,.gif"
:on-success=
"uploadPicUrl"
>
<el-upload
class=
"avatar-uploader"
:headers=
"headers"
:action=
"uploadPath"
list-type=
"picture-card"
:show-file-list=
"false"
accept=
".jpg,.jpeg,.png,.gif"
:on-success=
"uploadPicUrl"
>
<img
v-if=
"dataForm.picUrl"
:src=
"dataForm.picUrl"
class=
"avatar"
>
<i
v-else
class=
"el-icon-plus avatar-uploader-icon"
></i>
</el-upload>
</el-form-item>
<el-form-item
style=
"width: 700px;"
label=
"专题内容"
>
<editor
:init=
"editorInit"
v-model=
"dataForm.content"
></editor>
</el-form-item>
</el-form-item>
<el-form-item
label=
"商品低价"
prop=
"price"
>
<el-input
v-model=
"dataForm.price"
></el-input>
</el-form-item>
...
...
@@ -129,10 +129,18 @@ import { listTopic, createTopic, updateTopic, deleteTopic } from '@/api/topic'
import
{
createStorage
,
uploadPath
}
from
'
@/api/storage
'
import
BackToTop
from
'
@/components/BackToTop
'
import
Editor
from
'
@tinymce/tinymce-vue
'
import
{
getToken
}
from
'
@/utils/auth
'
export
default
{
name
:
'
Topic
'
,
components
:
{
BackToTop
,
Editor
},
computed
:
{
headers
()
{
return
{
'
Admin-Token
'
:
getToken
()
}
}
},
data
()
{
return
{
uploadPath
,
...
...
@@ -311,4 +319,4 @@ export default {
}
}
}
</
script
>
\ No newline at end of file
</
script
>
litemall-admin/src/views/sys/admin.vue
View file @
9eaf2db3
...
...
@@ -22,7 +22,7 @@
<template
slot-scope=
"scope"
>
<img
:src=
"scope.row.avatar"
width=
"40"
v-if=
"scope.row.avatar"
/>
</
template
>
</el-table-column>
</el-table-column>
<el-table-column
align=
"center"
label=
"操作"
class-name=
"small-padding fixed-width"
>
<
template
slot-scope=
"scope"
>
...
...
@@ -50,9 +50,9 @@
</el-form-item>
<el-form-item
label=
"确认密码"
prop=
"checkPassword"
>
<el-input
type=
"password"
v-model=
"dataForm.checkPassword"
auto-complete=
"off"
></el-input>
</el-form-item>
</el-form-item>
<el-form-item
label=
"管理员头像"
prop=
"avatar"
>
<el-upload
class=
"avatar-uploader"
:action=
"uploadPath"
list-type=
"picture-card"
:show-file-list=
"false"
accept=
".jpg,.jpeg,.png,.gif"
:on-success=
"uploadAvatar"
>
<el-upload
class=
"avatar-uploader"
:headers=
"headers"
:action=
"uploadPath"
list-type=
"picture-card"
:show-file-list=
"false"
accept=
".jpg,.jpeg,.png,.gif"
:on-success=
"uploadAvatar"
>
<img
v-if=
"dataForm.avatar"
:src=
"dataForm.avatar"
class=
"avatar"
>
<i
v-else
class=
"el-icon-plus avatar-uploader-icon"
></i>
</el-upload>
...
...
@@ -97,9 +97,17 @@
<
script
>
import
{
listAdmin
,
createAdmin
,
updateAdmin
,
deleteAdmin
}
from
'
@/api/admin
'
import
{
uploadPath
}
from
'
@/api/storage
'
import
{
getToken
}
from
'
@/utils/auth
'
export
default
{
name
:
'
Admin
'
,
computed
:
{
headers
()
{
return
{
'
Admin-Token
'
:
getToken
()
}
}
},
data
()
{
var
validatePass
=
(
rule
,
value
,
callback
)
=>
{
if
(
value
===
''
)
{
...
...
@@ -276,4 +284,4 @@ export default {
}
}
}
</
script
>
\ No newline at end of file
</
script
>
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment