产品管理基础代码

This commit is contained in:
焦钰锟 2025-04-22 11:48:12 +08:00
parent 02a7105f26
commit 86e3cee234
13 changed files with 15924 additions and 19814 deletions

34233
package-lock.json generated

File diff suppressed because it is too large Load Diff

112
src/api/crud/leaveWord.js Normal file
View File

@ -0,0 +1,112 @@
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import request from '@/libs/request';
/**
* 获取列表数据
* @param params
* @return {*}
*/
export function getLeaveWordListApi(params) {
return request({
url: 'crud/leave_word',
method: 'get',
params,
});
}
/**
* 获取添加表单数据
* @return {*}
*/
export function getLeaveWordCreateApi() {
return request({
url: 'crud/leave_word/create',
method: 'get',
});
}
/**
* 添加数据
* @param data
* @return {*}
*/
export function leaveWordSaveApi(data) {
return request({
url: 'crud/leave_word',
method: 'post',
data
});
}
/**
* 获取编辑表单数据
* @param id
* @return {*}
*/
export function getLeaveWordEditApi(id) {
return request({
url: `crud/leave_word/${id}/edit`,
method: 'get'
});
}
/**
* 修改数据
* @param id
* @return {*}
*/
export function leaveWordUpdateApi(id, data) {
return request({
url: `crud/leave_word/${id}`,
method: 'put',
data
});
}
/**
* 修改状态
* @param id
* @return {*}
*/
export function leaveWordStatusApi(id, data) {
return request({
url: `crud/leave_word/status/${id}`,
method: 'put',
data
});
}
/**
* 删除数据
* @param id
* @return {*}
*/
export function leaveWordDeleteApi(id) {
return request({
url: `crud/leave_word/${id}`,
method: 'delete'
});
}
/**
* 获取数据
* @param id
* @return {*}
*/
export function getLeaveWordReadApi(id) {
return request({
url: `crud/leave_word/${id}`,
method: 'get'
});
}

112
src/api/crud/shareList.js Normal file
View File

@ -0,0 +1,112 @@
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import request from '@/libs/request';
/**
* 获取列表数据
* @param params
* @return {*}
*/
export function getShareListListApi(params) {
return request({
url: 'crud/share_list',
method: 'get',
params,
});
}
/**
* 获取添加表单数据
* @return {*}
*/
export function getShareListCreateApi() {
return request({
url: 'crud/share_list/create',
method: 'get',
});
}
/**
* 添加数据
* @param data
* @return {*}
*/
export function shareListSaveApi(data) {
return request({
url: 'crud/share_list',
method: 'post',
data
});
}
/**
* 获取编辑表单数据
* @param id
* @return {*}
*/
export function getShareListEditApi(id) {
return request({
url: `crud/share_list/${id}/edit`,
method: 'get'
});
}
/**
* 修改数据
* @param id
* @return {*}
*/
export function shareListUpdateApi(id, data) {
return request({
url: `crud/share_list/${id}`,
method: 'put',
data
});
}
/**
* 修改状态
* @param id
* @return {*}
*/
export function shareListStatusApi(id, data) {
return request({
url: `crud/share_list/status/${id}`,
method: 'put',
data
});
}
/**
* 删除数据
* @param id
* @return {*}
*/
export function shareListDeleteApi(id) {
return request({
url: `crud/share_list/${id}`,
method: 'delete'
});
}
/**
* 获取数据
* @param id
* @return {*}
*/
export function getShareListReadApi(id) {
return request({
url: `crud/share_list/${id}`,
method: 'get'
});
}

View File

@ -0,0 +1,112 @@
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import request from '@/libs/request';
/**
* 获取列表数据
* @param params
* @return {*}
*/
export function getWebsiteProductsListApi(params) {
return request({
url: 'crud/website_products',
method: 'get',
params,
});
}
/**
* 获取添加表单数据
* @return {*}
*/
export function getWebsiteProductsCreateApi() {
return request({
url: 'crud/website_products/create',
method: 'get',
});
}
/**
* 添加数据
* @param data
* @return {*}
*/
export function websiteProductsSaveApi(data) {
return request({
url: 'crud/website_products',
method: 'post',
data
});
}
/**
* 获取编辑表单数据
* @param id
* @return {*}
*/
export function getWebsiteProductsEditApi(id) {
return request({
url: `crud/website_products/${id}/edit`,
method: 'get'
});
}
/**
* 修改数据
* @param id
* @return {*}
*/
export function websiteProductsUpdateApi(id, data) {
return request({
url: `crud/website_products/${id}`,
method: 'put',
data
});
}
/**
* 修改状态
* @param id
* @return {*}
*/
export function websiteProductsStatusApi(id, data) {
return request({
url: `crud/website_products/status/${id}`,
method: 'put',
data
});
}
/**
* 删除数据
* @param id
* @return {*}
*/
export function websiteProductsDeleteApi(id) {
return request({
url: `crud/website_products/${id}`,
method: 'delete'
});
}
/**
* 获取数据
* @param id
* @return {*}
*/
export function getWebsiteProductsReadApi(id) {
return request({
url: `crud/website_products/${id}`,
method: 'get'
});
}

View File

@ -0,0 +1,112 @@
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import request from '@/libs/request';
/**
* 获取列表数据
* @param params
* @return {*}
*/
export function getWebsiteProductsMessageListApi(params) {
return request({
url: 'crud/website_products_message',
method: 'get',
params,
});
}
/**
* 获取添加表单数据
* @return {*}
*/
export function getWebsiteProductsMessageCreateApi() {
return request({
url: 'crud/website_products_message/create',
method: 'get',
});
}
/**
* 添加数据
* @param data
* @return {*}
*/
export function websiteProductsMessageSaveApi(data) {
return request({
url: 'crud/website_products_message',
method: 'post',
data
});
}
/**
* 获取编辑表单数据
* @param id
* @return {*}
*/
export function getWebsiteProductsMessageEditApi(id) {
return request({
url: `crud/website_products_message/${id}/edit`,
method: 'get'
});
}
/**
* 修改数据
* @param id
* @return {*}
*/
export function websiteProductsMessageUpdateApi(id, data) {
return request({
url: `crud/website_products_message/${id}`,
method: 'put',
data
});
}
/**
* 修改状态
* @param id
* @return {*}
*/
export function websiteProductsMessageStatusApi(id, data) {
return request({
url: `crud/website_products_message/status/${id}`,
method: 'put',
data
});
}
/**
* 删除数据
* @param id
* @return {*}
*/
export function websiteProductsMessageDeleteApi(id) {
return request({
url: `crud/website_products_message/${id}`,
method: 'delete'
});
}
/**
* 获取数据
* @param id
* @return {*}
*/
export function getWebsiteProductsMessageReadApi(id) {
return request({
url: `crud/website_products_message/${id}`,
method: 'get'
});
}

View File

@ -0,0 +1,224 @@
<template>
<div>
<el-card shadow="never" class="ivu-mt" :body-style="{padding:0}">
<div class="padding-add">
<el-form
ref="curlFrom"
:model="from"
:label-width="labelWidth"
:label-position="labelPosition"
inline
@submit.native.prevent
>
<el-form-item label="姓名:" label-for="name">
<el-input
v-model="from.name"
placeholder="请输入姓名"
class="form_content_width"
/>
</el-form-item>
<el-form-item label="联系方式:" label-for="mobile">
<el-input
v-model="from.mobile"
placeholder="请输入联系方式"
class="form_content_width"
/>
</el-form-item>
<el-form-item label="留言:" label-for="content">
<el-input
v-model="from.content"
placeholder="请输入留言"
class="form_content_width"
/>
</el-form-item>
<el-form-item label="添加时间:">
<el-date-picker
:editable="false"
clearabl
@change="searchs"
v-model="from.create_time"
format="yyyy/MM/dd"
type="daterange"
value-format="yyyy/MM/dd"
start-placeholder="开始日期"
end-placeholder="结束日期"
style="width:250px;"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="searchs">查询</el-button>
</el-form-item>
</el-form>
</div>
</el-card>
<el-card shadow="never" dis-hover class="ivu-mt mt16">
<el-row type="flex">
<el-col v-bind="grid">
<el-button v-auth="['leave_word-add']" type="primary" icon="md-add" @click="add">添加</el-button>
</el-col>
</el-row>
<el-table
:data="dataList"
ref="table"
class="mt25"
:loading="loading"
highlight-current-row
>
<el-table-column prop="name" label="姓名">
</el-table-column>
<el-table-column prop="mobile" label="联系方式">
</el-table-column>
<el-table-column prop="content" label="留言">
</el-table-column>
<el-table-column prop="create_time" label="添加时间">
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<a @click="show(scope.row)">详情</a>
<el-divider direction="vertical" />
<a @click="edit(scope.row.id)">修改</a>
<el-divider direction="vertical" />
<a @click="del(scope.row, '删除', scope.$index)">删除</a>
</template>
</el-table-column>
</el-table>
<div class="acea-row row-right page">
<pagination :total="total" @pagination="pageChange" :limit.sync="from.limit" :page.sync="from.page" />
</div>
</el-card>
<el-dialog title="查看详情" :visible.sync="dialogTableVisible" v-if='dialogTableVisible'>
<el-descriptions title="leave_word">
<el-descriptions-item label="">{{info.id}}</el-descriptions-item>
<el-descriptions-item label="姓名">{{info.name}}</el-descriptions-item>
<el-descriptions-item label="联系方式">{{info.mobile}}</el-descriptions-item>
<el-descriptions-item label="留言">{{info.content}}</el-descriptions-item>
<el-descriptions-item label="添加时间">{{info.create_time}}</el-descriptions-item>
</el-descriptions>
</el-dialog>
</div>
</template>
<script>
import { mapState } from 'vuex';
import { leaveWordSaveApi, leaveWordStatusApi, leaveWordDeleteApi, leaveWordUpdateApi, getLeaveWordCreateApi, getLeaveWordEditApi, getLeaveWordListApi, getLeaveWordReadApi} from '@/api/crud/leaveWord';
export default {
name: 'leave_word',
data() {
return {
grid: {
xl: 7,
lg: 7,
md: 12,
sm: 24,
xs: 24,
},
loading: false,
from: {
name:'',
mobile:'',
content:'',
create_time:'',
page: 1,
limit: 15,
},
dataList: [],
total: 0,
dialogTableVisible: false,
info: {},
};
},
computed: {
...mapState('media', ['isMobile']),
labelWidth() {
return this.isMobile ? undefined : '75px';
},
labelPosition() {
return this.isMobile ? 'top' : 'left';
},
},
created() {
this.getList();
},
methods: {
show(row) {
getLeaveWordReadApi(row.id).then(res => {
this.dialogTableVisible = true;
this.info = res.data;
}).catch(res => {
this.$Message.error(res.msg);
})
},
//
updateStatus(row, field) {
leaveWordStatusApi(row.id, {field: field, value: row[field]})
.then(async (res) => {
this.$message.success(res.msg);
})
.catch((res) => {
this.$message.error(res.msg);
});
},
//
add() {
this.$modalForm(getLeaveWordCreateApi()).then(() => this.getList());
},
//
searchs() {
this.from.page = 1;
this.getList();
},
//
getList() {
this.loading = true;
getLeaveWordListApi(this.from)
.then(async (res) => {
let data = res.data;
this.dataList = data.list;
this.total = data.count;
this.loading = false;
})
.catch((res) => {
this.loading = false;
this.$Message.error(res.msg);
});
},
//
pageChange(index) {
this.from.page = index;
this.getList();
},
//
edit(id) {
this.$modalForm(getLeaveWordEditApi(id)).then(() => this.getList());
},
//
del(row, tit, num) {
let delfromData = {
title: tit,
num: num,
url: `crud/leave_word/${row.id}`,
method: 'DELETE',
ids: '',
};
this.$modalSure(delfromData)
.then((res) => {
this.$Message.success(res.msg);
this.getList();
})
.catch((res) => {
this.$Message.error(res.msg);
});
},
},
};
</script>
<style scoped lang="stylus"></style>

View File

@ -0,0 +1,180 @@
<template>
<div>
<el-card shadow="never" dis-hover class="ivu-mt ">
<el-row type="flex">
<el-col v-bind="grid">
<el-button v-auth="['share_list-add']" type="primary" icon="md-add" @click="add">添加</el-button>
</el-col>
</el-row>
<el-table
:data="dataList"
ref="table"
class="mt25"
:loading="loading"
highlight-current-row
>
<el-table-column prop="name" label="名称">
</el-table-column>
<el-table-column prop="link" label="分享链接">
</el-table-column>
<el-table-column label="图标">
<template slot-scope="scope">
<div class="tabBox_img" v-viewer>
<img v-lazy="scope.row.img" />
</div>
</template>
</el-table-column>
<el-table-column label="蓝色图标">
<template slot-scope="scope">
<div class="tabBox_img" v-viewer>
<img v-lazy="scope.row.img_two" />
</div>
</template>
</el-table-column>
<el-table-column prop="sort" label="排序">
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<a @click="show(scope.row)">详情</a>
<el-divider direction="vertical" />
<a @click="edit(scope.row.id)">修改</a>
<el-divider direction="vertical" />
<a @click="del(scope.row, '删除', scope.$index)">删除</a>
</template>
</el-table-column>
</el-table>
<div class="acea-row row-right page">
<pagination :total="total" @pagination="pageChange" :limit.sync="from.limit" :page.sync="from.page" />
</div>
</el-card>
<el-dialog title="查看详情" :visible.sync="dialogTableVisible" v-if='dialogTableVisible'>
<el-descriptions title="share_list">
<el-descriptions-item label="自增ID">{{info.id}}</el-descriptions-item>
<el-descriptions-item label="名称">{{info.name}}</el-descriptions-item>
<el-descriptions-item label="分享链接">{{info.link}}</el-descriptions-item>
<el-descriptions-item label="图标"><el-image :src="info.img" :preview-src-list="info.img"></el-descriptions-item>
<el-descriptions-item label="蓝色图标"><el-image :src="info.img_two" :preview-src-list="info.img_two"></el-descriptions-item>
<el-descriptions-item label="排序">{{info.sort}}</el-descriptions-item>
</el-descriptions>
</el-dialog>
</div>
</template>
<script>
import { mapState } from 'vuex';
import { shareListSaveApi, shareListStatusApi, shareListDeleteApi, shareListUpdateApi, getShareListCreateApi, getShareListEditApi, getShareListListApi, getShareListReadApi} from '@/api/crud/shareList';
export default {
name: 'share_list',
data() {
return {
grid: {
xl: 7,
lg: 7,
md: 12,
sm: 24,
xs: 24,
},
loading: false,
from: {
page: 1,
limit: 15,
},
dataList: [],
total: 0,
dialogTableVisible: false,
info: {},
};
},
computed: {
...mapState('media', ['isMobile']),
labelWidth() {
return this.isMobile ? undefined : '75px';
},
labelPosition() {
return this.isMobile ? 'top' : 'left';
},
},
created() {
this.getList();
},
methods: {
show(row) {
getShareListReadApi(row.id).then(res => {
this.dialogTableVisible = true;
this.info = res.data;
}).catch(res => {
this.$Message.error(res.msg);
})
},
//
updateStatus(row, field) {
shareListStatusApi(row.id, {field: field, value: row[field]})
.then(async (res) => {
this.$message.success(res.msg);
})
.catch((res) => {
this.$message.error(res.msg);
});
},
//
add() {
this.$modalForm(getShareListCreateApi()).then(() => this.getList());
},
//
searchs() {
this.from.page = 1;
this.getList();
},
//
getList() {
this.loading = true;
getShareListListApi(this.from)
.then(async (res) => {
let data = res.data;
this.dataList = data.list;
this.total = data.count;
this.loading = false;
})
.catch((res) => {
this.loading = false;
this.$Message.error(res.msg);
});
},
//
pageChange(index) {
this.from.page = index;
this.getList();
},
//
edit(id) {
this.$modalForm(getShareListEditApi(id)).then(() => this.getList());
},
//
del(row, tit, num) {
let delfromData = {
title: tit,
num: num,
url: `crud/share_list/${row.id}`,
method: 'DELETE',
ids: '',
};
this.$modalSure(delfromData)
.then((res) => {
this.$Message.success(res.msg);
this.getList();
})
.catch((res) => {
this.$Message.error(res.msg);
});
},
},
};
</script>
<style scoped lang="stylus"></style>

View File

@ -0,0 +1,253 @@
<template>
<div>
<el-card shadow="never" class="ivu-mt" :body-style="{padding:0}">
<div class="padding-add">
<el-form
ref="curlFrom"
:model="from"
:label-width="labelWidth"
:label-position="labelPosition"
inline
@submit.native.prevent
>
<el-form-item label="标题:" label-for="title">
<el-input
v-model="from.title"
placeholder="请输入标题"
class="form_content_width"
/>
</el-form-item>
<el-form-item label="英文标题:" label-for="en_title">
<el-input
v-model="from.en_title"
placeholder="请输入英文标题"
class="form_content_width"
/>
</el-form-item>
<el-form-item label="简介:" label-for="profile">
<el-input
v-model="from.profile"
placeholder="请输入简介"
class="form_content_width"
/>
</el-form-item>
<el-form-item label="英文简介:" label-for="en_profile">
<el-input
v-model="from.en_profile"
placeholder="请输入英文简介"
class="form_content_width"
/>
</el-form-item>
<el-form-item label="产品详情:" label-for="content">
<el-input
v-model="from.content"
placeholder="请输入产品详情"
class="form_content_width"
/>
</el-form-item>
<el-form-item label="英文产品详情:" label-for="en_content">
<el-input
v-model="from.en_content"
placeholder="请输入英文产品详情"
class="form_content_width"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="searchs">查询</el-button>
</el-form-item>
</el-form>
</div>
</el-card>
<el-card shadow="never" dis-hover class="ivu-mt mt16">
<el-row type="flex">
<el-col v-bind="grid">
<el-button v-auth="['website_products-add']" type="primary" icon="md-add" @click="add">添加</el-button>
</el-col>
</el-row>
<el-table
:data="dataList"
ref="table"
class="mt25"
:loading="loading"
highlight-current-row
>
<el-table-column label="列表头图">
<template slot-scope="scope">
<div class="tabBox_img" v-viewer>
<img v-lazy="scope.row.image" />
</div>
</template>
</el-table-column>
<el-table-column label="轮播图">
<template slot-scope="scope">
<div class="tabBox_img" v-viewer>
<img v-lazy="img" v-for="img in scope.row.images_label" />
</div>
</template>
</el-table-column>
<el-table-column prop="title" label="标题">
</el-table-column>
<el-table-column prop="en_title" label="英文标题">
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<a @click="show(scope.row)">详情</a>
<el-divider direction="vertical" />
<a @click="edit(scope.row.id)">修改</a>
<el-divider direction="vertical" />
<a @click="del(scope.row, '删除', scope.$index)">删除</a>
</template>
</el-table-column>
</el-table>
<div class="acea-row row-right page">
<pagination :total="total" @pagination="pageChange" :limit.sync="from.limit" :page.sync="from.page" />
</div>
</el-card>
<el-dialog title="查看详情" :visible.sync="dialogTableVisible" v-if='dialogTableVisible'>
<el-descriptions title="website_products">
<el-descriptions-item label="自增ID">{{info.id}}</el-descriptions-item>
<el-descriptions-item label="列表头图"><el-image :src="info.image" :preview-src-list="info.image" /></el-descriptions-item>
<el-descriptions-item label="详情轮播图"><el-image v-for="item in info.images_label" :src="item" :preview-src-list="info.images_label" /></el-descriptions-item>
<el-descriptions-item label="标题">{{info.title}}</el-descriptions-item>
<el-descriptions-item label="英文标题">{{info.en_title}}</el-descriptions-item>
<el-descriptions-item label="简介">{{info.profile}}</el-descriptions-item>
<el-descriptions-item label="英文简介">{{info.en_profile}}</el-descriptions-item>
<el-descriptions-item label="产品详情">{{info.content}}</el-descriptions-item>
<el-descriptions-item label="英文产品详情">{{info.en_content}}</el-descriptions-item>
<el-descriptions-item label="添加时间">{{info.create_time}}</el-descriptions-item>
<el-descriptions-item label="修改时间">{{info.update_time}}</el-descriptions-item>
</el-descriptions>
</el-dialog>
</div>
</template>
<script>
import { mapState } from 'vuex';
import { websiteProductsSaveApi, websiteProductsStatusApi, websiteProductsDeleteApi, websiteProductsUpdateApi, getWebsiteProductsCreateApi, getWebsiteProductsEditApi, getWebsiteProductsListApi, getWebsiteProductsReadApi} from '@/api/crud/websiteProducts';
export default {
name: 'website_products',
data() {
return {
grid: {
xl: 7,
lg: 7,
md: 12,
sm: 24,
xs: 24,
},
loading: false,
from: {
title:'',
en_title:'',
profile:'',
en_profile:'',
content:'',
en_content:'',
page: 1,
limit: 15,
},
dataList: [],
total: 0,
dialogTableVisible: false,
info: {},
};
},
computed: {
...mapState('media', ['isMobile']),
labelWidth() {
return this.isMobile ? undefined : '75px';
},
labelPosition() {
return this.isMobile ? 'top' : 'left';
},
},
created() {
this.getList();
},
methods: {
show(row) {
getWebsiteProductsReadApi(row.id).then(res => {
this.dialogTableVisible = true;
this.info = res.data;
}).catch(res => {
this.$Message.error(res.msg);
})
},
//
updateStatus(row, field) {
websiteProductsStatusApi(row.id, {field: field, value: row[field]})
.then(async (res) => {
this.$message.success(res.msg);
})
.catch((res) => {
this.$message.error(res.msg);
});
},
//
add() {
this.$modalForm(getWebsiteProductsCreateApi()).then(() => this.getList());
},
//
searchs() {
this.from.page = 1;
this.getList();
},
//
getList() {
this.loading = true;
getWebsiteProductsListApi(this.from)
.then(async (res) => {
let data = res.data;
this.dataList = data.list;
this.total = data.count;
this.loading = false;
})
.catch((res) => {
this.loading = false;
this.$Message.error(res.msg);
});
},
//
pageChange(index) {
this.from.page = index;
this.getList();
},
//
edit(id) {
this.$modalForm(getWebsiteProductsEditApi(id)).then(() => this.getList());
},
//
del(row, tit, num) {
let delfromData = {
title: tit,
num: num,
url: `crud/website_products/${row.id}`,
method: 'DELETE',
ids: '',
};
this.$modalSure(delfromData)
.then((res) => {
this.$Message.success(res.msg);
this.getList();
})
.catch((res) => {
this.$Message.error(res.msg);
});
},
},
};
</script>
<style scoped lang="stylus"></style>

View File

@ -0,0 +1,244 @@
<template>
<div>
<el-card shadow="never" class="ivu-mt" :body-style="{padding:0}">
<div class="padding-add">
<el-form
ref="curlFrom"
:model="from"
:label-width="labelWidth"
:label-position="labelPosition"
inline
@submit.native.prevent
>
<el-form-item label="留言产品:" label-for="product_id">
<el-input
v-model="from.product_id"
placeholder="请输入留言产品"
class="form_content_width"
/>
</el-form-item>
<el-form-item label="姓名:" label-for="name">
<el-input
v-model="from.name"
placeholder="请输入姓名"
class="form_content_width"
/>
</el-form-item>
<el-form-item label="电子邮箱:" label-for="emil">
<el-input
v-model="from.emil"
placeholder="请输入电子邮箱"
class="form_content_width"
/>
</el-form-item>
<el-form-item label="电话:" label-for="mobile">
<el-input
v-model="from.mobile"
placeholder="请输入电话"
class="form_content_width"
/>
</el-form-item>
<el-form-item label="公司:" label-for="company">
<el-input
v-model="from.company"
placeholder="请输入公司"
class="form_content_width"
/>
</el-form-item>
<el-form-item label="主题:" label-for="subject">
<el-input
v-model="from.subject"
placeholder="请输入主题"
class="form_content_width"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="searchs">查询</el-button>
</el-form-item>
</el-form>
</div>
</el-card>
<el-card shadow="never" dis-hover class="ivu-mt mt16">
<el-row type="flex">
<el-col v-bind="grid">
<el-button v-auth="['website_products_message-add']" type="primary" icon="md-add" @click="add">添加</el-button>
</el-col>
</el-row>
<el-table
:data="dataList"
ref="table"
class="mt25"
:loading="loading"
highlight-current-row
>
<el-table-column prop="product_id" label="留言产品">
</el-table-column>
<el-table-column prop="name" label="姓名">
</el-table-column>
<el-table-column prop="emil" label="电子邮箱">
</el-table-column>
<el-table-column prop="mobile" label="电话">
</el-table-column>
<el-table-column prop="company" label="公司">
</el-table-column>
<el-table-column prop="subject" label="主题">
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<a @click="show(scope.row)">详情</a>
<el-divider direction="vertical" />
<a @click="edit(scope.row.id)">修改</a>
<el-divider direction="vertical" />
<a @click="del(scope.row, '删除 ', scope.$index)">删除</a>
</template>
</el-table-column>
</el-table>
<div class="acea-row row-right page">
<pagination :total="total" @pagination="pageChange" :limit.sync="from.limit" :page.sync="from.page" />
</div>
</el-card>
<el-dialog title="查看详情" :visible.sync="dialogTableVisible" v-if='dialogTableVisible'>
<el-descriptions title="website_products_message">
<el-descriptions-item label="自增ID">{{info.id}}</el-descriptions-item>
<el-descriptions-item label="留言产品">{{info.product_id}}</el-descriptions-item>
<el-descriptions-item label="姓名">{{info.name}}</el-descriptions-item>
<el-descriptions-item label="电子邮箱">{{info.emil}}</el-descriptions-item>
<el-descriptions-item label="电话">{{info.mobile}}</el-descriptions-item>
<el-descriptions-item label="公司">{{info.company}}</el-descriptions-item>
<el-descriptions-item label="主题">{{info.subject}}</el-descriptions-item>
<el-descriptions-item label="内容">{{info.content}}</el-descriptions-item>
<el-descriptions-item label="添加时间">{{info.create_time}}</el-descriptions-item>
<el-descriptions-item label="修改时间">{{info.update_time}}</el-descriptions-item>
</el-descriptions>
</el-dialog>
</div>
</template>
<script>
import { mapState } from 'vuex';
import { websiteProductsMessageSaveApi, websiteProductsMessageStatusApi, websiteProductsMessageDeleteApi, websiteProductsMessageUpdateApi, getWebsiteProductsMessageCreateApi, getWebsiteProductsMessageEditApi, getWebsiteProductsMessageListApi, getWebsiteProductsMessageReadApi} from '@/api/crud/websiteProductsMessage';
export default {
name: 'website_products_message',
data() {
return {
grid: {
xl: 7,
lg: 7,
md: 12,
sm: 24,
xs: 24,
},
loading: false,
from: {
product_id:'',
name:'',
emil:'',
mobile:'',
company:'',
subject:'',
page: 1,
limit: 15,
},
dataList: [],
total: 0,
dialogTableVisible: false,
info: {},
};
},
computed: {
...mapState('media', ['isMobile']),
labelWidth() {
return this.isMobile ? undefined : '75px';
},
labelPosition() {
return this.isMobile ? 'top' : 'left';
},
},
created() {
this.getList();
},
methods: {
show(row) {
getWebsiteProductsMessageReadApi(row.id).then(res => {
this.dialogTableVisible = true;
this.info = res.data;
}).catch(res => {
this.$Message.error(res.msg);
})
},
//
updateStatus(row, field) {
websiteProductsMessageStatusApi(row.id, {field: field, value: row[field]})
.then(async (res) => {
this.$message.success(res.msg);
})
.catch((res) => {
this.$message.error(res.msg);
});
},
//
add() {
this.$modalForm(getWebsiteProductsMessageCreateApi()).then(() => this.getList());
},
//
searchs() {
this.from.page = 1;
this.getList();
},
//
getList() {
this.loading = true;
getWebsiteProductsMessageListApi(this.from)
.then(async (res) => {
let data = res.data;
this.dataList = data.list;
this.total = data.count;
this.loading = false;
})
.catch((res) => {
this.loading = false;
this.$Message.error(res.msg);
});
},
//
pageChange(index) {
this.from.page = index;
this.getList();
},
//
edit(id) {
this.$modalForm(getWebsiteProductsMessageEditApi(id)).then(() => this.getList());
},
//
del(row, tit, num) {
let delfromData = {
title: tit,
num: num,
url: `crud/website_products_message/${row.id}`,
method: 'DELETE',
ids: '',
};
this.$modalSure(delfromData)
.then((res) => {
this.$Message.success(res.msg);
this.getList();
})
.catch((res) => {
this.$Message.error(res.msg);
});
},
},
};
</script>
<style scoped lang="stylus"></style>

View File

@ -0,0 +1,39 @@
// +---------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +---------------------------------------------------------------------
// | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
// +---------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +---------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +---------------------------------------------------------------------
import LayoutMain from '@/layout';
import setting from '@/setting'
let routePre = setting.routePre
const meta = {
auth: true,
}
const pre = 'leave_word_'
export default {
path: `${routePre}`,
name: 'crud_leave_word',
header: '',
meta,
component: LayoutMain,
children: [
{
path: 'crud/leave_word',
name: `${pre}list`,
meta: {
auth: ['leave_word-crud-list-index'],
title: '联系我们留言',
},
component: () => import('@/pages/crud/leaveWord/index'),
},
],
}

View File

@ -0,0 +1,39 @@
// +---------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +---------------------------------------------------------------------
// | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
// +---------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +---------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +---------------------------------------------------------------------
import LayoutMain from '@/layout';
import setting from '@/setting'
let routePre = setting.routePre
const meta = {
auth: true,
}
const pre = 'share_list_'
export default {
path: `${routePre}`,
name: 'crud_share_list',
header: '',
meta,
component: LayoutMain,
children: [
{
path: 'crud/share_list',
name: `${pre}list`,
meta: {
auth: ['share_list-crud-list-index'],
title: '分享列表',
},
component: () => import('@/pages/crud/shareList/index'),
},
],
}

View File

@ -0,0 +1,39 @@
// +---------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +---------------------------------------------------------------------
// | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
// +---------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +---------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +---------------------------------------------------------------------
import LayoutMain from '@/layout';
import setting from '@/setting'
let routePre = setting.routePre
const meta = {
auth: true,
}
const pre = 'website_products_'
export default {
path: `${routePre}`,
name: 'crud_website_products',
header: '',
meta,
component: LayoutMain,
children: [
{
path: 'crud/website_products',
name: `${pre}list`,
meta: {
auth: ['website_products-crud-list-index'],
title: '网站产品管理',
},
component: () => import('@/pages/crud/websiteProducts/index'),
},
],
}

View File

@ -0,0 +1,39 @@
// +---------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +---------------------------------------------------------------------
// | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
// +---------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +---------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +---------------------------------------------------------------------
import LayoutMain from '@/layout';
import setting from '@/setting'
let routePre = setting.routePre
const meta = {
auth: true,
}
const pre = 'website_products_message_'
export default {
path: `${routePre}`,
name: 'crud_website_products_message',
header: '',
meta,
component: LayoutMain,
children: [
{
path: 'crud/website_products_message',
name: `${pre}list`,
meta: {
auth: ['website_products_message-crud-list-index'],
title: '产品留言板',
},
component: () => import('@/pages/crud/websiteProductsMessage/index'),
},
],
}