hupeng
5 years ago
37 changed files with 1025 additions and 77 deletions
@ -0,0 +1,39 @@ |
|||||||
|
import request from '@/utils/request' |
||||||
|
|
||||||
|
export function getPage(query) { |
||||||
|
return request({ |
||||||
|
url: 'api/material/page', |
||||||
|
method: 'get', |
||||||
|
params: query |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
export function addObj(obj) { |
||||||
|
return request({ |
||||||
|
url: 'api/material', |
||||||
|
method: 'post', |
||||||
|
data: obj |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
export function getObj(id) { |
||||||
|
return request({ |
||||||
|
url: 'api/material/' + id, |
||||||
|
method: 'get' |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
export function delObj(id) { |
||||||
|
return request({ |
||||||
|
url: 'api/material/' + id, |
||||||
|
method: 'delete' |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
export function putObj(obj) { |
||||||
|
return request({ |
||||||
|
url: 'api/material', |
||||||
|
method: 'put', |
||||||
|
data: obj |
||||||
|
}) |
||||||
|
} |
@ -0,0 +1,39 @@ |
|||||||
|
import request from '@/utils/request' |
||||||
|
|
||||||
|
export function getPage(query) { |
||||||
|
return request({ |
||||||
|
url: 'api/materialgroup/page', |
||||||
|
method: 'get', |
||||||
|
params: query |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
export function addObj(obj) { |
||||||
|
return request({ |
||||||
|
url: 'api/materialgroup', |
||||||
|
method: 'post', |
||||||
|
data: obj |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
export function getObj(id) { |
||||||
|
return request({ |
||||||
|
url: 'api/materialgroup/' + id, |
||||||
|
method: 'get' |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
export function delObj(id) { |
||||||
|
return request({ |
||||||
|
url: 'api/materialgroup/' + id, |
||||||
|
method: 'delete' |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
export function putObj(obj) { |
||||||
|
return request({ |
||||||
|
url: 'api/materialgroup', |
||||||
|
method: 'put', |
||||||
|
data: obj |
||||||
|
}) |
||||||
|
} |
@ -0,0 +1,66 @@ |
|||||||
|
<template> |
||||||
|
<div> |
||||||
|
<el-upload |
||||||
|
:action="uploadApi" |
||||||
|
:headers="headers" |
||||||
|
:on-remove="handleRemove" |
||||||
|
:on-success="handleUploadSuccess" |
||||||
|
:before-remove="beforeRemove" |
||||||
|
:file-list="fileList" |
||||||
|
multiple |
||||||
|
:limit="1" |
||||||
|
> |
||||||
|
<el-button size="small" type="primary">点击上传</el-button> |
||||||
|
</el-upload> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import { getToken } from '@/utils/auth' |
||||||
|
import { mapGetters } from 'vuex' |
||||||
|
export default { |
||||||
|
data () { |
||||||
|
return { |
||||||
|
resourcesUrl: '', |
||||||
|
headers: { |
||||||
|
'Authorization': getToken() |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
props: { |
||||||
|
value: { |
||||||
|
default: '', |
||||||
|
type: String |
||||||
|
} |
||||||
|
}, |
||||||
|
computed: { |
||||||
|
...mapGetters([ |
||||||
|
'uploadApi' |
||||||
|
]), |
||||||
|
fileList () { |
||||||
|
let res = [] |
||||||
|
if (this.value) { |
||||||
|
res.push({name: this.value, url: this.resourcesUrl + this.value, response: this.value}) |
||||||
|
} |
||||||
|
this.$emit('input', this.value) |
||||||
|
console.log("res"+res) |
||||||
|
return res |
||||||
|
} |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
// 图片上传 |
||||||
|
handleUploadSuccess (response, file, fileList) { |
||||||
|
this.$emit('input', file.response.link) |
||||||
|
}, |
||||||
|
handleRemove (file, fileList) { |
||||||
|
this.$emit('change', file) |
||||||
|
}, |
||||||
|
beforeRemove (file, fileList) { |
||||||
|
return this.$confirm(`确定移除 ${file.name}?`) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss"> |
||||||
|
</style> |
@ -0,0 +1,457 @@ |
|||||||
|
<template> |
||||||
|
<div v-if="type == 'image'"> |
||||||
|
<ul class="el-upload-list el-upload-list--picture-card" v-for="(item,index) in value" :key="index"> |
||||||
|
<li tabindex="0" class="el-upload-list__item is-ready" :style="'width: '+width+'px;height: '+height+'px'"> |
||||||
|
<div> |
||||||
|
<img :src="item" alt="" class="el-upload-list__item-thumbnail"> |
||||||
|
<span class="el-upload-list__item-actions"> |
||||||
|
<span class="el-upload-list__item-preview" v-if="index != 0" @click="moveMaterial(index,'up')"> |
||||||
|
<i class="el-icon-back"></i> |
||||||
|
</span> |
||||||
|
<span class="el-upload-list__item-preview" @click="zoomMaterial(index)"> |
||||||
|
<i class="el-icon-view"></i> |
||||||
|
</span> |
||||||
|
<span class="el-upload-list__item-delete" @click="deleteMaterial(index)"> |
||||||
|
<i class="el-icon-delete"></i> |
||||||
|
</span> |
||||||
|
<span class="el-upload-list__item-preview" v-if="index != value.length-1" @click="moveMaterial(index,'down')"> |
||||||
|
<i class="el-icon-right"></i> |
||||||
|
</span> |
||||||
|
</span> |
||||||
|
</div> |
||||||
|
</li> |
||||||
|
</ul> |
||||||
|
<div tabindex="0" class="el-upload el-upload--picture-card" v-if="num > value.length" @click="toSeleteMaterial" :style="'width: '+width+'px;height: '+height+'px;'+'line-height:'+height+'px;'"> |
||||||
|
<i class="el-icon-plus"></i> |
||||||
|
</div> |
||||||
|
|
||||||
|
<el-dialog |
||||||
|
append-to-body |
||||||
|
:visible.sync="dialogVisible" |
||||||
|
width="35%"> |
||||||
|
<img :src="url" alt="" style="width: 100%"> |
||||||
|
</el-dialog> |
||||||
|
|
||||||
|
<el-dialog |
||||||
|
title="图片素材库" |
||||||
|
append-to-body |
||||||
|
:visible.sync="listDialogVisible" |
||||||
|
width="70%"> |
||||||
|
<el-container> |
||||||
|
<el-aside width="unset"> |
||||||
|
<div style="margin-bottom: 10px"> |
||||||
|
<el-button |
||||||
|
class="el-icon-plus" |
||||||
|
size="small" |
||||||
|
@click="materialgroupAdd()"> |
||||||
|
添加分组 |
||||||
|
</el-button> |
||||||
|
</div> |
||||||
|
<el-tabs tab-position="left" v-model="materialgroupObjId" v-loading="materialgroupLoading" @tab-click="tabClick"> |
||||||
|
<el-tab-pane v-for="(item,index) in materialgroupList" |
||||||
|
:key="index" |
||||||
|
:name="item.id"> |
||||||
|
<span slot="label"> {{item.name}}</span> |
||||||
|
</el-tab-pane> |
||||||
|
</el-tabs> |
||||||
|
</el-aside> |
||||||
|
<el-main> |
||||||
|
<el-card> |
||||||
|
<div slot="header"> |
||||||
|
<el-row> |
||||||
|
<el-col :span="12"> |
||||||
|
<span>{{materialgroupObj.name}}</span> |
||||||
|
<span v-if="materialgroupObj.id != '-1'"> |
||||||
|
<el-button size="small" type="text" class="el-icon-edit" style="margin-left: 10px;" @click="materialgroupEdit(materialgroupObj)">重命名</el-button> |
||||||
|
<el-button size="small" type="text" class="el-icon-delete" style="margin-left: 10px;color: red" @click="materialgroupDelete(materialgroupObj)">删除</el-button> |
||||||
|
</span> |
||||||
|
</el-col> |
||||||
|
<el-col :span="12" style="text-align: right;"> |
||||||
|
<el-upload |
||||||
|
:action="uploadApi" |
||||||
|
:headers="headers" |
||||||
|
:file-list="[]" |
||||||
|
:on-progress="handleProgress" |
||||||
|
:before-upload="beforeUpload" |
||||||
|
:on-success="handleSuccess"> |
||||||
|
<el-button size="small" type="primary">点击上传</el-button> |
||||||
|
</el-upload> |
||||||
|
</el-col> |
||||||
|
</el-row> |
||||||
|
</div> |
||||||
|
<div v-loading="tableLoading"> |
||||||
|
<el-alert |
||||||
|
v-if="tableData.length <= 0" |
||||||
|
title="暂无数据" |
||||||
|
type="info" |
||||||
|
:closable="false" |
||||||
|
center |
||||||
|
show-icon> |
||||||
|
</el-alert> |
||||||
|
<el-row :gutter="5"> |
||||||
|
<el-checkbox-group v-model="urls" :max="num - value.length"> |
||||||
|
<el-col :span="4" v-for="(item,index) in tableData" :key="index"> |
||||||
|
<el-card :body-style="{ padding: '5px' }"> |
||||||
|
<el-image |
||||||
|
style="width: 100%;height: 100px" |
||||||
|
:src="item.url" |
||||||
|
fit="contain" |
||||||
|
:preview-src-list="[item.url]"></el-image> |
||||||
|
<div> |
||||||
|
<el-checkbox class="material-name" :label="item.url"> |
||||||
|
选择 |
||||||
|
</el-checkbox> |
||||||
|
<el-row> |
||||||
|
<el-col :span="24" class="col-do"> |
||||||
|
<el-button type="text" size="medium" @click="materialDel(item)">删除</el-button> |
||||||
|
</el-col> |
||||||
|
</el-row> |
||||||
|
|
||||||
|
</div> |
||||||
|
</el-card> |
||||||
|
</el-col> |
||||||
|
</el-checkbox-group> |
||||||
|
</el-row> |
||||||
|
<el-pagination |
||||||
|
@size-change="sizeChange" |
||||||
|
:current-page.sync="page.currentPage" |
||||||
|
:page-sizes="[12, 24]" |
||||||
|
:page-size="page.pageSize" |
||||||
|
layout="total, sizes, prev, pager, next, jumper" |
||||||
|
:total="page.total" |
||||||
|
class="pagination"> |
||||||
|
</el-pagination> |
||||||
|
</div> |
||||||
|
</el-card> |
||||||
|
</el-main> |
||||||
|
</el-container> |
||||||
|
<span slot="footer" class="dialog-footer"> |
||||||
|
<el-button @click="listDialogVisible = false">取 消</el-button> |
||||||
|
<el-button type="primary" @click="sureUrls">确 定</el-button> |
||||||
|
</span> |
||||||
|
</el-dialog> |
||||||
|
</div> |
||||||
|
|
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import { getPage as materialgroupPage, addObj as materialgroupAdd, delObj as materialgroupDel, putObj as materialgroupEdit} from '@/api/tools/materialgroup' |
||||||
|
import { getPage , addObj, delObj, putObj} from '@/api/tools/material' |
||||||
|
import { getToken } from '@/utils/auth' |
||||||
|
import { mapGetters } from 'vuex' |
||||||
|
|
||||||
|
export default { |
||||||
|
name: "materialList", |
||||||
|
props: { |
||||||
|
//素材数据 |
||||||
|
value:{ |
||||||
|
type: Array, |
||||||
|
default() { |
||||||
|
return [] |
||||||
|
}, |
||||||
|
}, |
||||||
|
//素材类型 |
||||||
|
type:{ |
||||||
|
type: String, |
||||||
|
}, |
||||||
|
//素材限制数量,默认5个 |
||||||
|
num:{ |
||||||
|
type: Number, |
||||||
|
default() { |
||||||
|
return 5 |
||||||
|
}, |
||||||
|
}, |
||||||
|
//宽度 |
||||||
|
width: { |
||||||
|
type: Number, |
||||||
|
default() { |
||||||
|
return 150 |
||||||
|
} |
||||||
|
}, |
||||||
|
//宽度 |
||||||
|
height: { |
||||||
|
type: Number, |
||||||
|
default() { |
||||||
|
return 150 |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
data() { |
||||||
|
return { |
||||||
|
headers:{ |
||||||
|
Authorization: getToken() |
||||||
|
}, |
||||||
|
dialogVisible: false, |
||||||
|
url: '', |
||||||
|
listDialogVisible: false, |
||||||
|
materialgroupList: [], |
||||||
|
materialgroupObjId: '', |
||||||
|
materialgroupObj: {}, |
||||||
|
materialgroupLoading: false, |
||||||
|
tableData: [], |
||||||
|
page: { |
||||||
|
total: 0, // 总页数 |
||||||
|
currentPage: 1, // 当前页数 |
||||||
|
pageSize: 12, // 每页显示多少条 |
||||||
|
ascs: [],//升序字段 |
||||||
|
descs: 'create_time'//降序字段 |
||||||
|
}, |
||||||
|
tableLoading: false, |
||||||
|
groupId: null, |
||||||
|
urls: [] |
||||||
|
} |
||||||
|
}, |
||||||
|
computed: { |
||||||
|
...mapGetters([ |
||||||
|
'uploadApi' |
||||||
|
]) |
||||||
|
}, |
||||||
|
methods:{ |
||||||
|
moveMaterial(index,type){ |
||||||
|
if(type == 'up'){ |
||||||
|
let tempOption = this.value[index - 1] |
||||||
|
this.$set(this.value, index - 1, this.value[index]) |
||||||
|
this.$set(this.value, index, tempOption) |
||||||
|
} |
||||||
|
if(type == 'down'){ |
||||||
|
let tempOption = this.value[index + 1] |
||||||
|
this.$set(this.value, index + 1, this.value[index]) |
||||||
|
this.$set(this.value, index, tempOption) |
||||||
|
} |
||||||
|
}, |
||||||
|
zoomMaterial(index){ |
||||||
|
this.dialogVisible = true |
||||||
|
this.url = this.value[index] |
||||||
|
}, |
||||||
|
deleteMaterial(index){ |
||||||
|
let that = this |
||||||
|
this.$confirm('是否确认删除?', '提示', { |
||||||
|
confirmButtonText: '确定', |
||||||
|
cancelButtonText: '取消', |
||||||
|
type: 'warning' |
||||||
|
}).then(function() { |
||||||
|
that.value.splice(index,1) |
||||||
|
that.urls = [] |
||||||
|
}) |
||||||
|
}, |
||||||
|
toSeleteMaterial(){ |
||||||
|
this.listDialogVisible = true |
||||||
|
if(this.tableData.length <= 0){ |
||||||
|
this.materialgroupPage() |
||||||
|
} |
||||||
|
}, |
||||||
|
materialgroupPage(){ |
||||||
|
this.materialgroupLoading = true |
||||||
|
materialgroupPage({ |
||||||
|
total: 0, // 总页数 |
||||||
|
currentPage: 1, // 当前页数 |
||||||
|
pageSize: 100, // 每页显示多少条 |
||||||
|
ascs: [],//升序字段 |
||||||
|
descs: 'create_time'//降序字段 |
||||||
|
}).then(response => { |
||||||
|
this.materialgroupLoading = false |
||||||
|
let materialgroupList = response.content |
||||||
|
materialgroupList.unshift({ |
||||||
|
id: '-1', |
||||||
|
name: '全部分组' |
||||||
|
}) |
||||||
|
this.materialgroupList = materialgroupList |
||||||
|
this.tabClick({ |
||||||
|
index: 0 |
||||||
|
}) |
||||||
|
}) |
||||||
|
}, |
||||||
|
materialgroupDelete(materialgroupObj){ |
||||||
|
let that = this |
||||||
|
this.$confirm('是否确认删除该分组?', '提示', { |
||||||
|
confirmButtonText: '确定', |
||||||
|
cancelButtonText: '取消', |
||||||
|
type: 'warning' |
||||||
|
}).then(function() { |
||||||
|
materialgroupDel(materialgroupObj.id) |
||||||
|
.then(function() { |
||||||
|
that.$delete(that.materialgroupList, materialgroupObj.index) |
||||||
|
}) |
||||||
|
}) |
||||||
|
}, |
||||||
|
materialgroupEdit(materialgroupObj){ |
||||||
|
let that = this |
||||||
|
this.$prompt('请输入分组名', '提示', { |
||||||
|
confirmButtonText: '确定', |
||||||
|
cancelButtonText: '取消', |
||||||
|
inputValue: materialgroupObj.name, |
||||||
|
}).then(({ value }) => { |
||||||
|
materialgroupEdit({ |
||||||
|
id: materialgroupObj.id, |
||||||
|
name: value |
||||||
|
}).then(function() { |
||||||
|
materialgroupObj.name = value |
||||||
|
that.$set(that.materialgroupList, materialgroupObj.index, materialgroupObj) |
||||||
|
}) |
||||||
|
}).catch(() => { |
||||||
|
|
||||||
|
}) |
||||||
|
}, |
||||||
|
materialgroupAdd(){ |
||||||
|
let that = this |
||||||
|
this.$prompt('请输入分组名', '提示', { |
||||||
|
confirmButtonText: '确定', |
||||||
|
cancelButtonText: '取消', |
||||||
|
}).then(({ value }) => { |
||||||
|
materialgroupAdd({ |
||||||
|
name: value |
||||||
|
}).then(function() { |
||||||
|
that.materialgroupPage() |
||||||
|
}) |
||||||
|
}).catch(() => { |
||||||
|
|
||||||
|
}) |
||||||
|
}, |
||||||
|
tabClick(tab,event){ |
||||||
|
this.urls = [] |
||||||
|
let index = Number(tab.index) |
||||||
|
let materialgroupObj = this.materialgroupList[index] |
||||||
|
materialgroupObj.index = index |
||||||
|
this.materialgroupObj = materialgroupObj |
||||||
|
this.materialgroupObjId = materialgroupObj.id |
||||||
|
this.page.currentPage = 1 |
||||||
|
this.page.total = 0 |
||||||
|
if(materialgroupObj.id != '-1'){ |
||||||
|
this.groupId = materialgroupObj.id |
||||||
|
}else{ |
||||||
|
this.groupId = null |
||||||
|
} |
||||||
|
this.getPage(this.page) |
||||||
|
}, |
||||||
|
getPage(page, params) { |
||||||
|
this.tableLoading = true |
||||||
|
getPage(Object.assign({ |
||||||
|
current: page.currentPage, |
||||||
|
size: page.pageSize, |
||||||
|
descs: this.page.descs, |
||||||
|
ascs: this.page.ascs, |
||||||
|
}, { |
||||||
|
groupId: this.groupId |
||||||
|
})).then(response => { |
||||||
|
let tableData = response.content |
||||||
|
this.page.total = response.totalElements |
||||||
|
this.page.currentPage = page.currentPage |
||||||
|
this.page.pageSize = page.pageSize |
||||||
|
this.tableData = tableData |
||||||
|
this.tableLoading = false |
||||||
|
}).catch(() => { |
||||||
|
this.tableLoading=false |
||||||
|
}) |
||||||
|
}, |
||||||
|
sizeChange(val) { |
||||||
|
this.page.currentPage = 1 |
||||||
|
this.page.pageSize = val |
||||||
|
this.getPage(this.page) |
||||||
|
}, |
||||||
|
materialRename(item){ |
||||||
|
let that = this |
||||||
|
this.$prompt('请输入素材名', '提示', { |
||||||
|
confirmButtonText: '确定', |
||||||
|
cancelButtonText: '取消', |
||||||
|
inputValue: item.name, |
||||||
|
}).then(({ value }) => { |
||||||
|
putObj({ |
||||||
|
id: item.id, |
||||||
|
name: value |
||||||
|
}).then(function() { |
||||||
|
that.getPage(that.page) |
||||||
|
}) |
||||||
|
}).catch(() => { |
||||||
|
|
||||||
|
}) |
||||||
|
}, |
||||||
|
materialUrl(item){ |
||||||
|
let that = this |
||||||
|
this.$prompt('素材链接', '提示', { |
||||||
|
confirmButtonText: '确定', |
||||||
|
cancelButtonText: '取消', |
||||||
|
inputValue: item.url, |
||||||
|
}).then(({ value }) => { |
||||||
|
|
||||||
|
}).catch(() => { |
||||||
|
|
||||||
|
}) |
||||||
|
}, |
||||||
|
materialDel(item){ |
||||||
|
let that = this |
||||||
|
this.$confirm('是否确认删除该素材?', '提示', { |
||||||
|
confirmButtonText: '确定', |
||||||
|
cancelButtonText: '取消', |
||||||
|
type: 'warning' |
||||||
|
}).then(function() { |
||||||
|
delObj(item.id) |
||||||
|
.then(function() { |
||||||
|
that.getPage(that.page) |
||||||
|
}) |
||||||
|
}) |
||||||
|
}, |
||||||
|
handleCommand(command) { |
||||||
|
let that = this |
||||||
|
let s = command.split('-') |
||||||
|
putObj({ |
||||||
|
id: s[0], |
||||||
|
groupId: s[1] |
||||||
|
}).then(function() { |
||||||
|
that.getPage(that.page) |
||||||
|
}) |
||||||
|
}, |
||||||
|
handleProgress(event, file, fileList){ |
||||||
|
// let uploadProgress = file.percentage.toFixed(0) |
||||||
|
// this.uploadProgress = uploadProgress |
||||||
|
}, |
||||||
|
handleSuccess(response, file, fileList){ |
||||||
|
let that = this |
||||||
|
this.uploadProgress = 0 |
||||||
|
addObj({ |
||||||
|
type: '1', |
||||||
|
groupId: this.groupId != '-1' ? this.groupId : null, |
||||||
|
name: file.name, |
||||||
|
url: response.link |
||||||
|
}).then(function() { |
||||||
|
that.getPage(that.page) |
||||||
|
}) |
||||||
|
}, |
||||||
|
beforeUpload(file){ |
||||||
|
const isPic = |
||||||
|
file.type === "image/jpeg" || |
||||||
|
file.type === "image/png" || |
||||||
|
file.type === "image/gif" || |
||||||
|
file.type === "image/jpg" |
||||||
|
const isLt2M = file.size / 1024 / 1024 < 2 |
||||||
|
if (!isPic) { |
||||||
|
this.$message.error("上传图片只能是 JPG、JPEG、PNG、GIF 格式!") |
||||||
|
return false |
||||||
|
} |
||||||
|
if (!isLt2M) { |
||||||
|
this.$message.error('上传头像图片大小不能超过 2MB!') |
||||||
|
} |
||||||
|
return isPic && isLt2M |
||||||
|
}, |
||||||
|
sureUrls(){ |
||||||
|
this.urls.forEach(item => { |
||||||
|
this.$set(this.value,this.value.length, item) |
||||||
|
}) |
||||||
|
this.listDialogVisible=false |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" scoped> |
||||||
|
.material-name{ |
||||||
|
padding: 8px 0px; |
||||||
|
} |
||||||
|
.col-do{ |
||||||
|
text-align: center; |
||||||
|
} |
||||||
|
.button-do{ |
||||||
|
padding: unset!important; |
||||||
|
font-size: 12px; |
||||||
|
} |
||||||
|
</style> |
||||||
|
|
@ -0,0 +1,171 @@ |
|||||||
|
<template> |
||||||
|
<el-row :gutter="10" class="panel-group"> |
||||||
|
<el-col :xs="16" :sm="16" :lg="8" class="card-panel-col"> |
||||||
|
<div class="card-panel"> |
||||||
|
<el-card class="box-card"> |
||||||
|
<div slot="header" class="clearfix"> |
||||||
|
<span style="font-weight: bolder">项目信息</span> |
||||||
|
</div> |
||||||
|
<div class="text item"> |
||||||
|
<span style="font-weight: bolder">yshop基于当前流行技术组合的前后端分离商城系统:</span> |
||||||
|
SpringBoot2+Jpa+MybatisPlus+SpringSecurity |
||||||
|
的前后端分离的商城系统, |
||||||
|
包含商城、拼团、砍价、商户管理、 秒杀、优惠券、积分、分销、会员等功能。 |
||||||
|
</div> |
||||||
|
<div class="text item"> |
||||||
|
<span style="font-weight: bolder">技术选型:</span> |
||||||
|
SpringBoot2、mybatis、MyBatis-Plus |
||||||
|
、SpringSecurity、JPA 、Druid 、Slf4j 、Fastjson |
||||||
|
、JWT 、Redis 、Quartz 、Mysql 、swagger 、WxJava |
||||||
|
、Lombok 、Hutool |
||||||
|
、Mapstruct 、Redisson 、Rocketmq |
||||||
|
</div> |
||||||
|
<div class="text item"> |
||||||
|
<span style="font-weight: bolder">QQ群:</span>964166879 |
||||||
|
</div> |
||||||
|
<div class="text item"> |
||||||
|
<span style="font-weight: bolder">gitee:</span><a target="_blank" href="https://gitee.com/guchengwuyue/yshopmall">访问码云</a> |
||||||
|
</div> |
||||||
|
<div class="text item"> |
||||||
|
<span style="font-weight: bolder">github:</span><a target="_blank" href="https://github.com/guchengwuyue/yshopmall">访问github</a> |
||||||
|
</div> |
||||||
|
<div class="text item"> |
||||||
|
<span style="font-weight: bolder">公众号演示:</span><img width="100" height="100" src="https://image.dayouqiantu.cn/qrcode_for_gh_95df5a2881cc_258.jpg"> |
||||||
|
</div> |
||||||
|
<div class="text item"> |
||||||
|
<span style="font-weight: bolder">H5演示:</span><a target="_blank" href="https://h5.dayouqiantu.cn">https://h5.dayouqiantu.cn</a> <br /> |
||||||
|
<span style="font-weight: bolder">H5测试号</span>:hupeng/123456,也可以自行注册 |
||||||
|
</div> |
||||||
|
</el-card> |
||||||
|
</div> |
||||||
|
</el-col> |
||||||
|
<el-col :xs="16" :sm="16" :lg="8" class="card-panel-col"> |
||||||
|
<div class="card-panel"> |
||||||
|
<el-card class="box-card"> |
||||||
|
<div slot="header" class="clearfix"> |
||||||
|
<span style="font-weight: bolder">开源+VIP说明</span> |
||||||
|
</div> |
||||||
|
<div class="text item"> |
||||||
|
<span style="font-weight: bolder">开源版:</span>是整个商城的管理后台(后台已经封装好了图片素材库、编辑器、配置等等组件), |
||||||
|
它可以用于所有的Web应用程序,如网站商城管理后台,网站会员中心,CMS,CRM,OA等等, |
||||||
|
当然,您也可以对它进行深度定制,以做出更强系统。 |
||||||
|
</div> |
||||||
|
<div class="text item"> |
||||||
|
<span style="font-weight: bolder">VIP版:</span>包括了开源版,还包括了移动端(H5+公众号)、小程序(mpvue)即将发布、移动端API |
||||||
|
</div> |
||||||
|
<div class="text item"> |
||||||
|
1、VIP为终身制、拥有全部源代码及其后续的代码(免费)升级及其技术支持。目前商城优惠券、会员、秒杀、分销、砍价等都已经完成!<br /> |
||||||
|
2、价格:vip会员价218元,当然当前价格是整个价格,后续的系统升级vip价格会有相应的调整的,所以早上车更优惠哦!<br /> |
||||||
|
3、VIP购买淘宝地址:https://item.taobao.com/item.htm?id=607532386325<br /> |
||||||
|
4、加入vip群:931426444,请输入你的淘宝订单编号,即可入群<br /> |
||||||
|
5、群里面获取私服git<br /> |
||||||
|
</div> |
||||||
|
</el-card> |
||||||
|
</div> |
||||||
|
</el-col> |
||||||
|
<el-col :xs="16" :sm="16" :lg="8" class="card-panel-col"> |
||||||
|
<div class="card-panel"> |
||||||
|
<el-card class="box-card"> |
||||||
|
<div slot="header" class="clearfix"> |
||||||
|
<span style="font-weight: bolder">更新日志</span> |
||||||
|
</div> |
||||||
|
<div class="text item"> |
||||||
|
<span style="font-weight: bolder">(2020-01-10)yshop1.8版本 发布更新如下:</span> |
||||||
|
</div> |
||||||
|
<div class="text item"> |
||||||
|
1.新增小程序支付与登录,后台新增小程序跳转页面, |
||||||
|
</div> |
||||||
|
<div class="text item"> |
||||||
|
2.后台新增图片素材管理 |
||||||
|
</div> |
||||||
|
<div class="text item"> |
||||||
|
3.本地上传与七牛云上传合并,修改一个yml即可两者随意切换 |
||||||
|
</div> |
||||||
|
<div class="text item"> |
||||||
|
4.升级swagger-bootstrap,swaager统一配置迁移到common(防止注解冲突) |
||||||
|
</div> |
||||||
|
<div class="text item"> |
||||||
|
5.后台优化操作显示 |
||||||
|
</div> |
||||||
|
</el-card> |
||||||
|
</div> |
||||||
|
</el-col> |
||||||
|
</el-row> |
||||||
|
</template> |
||||||
|
<script> |
||||||
|
|
||||||
|
</script> |
||||||
|
|
||||||
|
<style rel="stylesheet/scss" lang="scss" scoped> |
||||||
|
.text { |
||||||
|
font-size: 12px; |
||||||
|
} |
||||||
|
|
||||||
|
.item { |
||||||
|
margin-bottom: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.clearfix:before, |
||||||
|
.clearfix:after { |
||||||
|
display: table; |
||||||
|
content: ""; |
||||||
|
} |
||||||
|
.clearfix:after { |
||||||
|
clear: both |
||||||
|
} |
||||||
|
|
||||||
|
.panel-group { |
||||||
|
margin-top: 18px; |
||||||
|
.card-panel-col{ |
||||||
|
margin-bottom: 32px; |
||||||
|
} |
||||||
|
.card-panel { |
||||||
|
height: auto; |
||||||
|
font-size: 12px; |
||||||
|
position: relative; |
||||||
|
overflow: hidden; |
||||||
|
color: #666; |
||||||
|
background: #fff; |
||||||
|
box-shadow: 4px 4px 40px rgba(0, 0, 0, .05); |
||||||
|
border-color: rgba(0, 0, 0, .05); |
||||||
|
.icon-people { |
||||||
|
color: #40c9c6; |
||||||
|
} |
||||||
|
.icon-message { |
||||||
|
color: #36a3f7; |
||||||
|
} |
||||||
|
.icon-money { |
||||||
|
color: #f4516c; |
||||||
|
} |
||||||
|
.icon-shopping { |
||||||
|
color: #34bfa3 |
||||||
|
} |
||||||
|
.card-panel-icon-wrapper { |
||||||
|
float: left; |
||||||
|
margin: 14px 0 0 14px; |
||||||
|
padding: 16px; |
||||||
|
transition: all 0.38s ease-out; |
||||||
|
border-radius: 6px; |
||||||
|
} |
||||||
|
.card-panel-icon { |
||||||
|
float: left; |
||||||
|
font-size: 48px; |
||||||
|
} |
||||||
|
.card-panel-description { |
||||||
|
float: right; |
||||||
|
font-weight: bold; |
||||||
|
margin: 26px; |
||||||
|
margin-left: 0px; |
||||||
|
.card-panel-text { |
||||||
|
line-height: 18px; |
||||||
|
color: rgba(0, 0, 0, 0.45); |
||||||
|
font-size: 16px; |
||||||
|
margin-bottom: 12px; |
||||||
|
} |
||||||
|
.card-panel-num { |
||||||
|
font-size: 20px; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</style> |
Loading…
Reference in new issue