| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521 |
- <?php
- use common\helpers\ComponentHelper;
- ComponentHelper::loadComponentView('com-dialog-select');
- ?>
- <div id="app" v-cloak>
- <el-card shadow="never" style="border:0;min-width: 1000px;" body-style="background-color: #f3f3f3;padding: 10px 0 0;" v-loading="loading">
- <div slot="header">
- <span>活动列表</span>
- </div>
- <div class="table-body">
- <div class="search-item">
- <el-select v-model="search.activity_status" clearable placeholder="状态选项" @change="toSearch">
- <el-option v-for="item in statusList" :key="item.status" :label="item.value"
- :value="item.status" >
- </el-option>
- </el-select>
- </div>
-
- <div class="search-item">
- <el-date-picker v-model="time" type="daterange" range-separator="至"
- start-placeholder="开始日期" end-placeholder="结束日期" @change="timeChange" value-format="yyyy-MM-dd HH:mm:ss">
- </el-date-picker>
- </div>
-
- <el-button type="primary" size="small" icon="el-icon-search" style="padding: 9px 15px !important;" @click="toSearch">搜索</el-button>
- <el-button size="small" icon="el-icon-refresh-right" style="padding: 9px 15px !important;" @click="reset">重置</el-button>
- <div style="float: right">
- <el-button type="primary" size="small" icon="el-icon-plus" style="padding: 9px 15px !important;" @click="addbox">新建活动
- </el-button>
- </div>
- <el-table :data="list" stripe v-loading="loading" size="small" style="margin: 15px 0;">
- <el-table-column prop="id" width="50" align="center"></el-table-column>
- <el-table-column prop="title" label="活动名称" align="center"></el-table-column>
- <el-table-column label="商品信息" prop="goods_name" align="center">
- <template slot-scope="scope">
- <div flex="cross:center">
- <div style="margin-right: 10px;">
- <el-image style="width: 50px; height: 50px;border-radius: 5px;" :src="scope.row.cover_pic"></el-image>
- </div>
- <el-tooltip class="item" effect="dark" :content="scope.row.goods_name" placement="top">
- <span class="over2">{{scope.row.goods_name}}</span>
- </el-tooltip>
- </div>
- </template>
- </el-table-column>
-
- <el-table-column prop="hot_time" label="活动预热时间" align="center">
- </el-table-column>
- <el-table-column prop="begin_time" label="活动开始时间" align="center">
- </el-table-column>
- <el-table-column prop="end_time" label="活动结束时间" align="center">
- </el-table-column>
- <el-table-column prop="now_stock" label="剩余库存" align="center"></el-table-column>
- <el-table-column prop="activity_status_msg" label="活动当前状态" align="center">
- <!-- <template slot-scope="scope">
- </template> -->
- </el-table-column>
- <el-table-column prop="price" label="秒杀价格" align="center"></el-table-column>
- <el-table-column prop="user_id" width="140" label="操作" align="center">
- <template slot-scope="scope">
- <el-tooltip class="item" effect="dark" content="详情" placement="top-start">
- <el-button size="mini" type="primary" icon="el-icon-s-unfold" circle @click="details(scope.row.id)"></el-button>
- </el-tooltip>
-
- <el-button size="mini" type="primary" icon="el-icon-edit" circle @click="editbox(scope.row.id)"></el-button>
-
- <el-button size="mini" type="danger" icon="el-icon-delete" circle @click="del(scope.row.id)"></el-button>
-
- </template>
- </el-table-column>
- </el-table>
- <div flex="box:last cross:center">
- <div></div>
- <div>
- <el-pagination
- v-if="list.length > 0"
- style="display: inline-block;float: right;"
- background :page-size="pageSize"
- @current-change="pageChange"
- layout="prev, pager, next" :current-page="current_page"
- :total="totalCount">
- </el-pagination>
- </div>
- </div>
- </div>
- </el-card>
- <!-- 新建/编辑弹层 -->
- <el-dialog :title="activityType == 'add' ? '新建活动' : '编辑活动'" :visible.sync="activityShow"width="800px" @open="activityOpen" @close="activityReset('dynamicValidateForm')">
- <div>
- <el-form :model="form" ref="dynamicValidateForm" label-width="120px" class="demo-dynamic">
- <el-form-item prop="begin_time" label="活动开始时间"
- :rules="[{ required: true, message: '请选择活动开始时间', trigger: 'blur' }]">
- <el-date-picker
- v-model="form.begin_time"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- placeholder="选择日期">
- </el-date-picker>
- </el-form-item>
-
- <el-form-item prop="end_time" label="活动结束时间"
- :rules="[{ required: true, message: '请选择活动结束时间', trigger: 'blur' }]">
- <el-date-picker
- v-model="form.end_time"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss"
- placeholder="选择日期">
- </el-date-picker>
- </el-form-item>
- <el-form-item prop="hot_time" label="活动预热时间"
- :rules="[{ required: true, message: '请选择活动预热时间', trigger: 'blur' }]">
- <el-date-picker
- v-model="form.hot_time"
- type="datetime"
- value-format="yyyy-MM-dd HH:mm:ss"
- placeholder="选择日期">
- </el-date-picker>
- </el-form-item>
- <el-form-item label="选择商品" prop="goods_id" :rules="[{ required: true, message: '请选择商品', trigger: 'blur' }]">
- <com-dialog-select v-model="goods_id" :multiple="false" url="mall/goods/search"
- @selected="selectGoodsWarehouse" ref="comDialogSelect"
- :params="{is_achievement: 1}" :show-mch-source="true" :extra-search-fields="['goods_source']">
- <el-button>选择商品</el-button>
- </com-dialog-select>
- </el-form-item>
- <el-form-item v-if="formGoodsList.length>0" label="选中商品">
- <div class="table-body">
- <template>
- <el-table
- :data="formGoodsList"
- border
- style="width: 680px">
- <el-table-column
- label="商品"
- min-width="400">
- <template slot-scope="scope">
- <div flex="box:first">
- <div style="padding-right: 10px;">
- <com-image mode="aspectFill" :src="scope.row.cover_pic"></com-image>
- </div>
- <div>
- <div>
- {{scope.row.goods_name}}
- </div>
- <div>
- <span style="color:red;margin-right: 10px;">
- ¥{{scope.row.price}}
- </span>
- <span>
- 库存:{{scope.row.stock}}
- </span>
- </div>
- </div>
- </div>
- </template>
- </el-table-column>
- <el-table-column label="操作" min-width="150" align="center">
- <template slot-scope="scope">
- <el-button @click="delGoods" type="text" size="small">删除</el-button>
- </template>
- </el-table-column>
- </el-table>
- </template>
- </div>
- </el-form-item>
- <el-form-item label="商品型号" prop="attr_id" :rules="[{ required: true, message: '请选择商品型号', trigger: 'blur' }]">
- <el-select v-model="form.attr_id" placeholder="请选择">
- <el-option
- v-for="item in goodattrlist"
- :key="item.id"
- :label="item.name"
- :value="item.id">
- </el-option>
- </el-select>
- </el-form-item>
-
- <el-form-item label="设置库存" prop="stock" :rules="[{ required: true, message: '请设置库存', trigger: 'blur' }]">
- <el-input-number :min="0" v-model="form.stock"></el-input-number>
- </el-form-item>
- <el-form-item label="秒杀售价" prop="price" :rules="[{ required: true, message: '请输入秒杀售价', trigger: 'blur' }]">
- <el-input-number :min="0" v-model="form.price"></el-input-number>
- </el-form-item>
- <el-form-item label="每人限购" prop="limit_nums" prop="price">
- <el-input-number :min="0" v-model="form.limit_nums"></el-input-number>
- <div class="tips-text" >限制每个用户最多购买商品数(0或空为不做限制)</div>
- </el-form-item>
- <el-form-item label="活动名称" prop="title" :rules="[{ required: true, message: '请输入活动名称', trigger: 'blur' }]">
- <el-input
- type="textarea"
- placeholder="请输入内容"
- v-model="form.title">
- </el-input>
- </el-form-item>
- </el-form>
- </div>
- <span slot="footer" class="dialog-footer">
- <el-button @click="activityCancel('dynamicValidateForm')">取 消</el-button>
- <el-button @click="activityReset('dynamicValidateForm')">重 置</el-button>
- <el-button type="primary" @click="addActivity('dynamicValidateForm')">确 定</el-button>
- </span>
- </el-dialog>
- </div>
- <script>
- const app = new Vue({
- el: '#app',
- data: {
- statusList:[],
- time:'',
- loading: false,
- search: {
- activity_status:'',
- search_begin_time:'',
- search_end_time:'',
- page: this.current_page
- },
- form: {
- title:'',
- goods_id:'',
- attr_id:'',
- begin_time:'',
- end_time:'',
- stock:'',
- hot_time:'',
- price:'',
- limit_nums: '0',
- },
- goods_id:'',
- edit: {
-
- },
- goodattrlist:[],
- list:[],
- statusList:[],
- loading:false,
- activityShow:false, // 活动弹层
- activityType: '', // 活动弹层类型
- activityId: 0, // 活动id
- pageSize:20,
- current_page:1,
- totalCount:0,
- formGoodsList:[],
- goods_price:'',
- },
- mounted() {
- this.getDataList()
- },
- methods: {
- // 获取数据
- getDataList(search = {}) {
- this.loading = true;
- request({
- params: {
- r: '/seckill/activity/list',
- ...search
- },
- method: 'get',
- }).then(e => {
- console.log(e,'77777777777');
- this.list = e.data.data.list
- this.pageSize = e.data.data.page_size
- this.totalCount = e.data.data.count
- let arr = Object.values(e.data.data.status_map).map((item,index)=> {
- return {
- "status": index + 1,
- "value": item
- }
- })
- console.log(arr);
- this.statusList = arr
- this.loading = false;
- }).catch(e => {
- this.loading = false;
- });
- },
-
-
- // 弹层重置
- activityReset(formName) {
- this.$refs[formName].resetFields();
- },
- activityCancel(formName) {
- this.form.id = 0;
- this.activityShow = false
- },
- // 新建活动
- addActivity(formName) {
- console.log(this.form,'-------');
- this.$refs[formName].validate((valid) => {
- if (valid) {
- // 添加提交
- console.log(this.form.goods_id);
- if(this.activityId){
- this.form.id = this.activityId
- }
- // this.form.goods_id = this.form.goods_id.id
- request({
- method: 'post',
- params: {
- r: '/seckill/activity/save',
- },
- data: this.form
- }).then(res => {
- console.log(res);
- if (res.data.code == 0) {
- this.$message.success('添加成功');
- this.activityShow = false
- this.getDataList()
- } else {
- this.$message.error(res.data.msg);
- }
- }).catch(e => {
- console.log(e);
- });
- } else {
- return false;
- }
- });
-
- },
- // 活动打开
- activityOpen() {
- console.log(this.activityType);
- if(this.activityType == 'edit') {
- // 数据回显
- console.log(this.activityId);
- request({
- params: {
- r: '/seckill/activity/info',
- id: this.activityId
- }
- }).then(res => {
- if (res.data.code == 0) {
- console.log(res.data.data.goods.goods_id,'444444444444');
- this.formGoodsList = [res.data.data.goods]
- this.goodattrlist = [res.data.data.goods_attr]
- this.form.title = res.data.data.title
- this.form.goods_id = res.data.data.goods.goods_id
- this.form.attr_id = res.data.data.goods_attr.id
- this.form.price = res.data.data.price
- this.form.stock = res.data.data.stock
- this.form.begin_time = res.data.data.begin_time
- this.form.end_time = res.data.data.end_time
- this.form.hot_time = res.data.data.hot_time
- this.form.limit_nums = res.data.data.limit_nums
- console.log(this.form,'55555555');
- } else {
- this.$message.error(res.data.msg);
- }
- }).catch(e => {
- console.log(e);
- });
- }else {
- this.formGoodsList = []
- this.goodattrlist = []
- this.form = {
- title:'',
- goods_id:'',
- attr_id:'',
- begin_time:'',
- end_time:'',
- stock:'',
- hot_time:'',
- price:'',
- id : 0,
- }
- }
- },
- addbox() {
- this.activityType = 'add'
- this.activityShow = true
- this.activityId = 0
- },
- editbox(id) {
- this.activityType = 'edit'
- this.activityId = id
- this.activityShow = true
- },
- details(id) {
- navigateTo({
- r: 'seckill/order/index',
- id,
- });
- },
- del(id) {
- let self = this;
- self.$confirm('删除该活动, 是否继续?', '提示', {
- confirmButtonText: '确定',
- cancelButtonText: '取消',
- type: 'warning'
- }).then(() => {
- request({
- params: {
- r: '/seckill/activity/delete',
- },
- method: 'post',
- data: {
- id
- }
- }).then(e => {
- if (e.data.code === 0) {
- self.$message.success(e.data.msg);
- self.getDataList()
- } else {
- self.$message.error(e.data.msg);
- }
- }).catch(e => {
- console.log(e);
- });
- }).catch(() => {
- self.$message.info('已取消删除')
- });
- },
- selectGoodsWarehouse(v) {
- console.log(v,'商品选中9999999');
- this.formGoodsList = [];
- this.goods_price = v.price;
- this.formGoodsList.push(v);
- this.form.goods_id = v.id;
- //先验证商品
- this.$refs.dynamicValidateForm.validateField('goods_id');
- console.log(this.form.goods_id,'111111111111');
- this.getattrlist(v.id)
- },
- getattrlist(id) {
- request({
- params: {
- r: '/seckill/activity/get-goods-attr',
- goods_id:id
- }
- }).then(res => {
- if (res.data.code == 0) {
- console.log(res.data,'7777777777777777');
- this.goodattrlist = res.data.data
- } else {
- this.$message.error(res.data.msg);
- }
- }).catch(e => {
- });
- },
- delGoods() {
- this.formGoodsList = [];
- this.form.goods_id = '';
- //先验证商品
- this.$refs.dynamicValidateForm.validateField('goods_id');
- // 去除商品选中值
- this.$refs['comDialogSelect'].radioSelection = null;
- this.$refs['comDialogSelect'].multipleSelection = [];
- },
- timeChange(v) {
- console.log(v,'time99999999999');
- if(v) {
- this.search.search_begin_time = v[0]
- this.search.search_end_time = v[1]
- }else {
- this.search.search_begin_time = ''
- this.search.search_end_time = ''
- }
-
- },
- // 切换分页
- pageChange(v) {
- this.search.page = v
- this.getDataList(this.search)
- },
- // 搜索
- toSearch() {
- this.getDataList(this.search)
- },
- // 重置
- reset() {
-
- this.search = {
- status:'',
- time:''
- },
- this.getDataList()
- },
- timeformat(v) {
- let time = new Date(v*1000)
- return time.getFullYear() +'/'+(time.getUTCMonth()+1)+'/'+time.getDate() + ' '+ (time.getHours()<10?'0' +time.getHours():time.getHours()) +':'+ (time.getMinutes()<10?'0'+time.getMinutes():time.getMinutes()) + ':'+ (time.getSeconds()<10?'0'+time.getSeconds():time.getSeconds())
- },
- },
- })
- </script>
- <style>
- .search-item {
- display: inline-block;
- margin: 0 20px 0 0 ;
- }
- .red{
- color: #d9001b;
- }
- .orange {
- color: #f59a23;
- }
- .green {
- color: #4b7902;
- }
- </style>
|