zory před 2 měsíci
rodič
revize
90d74a8e9f

+ 26 - 0
src/api/model/task.js

@@ -0,0 +1,26 @@
+import config from "@/config"
+import http from "@/utils/request"
+
+export default {
+    job: {
+        url: `${config.API_URL}/task/job`,
+        name: "-",
+        get: async function(data={}){
+            return await http.get(this.url, data);
+        }
+    },
+    save: {
+        url: `${config.API_URL}/task/save`,
+        name: "-",
+        post: async function(data={}){
+            return await http.post(this.url, data);
+        }
+    },
+    del: {
+        url: `${config.API_URL}/task/del`,
+        name: "-",
+        post: async function(data={}){
+            return await http.post(this.url, data);
+        }
+    }
+}

+ 7 - 0
src/views/manage/task/category/components/form.vue

@@ -19,6 +19,10 @@
                     </el-form-item>
                 </el-col>
             </el-row>
+            <el-form-item label="类目标识" prop="sign">
+                <el-input v-model="formData.sign" clearable placeholder="请输入"></el-input>
+                <div class="el-form-item-msg"></div>
+            </el-form-item>
             <el-form-item label="状态" prop="status">
                 <el-radio-group v-model="formData.status">
                     <el-radio-button :label="1">正常</el-radio-button>
@@ -53,6 +57,9 @@ export default {
                 ],
                 name: [
                     {required: true, message: '请输入'}
+                ],
+                sign: [
+                    {required: true, message: '请输入'}
                 ]
             }
         }

+ 1 - 1
src/views/manage/task/category/components/table.vue

@@ -61,7 +61,7 @@ export default {
                     return this.$message.error(resp.msg);
                 }
                 this.$message.success(resp.msg);
-                this.$emit("success");
+                this.refresh()
             }).catch(()=>{})
         },
         refresh(){

+ 231 - 0
src/views/manage/task/lists/components/form.vue

@@ -0,0 +1,231 @@
+<template>
+    <el-drawer :title="titleMap[mode]" :append-to-body="true" v-model="visible" :size="1000" destroy-on-close :close-on-click-modal="false" @closed="$emit('closed')" :with-header="false">
+        <el-container class="flex-column" v-loading="loading">
+            <div class="drawer-detail-main">
+                <div class="drawer-detail-header">
+                    <div class="drawer-detail-header-body">
+                        <div class="drawer-detail-header-left">{{ titleMap[mode] }}</div>
+                        <div class="drawer-detail-header-left">
+                            <el-button type="default" icon="el-icon-close" @click="visible=false"></el-button>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <el-main>
+                <el-form ref="dialogForm" :model="formData" :rules="rules" label-width="100px" label-position="top">
+                    <el-form-item label="发布类型" prop="auto">
+                        <el-radio-group v-model="formData.auto" @change="checkAuto">
+                            <el-radio border :label="1">手动录入</el-radio>
+                            <el-radio border :label="2">星川自动采集</el-radio>
+                        </el-radio-group>
+                    </el-form-item>
+                    <template v-if="formData.auto==2">
+                        <el-form-item label="任务ID" prop="job_id">
+                            <el-input v-model="formData.job_id" clearable placeholder="任务ID">
+                                <template #append>
+                                    <el-button @click="getJobDetail">获取数据</el-button>
+                                </template>
+                            </el-input>
+                            <div class="el-form-item-msg"></div>
+                        </el-form-item>
+                    </template>
+                    <template v-if="formData.auto==1 || autoState">
+                        <el-form-item label="发布栏目" prop="category">
+                            <el-select v-model="formData.category" clearable placeholder="请选择发布栏目" @change="checkCategory" :style="{width: '100%'}">
+                                <el-option :value="item.sign" :label="item.name" v-for="(item,index) in categoryData" :key="index"></el-option>
+                            </el-select>
+                            <div class="el-form-item-msg"></div>
+                        </el-form-item>
+                        <el-form-item label="任务标题" prop="title">
+                            <el-input v-model="formData.title" clearable placeholder="任务标题"></el-input>
+                            <div class="el-form-item-msg"></div>
+                        </el-form-item>
+                        <fieldset>
+                            <legend><el-tag>产品介绍</el-tag></legend>
+                            <el-form-item label="所属行业" prop="category_detail">
+                                <el-input v-model="formData.category_detail" clearable placeholder="所属行业"></el-input>
+                                <div class="el-form-item-msg">直接输入即可,比如:女鞋</div>
+                            </el-form-item>
+                            <div class="goods-flex">
+                                <div class="">
+                                    <el-form-item label="商品图片" prop="product_cover_url">
+                                        <sc-upload v-model="formData.product_cover_url"></sc-upload>
+                                        <div class="el-form-item-msg"></div>
+                                    </el-form-item>
+                                </div>
+                                <div class="goods-right">
+                                    <el-form-item label="商品标题" prop="product_name">
+                                        <el-input v-model="formData.product_name" clearable placeholder="商品标题"></el-input>
+                                        <div class="el-form-item-msg"></div>
+                                    </el-form-item>
+                                    <el-form-item label="商品ID" prop="product_id">
+                                        <el-input v-model="formData.product_id" clearable placeholder="商品ID"></el-input>
+                                        <div class="el-form-item-msg"></div>
+                                    </el-form-item>
+                                </div>
+                            </div>
+                            <el-form-item label="产品卖点" prop="product_selling_point">
+                                <el-input v-model="formData.product_selling_point" type="textarea" rows="5" clearable placeholder="产品卖点"></el-input>
+                                <div class="el-form-item-msg"></div>
+                            </el-form-item>
+                            <el-form-item label="目标人群" prop="target_audience">
+                                <el-input v-model="formData.target_audience" type="textarea" rows="5" clearable placeholder="目标人群"></el-input>
+                                <div class="el-form-item-msg"></div>
+                            </el-form-item>
+                        </fieldset>
+                        
+                        <el-form-item label="投稿截止时间" prop="expiration_time_end">
+                            <div style="width: 30%;">
+                                <el-date-picker v-model="formData.expiration_time_end" placeholder="投稿截止时间" type="datetime" />
+                            </div>
+                            <div class="el-form-item-msg"></div>
+                        </el-form-item>
+                        <el-row :gutter="15">
+                            <el-col :span="12">
+                                <el-form-item label="招募人数" prop="need_number">
+                                    <el-input v-model="formData.need_number" clearable placeholder="招募人数">
+                                        <template #append>人</template>
+                                    </el-input>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="12">
+                                <el-form-item label="预期消耗目标" prop="total_budget">
+                                    <el-input v-model="formData.total_budget" clearable placeholder="预期消耗目标"></el-input>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+                        <el-form-item label="任务要求" prop="content" class="label-item">
+                            <sc-editor v-model="formData.content" placeholder="请输入" :height="600" style="width: 100%;"></sc-editor>
+                            <div class="el-form-item-msg"></div>
+                        </el-form-item>
+                    </template>
+                </el-form>
+            </el-main>
+            <el-footer style="text-align: right;">
+                <el-button @click="visible=false" >取 消</el-button>
+                <el-button v-if="mode!='show'" type="primary" :loading="isSaveing" @click="submit()">保 存</el-button>
+            </el-footer>
+        </el-container>
+    </el-drawer>
+</template>
+
+<script>
+import { defineAsyncComponent } from 'vue';
+const scEditor = defineAsyncComponent(() => import('@/components/scEditor'));
+export default {
+    components: {
+        scEditor
+    },
+    data() {
+        return {
+            categoryData:[],
+            loading: false,
+            mode:"add",
+            visible: false,
+            isSaveing: false,
+            autoState:false,
+            titleMap:{
+                add:"发布新任务",
+                edit:"编辑新任务"
+            },
+            rules:{
+                auto:[
+                    {required: true, message: '请选择'}
+                ],
+                expiration_time_end:[
+                    {required: true, message: '请选择'}
+                ],
+                need_number:[
+                    {required: true, message: '请输入'}
+                ],
+                total_budget:[
+                    {required: true, message: '请输入'}
+                ],
+                job_id:[
+                    {required: true, message: '请输入'}
+                ],
+                title: [
+                    {required: true, message: '请输入'}
+                ],
+                category: [
+                    {required: true, message: '请选择'}
+                ],
+                content: [
+                    {required: true, message: '请输入'}
+                ],
+            },
+            formData:{}
+        }
+    },
+    methods: {
+        checkCategory(data){
+            
+        },
+        checkAuto(data){
+            if (data == 2) {
+                this.autoState = false;
+            }
+        },
+        open(mode = 'add'){
+            this.mode = mode;
+            this.visible = true;
+            this.getCategory();
+            if (mode == 'add') {
+                this.formData = {
+                    auto:2
+                }
+            }
+            return this
+        },
+        async getJobDetail(){
+            if (!this.formData.job_id) {
+                return this.$message.error("请输入任务ID")
+            }
+            var loading = this.$loading();
+            var resp = await this.$API.task.job.get(this.formData);
+            loading.close()
+            this.autoState = true;
+            if (resp.code == 0) {
+                this.$message.error(resp.msg)
+                return ;
+            }
+            this.formData = resp.data;
+        },
+        //表单注入数据
+        setData(data){
+            this.formData = JSON.parse(JSON.stringify(data));
+        },
+        async getCategory(){
+            var resp = await this.$API.category.list.get({"type":1});
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg)
+            }
+            this.categoryData = resp.data;
+        },
+        async submit(){
+            var validate = await this.$refs.dialogForm.validate().catch(()=>{});
+            if(!validate){ return false }
+            if (this.formData.auto == 2 && !this.autoState) {
+                return this.$message.error("请先完成数据获取")
+            }
+            this.isSaveing = true;
+            var resp = await this.$API.task.save.post(this.formData);
+            this.isSaveing = false;
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.visible = false;
+            this.formData = {};
+            this.$emit("success");
+        }
+    }
+}
+</script>
+
+<style>
+.goods-flex{display: flex;align-items: start;gap: 15px;}
+.goods-flex .goods-right{flex: 1;}
+</style>

+ 62 - 0
src/views/manage/task/lists/components/option.vue

@@ -0,0 +1,62 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">按需操作</el-tag>
+        </legend>
+        <div class="op-header">
+            <div class="left-panel">
+                <el-button icon="el-icon-plus" type="primary" @click="addData()">发布任务</el-button>
+                <el-button icon="el-icon-unlock" @click="table_batch_status(1)" :disabled="dataSelect.length>0?false:true">启用</el-button>
+                <el-button icon="el-icon-lock" type="danger" @click="table_batch_status(2)" :disabled="dataSelect.length>0?false:true">禁用</el-button>
+            </div>
+        </div>
+    </fieldset>
+    <formMain ref="formMain" @success="handleSuccess"></formMain>
+</template>
+
+<script>
+import formMain from './form';
+export default {
+    components: {
+        formMain
+    },
+    props: {
+        dataSelect: { type: Array, default: () => [] },
+        dataSelectFull: { type: Array, default: () => [] }
+    },
+    data(){
+        return {
+
+        }
+    },
+    methods: {
+        addData(){
+            this.$nextTick(() => {
+                this.$refs.formMain.open()
+            })
+        },
+        async table_batch_status(status){
+            if (this.dataSelect.length == 0) {
+                return this.$message.error("请选择修改数据")
+            }
+            var loading = this.$loading()
+            let submitData = {"id":this.dataSelect,"value":status,"field":"status","type":"batch"};
+            loading.close()
+            var resp = await this.$API.category.batch.post(submitData);
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.$emit("success");
+        },
+        handleSuccess(){
+            this.$emit("success");
+        },
+        table_add(){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("add")
+            })
+        },
+    }
+}
+</script>

+ 51 - 0
src/views/manage/task/lists/components/search.vue

@@ -0,0 +1,51 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">条件筛选</el-tag>
+        </legend>
+        <el-form class="lv-form-inline" ref="searchForm" :model="searchKey" label-position="right" label-width="100px">
+            <div class="search-form">
+                <div class="form-left">
+                    <el-row :gutter="10">
+                        <el-col :xs="12" :sm="12" :md="12" :lg="6" :xl="4">
+                            <el-input v-model="searchKey.title" placeholder="任务标题" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>任务标题</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :xs="12" :sm="12" :md="12" :lg="6" :xl="4">
+                            <el-select v-model="searchKey.status" clearable placeholder="请选择状态" @change="searchForm" :style="{width: '100%'}" class="diy-select">
+                                <el-option value="1" label="正常"></el-option>
+                                <el-option value="2" label="禁用"></el-option>
+                                <template #prefix>状态</template>
+                            </el-select>
+                        </el-col>
+                        <el-col :xs="12" :sm="6" :md="6" :lg="6" :xl="4">
+                            <el-date-picker v-model="searchKey.create" :style="{width: '100%'}" placeholder="请选择创建时间" start-placeholder="开始时间" end-placeholder="结束时间" type="daterange" range-separator="至" @change="searchForm" />
+                        </el-col>
+                    </el-row>
+                </div>
+                <div class="form-line"></div>
+                <div class="form-right">
+                    <el-button type="primary" icon="el-icon-search" @click="searchForm">搜索</el-button>
+                </div>
+            </div>
+        </el-form>
+    </fieldset>
+</template>
+
+<script>
+export default {
+    data(){
+        return {
+            searchKey:{
+                type:1
+            }
+        }
+    },
+    methods: {
+        searchForm(){
+            this.$emit("success",this.searchKey);
+        }
+    }
+}
+</script>

+ 3 - 0
src/views/manage/task/lists/components/table.vue

@@ -0,0 +1,3 @@
+<template>
+
+</template>

+ 43 - 7
src/views/manage/task/lists/index.vue

@@ -1,11 +1,47 @@
 <template>
-
+    <el-container class="flex-column">
+        <div class="table-search">
+            <search @success="handleSuccess"></search>
+            <optionBtn @success="handleSuccess" :dataSelect="dataSelect" :dataSelectFull="dataSelectFull" type="3"></optionBtn>
+        </div>
+        <el-main class="nopadding">
+            <div class="table-container">
+                <tablePage ref="tablePage" @success="tableHandle" @successFull="tableHandleFull" type="3"></tablePage>
+            </div>
+        </el-main>
+    </el-container>  
 </template>
 
 <script>
-
-</script>
-
-<style>
-
-</style>
+import search from './components/search';
+import optionBtn from './components/option';
+import tablePage from './components/table';
+export default {
+    components: {
+        search,tablePage,optionBtn
+    },
+    data(){
+        return {
+            searchKey:{},
+            dataSelect:[],
+            dataSelectFull:[],
+        }
+    },
+    methods: {
+        tableHandle(data){
+            this.dataSelect = data;
+        },
+        tableHandleFull(data){
+            this.dataSelectFull = data;
+        },
+        handleSuccess(data){
+            this.$refs.tablePage.upData(data)
+        },
+        handleClick(name){
+            this.activeName = name;
+            this.searchKey.type = name;
+            this.$refs.tablePage.upData(this.searchKey)
+        }
+    }
+}
+</script>