form.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. <template>
  2. <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">
  3. <el-container class="flex-column" v-loading="loading">
  4. <div class="drawer-detail-main">
  5. <div class="drawer-detail-header">
  6. <div class="drawer-detail-header-body">
  7. <div class="drawer-detail-header-left">{{ titleMap[mode] }}</div>
  8. <div class="drawer-detail-header-left">
  9. <el-button type="default" icon="el-icon-close" @click="visible=false"></el-button>
  10. </div>
  11. </div>
  12. </div>
  13. </div>
  14. <el-main>
  15. <el-form ref="dialogForm" :model="formData" :rules="rules" label-width="100px" label-position="top">
  16. <el-form-item label="发布类型" prop="auto">
  17. <el-radio-group v-model="formData.auto" @change="checkAuto">
  18. <el-radio border :label="1">手动录入</el-radio>
  19. <el-radio border :label="2">星川自动采集</el-radio>
  20. </el-radio-group>
  21. </el-form-item>
  22. <template v-if="formData.auto==2">
  23. <el-form-item label="任务ID" prop="job_id">
  24. <el-input v-model="formData.job_id" clearable placeholder="任务ID">
  25. <template #append v-if="mode=='add'">
  26. <el-button @click="getJobDetail">获取数据</el-button>
  27. </template>
  28. </el-input>
  29. <div class="el-form-item-msg"></div>
  30. </el-form-item>
  31. </template>
  32. <template v-if="formData.auto==1 || autoState">
  33. <el-form-item label="发布栏目" prop="category">
  34. <el-select v-model="formData.category" clearable placeholder="请选择发布栏目" @change="checkCategory" :style="{width: '100%'}">
  35. <el-option :value="item.sign" :label="item.name" v-for="(item,index) in categoryData" :key="index"></el-option>
  36. </el-select>
  37. <div class="el-form-item-msg"></div>
  38. </el-form-item>
  39. <el-form-item label="任务标题" prop="title">
  40. <el-input v-model="formData.title" clearable placeholder="任务标题"></el-input>
  41. <div class="el-form-item-msg"></div>
  42. </el-form-item>
  43. <fieldset>
  44. <legend><el-tag>产品介绍</el-tag></legend>
  45. <el-form-item label="所属行业" prop="category_detail">
  46. <el-input v-model="formData.category_detail" clearable placeholder="所属行业"></el-input>
  47. <div class="el-form-item-msg">直接输入即可,比如:女鞋</div>
  48. </el-form-item>
  49. <div class="goods-flex">
  50. <div class="">
  51. <el-form-item label="商品图片" prop="product_cover_url">
  52. <sc-upload v-model="formData.product_cover_url"></sc-upload>
  53. <div class="el-form-item-msg"></div>
  54. </el-form-item>
  55. </div>
  56. <div class="goods-right">
  57. <el-form-item label="商品标题" prop="product_name">
  58. <el-input v-model="formData.product_name" clearable placeholder="商品标题"></el-input>
  59. <div class="el-form-item-msg"></div>
  60. </el-form-item>
  61. <el-form-item label="商品ID" prop="product_id">
  62. <el-input v-model="formData.product_id" clearable placeholder="商品ID"></el-input>
  63. <div class="el-form-item-msg"></div>
  64. </el-form-item>
  65. </div>
  66. </div>
  67. <el-form-item label="产品卖点" prop="product_selling_point">
  68. <el-input v-model="formData.product_selling_point" type="textarea" rows="5" clearable placeholder="产品卖点"></el-input>
  69. <div class="el-form-item-msg"></div>
  70. </el-form-item>
  71. <el-form-item label="目标人群" prop="target_audience">
  72. <el-input v-model="formData.target_audience" type="textarea" rows="5" clearable placeholder="目标人群"></el-input>
  73. <div class="el-form-item-msg"></div>
  74. </el-form-item>
  75. </fieldset>
  76. <el-row :gutter="15">
  77. <el-col :span="8">
  78. <el-form-item label="投稿截止时间" prop="expiration_time_end">
  79. <div style="width: 100%;">
  80. <el-date-picker v-model="formData.expiration_time_end" placeholder="投稿截止时间" type="datetime" :style="{width: '100%'}" />
  81. </div>
  82. <div class="el-form-item-msg"></div>
  83. </el-form-item>
  84. </el-col>
  85. <el-col :span="8">
  86. <el-form-item label="要求达人等级" prop="level">
  87. <el-select v-model="formData.level" clearable placeholder="要求达人等级" :style="{width: '100%'}">
  88. <el-option :value="item.id" :label="item.name" v-for="(item,index) in levelData" :key="index">
  89. <span style="float: left">{{ item.name }} ({{ item.start_format }} ~ {{ item.end_format }}元)</span>
  90. <span style="float: right;color: var(--el-text-color-secondary);font-size: 12px;">以上</span>
  91. </el-option>
  92. </el-select>
  93. <div class="el-form-item-msg"></div>
  94. </el-form-item>
  95. </el-col>
  96. <el-col :span="8">
  97. <el-form-item label="平台要求等级" prop="sys_level">
  98. <el-select v-model="formData.sys_level" clearable placeholder="平台要求等级" :style="{width: '100%'}">
  99. <el-option :value="item.code" :label="item.name" v-for="(item,index) in dicData" :key="index">
  100. <span style="float: left">{{ item.name }}</span>
  101. <span style="float: right;color: var(--el-text-color-secondary);font-size: 12px;">以上</span>
  102. </el-option>
  103. </el-select>
  104. <div class="el-form-item-msg"></div>
  105. </el-form-item>
  106. </el-col>
  107. </el-row>
  108. <el-row :gutter="15">
  109. <el-col :span="12">
  110. <el-form-item label="招募人数" prop="need_number">
  111. <el-input v-model="formData.need_number" clearable placeholder="招募人数">
  112. <template #append>人</template>
  113. </el-input>
  114. <div class="el-form-item-msg"></div>
  115. </el-form-item>
  116. </el-col>
  117. <el-col :span="12">
  118. <el-form-item label="预期消耗目标" prop="total_budget">
  119. <el-input v-model="formData.total_budget" clearable placeholder="预期消耗目标"></el-input>
  120. <div class="el-form-item-msg"></div>
  121. </el-form-item>
  122. </el-col>
  123. </el-row>
  124. <el-form-item label="任务要求" prop="content" class="label-item">
  125. <sc-editor v-model="formData.content" placeholder="请输入" :height="600" style="width: 100%;"></sc-editor>
  126. <div class="el-form-item-msg"></div>
  127. </el-form-item>
  128. </template>
  129. </el-form>
  130. </el-main>
  131. <el-footer style="text-align: right;">
  132. <el-button @click="visible=false" >取 消</el-button>
  133. <el-button v-if="mode!='show'" type="primary" :loading="isSaveing" @click="submit()">保 存</el-button>
  134. </el-footer>
  135. </el-container>
  136. </el-drawer>
  137. </template>
  138. <script>
  139. import { defineAsyncComponent } from 'vue';
  140. const scEditor = defineAsyncComponent(() => import('@/components/scEditor'));
  141. export default {
  142. components: {
  143. scEditor
  144. },
  145. data() {
  146. return {
  147. categoryData:[],
  148. loading: false,
  149. mode:"add",
  150. visible: false,
  151. isSaveing: false,
  152. autoState:false,
  153. titleMap:{
  154. add:"发布新任务",
  155. edit:"编辑新任务"
  156. },
  157. levelData:[],
  158. dicData:[],
  159. rules:{
  160. level:[
  161. {required: true, message: '请选择'}
  162. ],
  163. sys_level:[
  164. {required: true, message: '请选择'}
  165. ],
  166. auto:[
  167. {required: true, message: '请选择'}
  168. ],
  169. expiration_time_end:[
  170. {required: true, message: '请选择'}
  171. ],
  172. need_number:[
  173. {required: true, message: '请输入'}
  174. ],
  175. total_budget:[
  176. {required: true, message: '请输入'}
  177. ],
  178. job_id:[
  179. {required: true, message: '请输入'}
  180. ],
  181. title: [
  182. {required: true, message: '请输入'}
  183. ],
  184. category: [
  185. {required: true, message: '请选择'}
  186. ],
  187. content: [
  188. {required: true, message: '请输入'}
  189. ],
  190. },
  191. formData:{}
  192. }
  193. },
  194. methods: {
  195. checkCategory(data){
  196. },
  197. checkAuto(data){
  198. if (data == 2) {
  199. this.autoState = false;
  200. }
  201. },
  202. open(mode = 'add'){
  203. this.mode = mode;
  204. this.visible = true;
  205. this.getCategory();
  206. if (mode == 'add') {
  207. this.formData = {
  208. auto:2,
  209. category:"douyin"
  210. }
  211. }
  212. return this
  213. },
  214. async getJobDetail(){
  215. if (!this.formData.job_id) {
  216. return this.$message.error("请输入任务ID")
  217. }
  218. // var loading = this.$loading();
  219. this.loading = true;
  220. var resp = await this.$API.task.job.get(this.formData);
  221. this.loading = false;
  222. // loading.close()
  223. this.autoState = true;
  224. if (resp.code == 0) {
  225. this.$message.error(resp.msg)
  226. return ;
  227. }
  228. this.formData = resp.data;
  229. },
  230. //表单注入数据
  231. setData(data){
  232. this.formData = JSON.parse(JSON.stringify(data));
  233. if (this.formData.auto == 2) {
  234. this.autoState = true;
  235. }
  236. },
  237. async getCategory(){
  238. var resp = await this.$API.task.param.get({"type":this.formData.category});
  239. if (resp.code == 0) {
  240. return this.$message.error(resp.msg)
  241. }
  242. this.categoryData = resp.data.category;
  243. this.levelData = resp.data.level;
  244. this.dicData = resp.data.dic;
  245. },
  246. async submit(){
  247. var validate = await this.$refs.dialogForm.validate().catch(()=>{});
  248. if(!validate){ return false }
  249. if (this.formData.auto == 2 && !this.autoState) {
  250. return this.$message.error("请先完成数据获取")
  251. }
  252. if (this.formData.expiration_time_end) {
  253. this.formData.expiration_time_end = this.$TOOL.dateFormat(this.formData.expiration_time_end)
  254. }
  255. this.isSaveing = true;
  256. var resp = await this.$API.task.save.post(this.formData);
  257. this.isSaveing = false;
  258. if (resp.code == 0) {
  259. return this.$message.error(resp.msg);
  260. }
  261. this.$message.success(resp.msg);
  262. this.visible = false;
  263. this.formData = {};
  264. this.autoState = false;
  265. this.$emit("success");
  266. }
  267. }
  268. }
  269. </script>
  270. <style>
  271. .goods-flex{display: flex;align-items: start;gap: 15px;}
  272. .goods-flex .goods-right{flex: 1;}
  273. </style>