addActivity.vue 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162
  1. <template>
  2. <div class="container-addAct">
  3. <el-card class="card-top">
  4. <div class="top-box">
  5. <div>
  6. <el-select
  7. placeholder="请选择行业"
  8. :disabled="!isShowSelect"
  9. @change="clearTopIndustry"
  10. @clear="clearTopIndustry"
  11. clearable
  12. v-model="optionFormregion"
  13. style="width: 360px; margin-right: 30px"
  14. >
  15. <el-option v-for="item in chartPermissionList" :label="item.PermissionName" :key="item.PermissionName" :value="item.PermissionName"></el-option>
  16. </el-select>
  17. <el-select placeholder="请选择活动类型" :disabled="!isShowSelect" clearable v-model="cactivityType" @change="activityTypeDetail" style="width: 360px">
  18. <el-option v-for="item in cactivityTypeList" :label="item.ActivityTypeName" :key="item.ActivityTypeId" :value="item.ActivityTypeId"></el-option>
  19. </el-select>
  20. </div>
  21. <div>
  22. <el-button v-if="isShowSelect" type="primary" @click="templateBtn">活动内容输入模板</el-button>
  23. </div>
  24. </div>
  25. </el-card>
  26. <el-card style="margin-top: 30px">
  27. <froala id="froala-editor" ref="froalaEditor" :tag="'textarea'" :config="froalaConfig" v-model="content"></froala>
  28. <div style="margin-top: 25px" v-if="optionFormregion">
  29. <template v-if="cactivityType == 1">
  30. <el-radio style="margin: 0 0 20px 30px" v-model="subjectRadio" label="1">单主题标签:</el-radio>
  31. <el-radio v-model="subjectRadio" label="2">多主题标签:</el-radio>
  32. </template>
  33. <div style="display: flex; align-items: center">
  34. <span style="width: 98px; flex-shrink: 0">
  35. 主题标签:
  36. <el-tooltip placement="top-start">
  37. <div slot="content">
  38. 1、小程序内默认显示产业名称,也可勾选【小程序内显示标的名称】更改显示<br />2、若该活动暂无相关联产业,请联系内容组添加,或勾选并填写【临时标签】用于小程序内展示<br />
  39. 3、选择产业和关联标的后,即完成对活动的标签定义;可同时勾选并填写【临时标签】,小程序内将显示临时标签名称
  40. </div>
  41. <i class="el-icon-info" />
  42. </el-tooltip>
  43. </span>
  44. <el-cascader
  45. key="multipleTrue"
  46. style="margin-right: 10px"
  47. v-model="industryCascade"
  48. :disabled="selectDisabled"
  49. @change="propertyChange"
  50. placeholder="请选择产业名称"
  51. :show-all-levels="false"
  52. :options="industryArr"
  53. :props="{ ...defaultProps, multiple: true }"
  54. filterable
  55. >
  56. </el-cascader>
  57. <template v-if="isShowAddIcon">
  58. <img v-if="!optionFormregion.includes('策略') && !selectDisabled" src="~@/assets/img/set_m/add_ico.png" style="margin: 0 30px 0 0" @click="addIndustryDlg = true" />
  59. <img v-if="!optionFormregion.includes('策略') && selectDisabled" src="~@/assets/img/set_m/slide.png" style="margin: 0 30px 0 0" />
  60. </template>
  61. <el-select v-model="markValue" :disabled="selectDisabled" @focus="markSelectFocus" multiple placeholder="请选择关联标的">
  62. <el-option v-for="item in markOptions" :key="item.IndustrialSubjectId" :value="item.IndustrialSubjectId" :label="item.SubjectName"> </el-option>
  63. </el-select>
  64. <template v-if="isShowAddIcon">
  65. <img v-if="!optionFormregion.includes('策略') && !selectDisabled" src="~@/assets/img/set_m/add_ico.png" style="margin: 0 10px" @click="isAddMarketDlg" />
  66. <img v-if="!optionFormregion.includes('策略') && selectDisabled" src="~@/assets/img/set_m/slide.png" style="margin: 0 10px" />
  67. </template>
  68. <el-checkbox style="margin-left: 20px" v-model="isMark">小程序内显示标的名称</el-checkbox>
  69. <div style="display: flex; align-items: center; margin-left: 40px">
  70. <el-checkbox v-model="radioTemporary">临时标签</el-checkbox>
  71. <el-input style="width: 350px; margin: 0 20px" v-model="valTemporary" @focus="radioTemporary = true" placeholder="请输入标签名称" type="text"></el-input>
  72. <div class="editsty" style="flex-shrink: 0" @click="dialogVisibleSubject = true">查询标的</div>
  73. </div>
  74. </div>
  75. <!-- 复选 模块 -->
  76. <div style="margin-top: 20px">
  77. <research-deduct ref="researchSelect" :cactivityType="cactivityType" :optionFormregion="optionFormregion" />
  78. </div>
  79. <div style="margin: 20px 0 0 98px" class="add-delete" v-for="(item, index) in addSubjectLabel" :key="index">
  80. <template v-if="subjectRadio == 2">
  81. <el-cascader
  82. v-model="item.IndustrialManagementIdS"
  83. :disabled="item.forbidden"
  84. @change="propertyChange"
  85. placeholder="请选择产业名称"
  86. :show-all-levels="false"
  87. :options="industryArr"
  88. :props="{ ...defaultProps, multiple: true }"
  89. filterable
  90. >
  91. </el-cascader>
  92. <el-select style="margin: 0 10px" v-model="item.IndustrialSubjectIdS" :disabled="item.forbidden" @focus="markSelectFocusAdd(index, item)" multiple placeholder="请选择关联标的">
  93. <el-option v-for="val in item.markOptions" :key="val.IndustrialSubjectId" :value="val.IndustrialSubjectId" :label="val.SubjectName"> </el-option>
  94. </el-select>
  95. <el-checkbox style="margin: 0 0 0 10px" v-model="item.isMark">小程序内显示标的名称</el-checkbox>
  96. <div style="display: flex; align-items: center; margin-left: 40px">
  97. <el-checkbox v-model="item.temporary" @change="temporaryChangeHandler(item)">临时标签</el-checkbox>
  98. <el-input
  99. style="width: 350px; margin: 0 20px"
  100. v-model="item.temporaryText"
  101. @focus="
  102. item.forbidden = true;
  103. item.temporary = true;
  104. "
  105. placeholder="请输入标签名称"
  106. type="text"
  107. ></el-input>
  108. </div>
  109. <img @click="deleteSubject(index, item)" src="~@/assets/img/icons/delete-Item.png" />
  110. <el-checkbox style="margin-left: 30px" v-model="item.subscribe">可预约纪要</el-checkbox>
  111. </template>
  112. </div>
  113. <div style="margin: 20px 0 0 30px; display: flex; align-items: center" v-if="subjectRadio == 2">
  114. <img @click="addLabelClick" class="editsty" src="~@/assets/img/set_m/add_ico.png" style="margin: 0 10px" />
  115. <span @click="addLabelClick" class="editsty"> 添加主题标签</span>
  116. </div>
  117. </div>
  118. <div style="margin-top: 15px" v-if="showType !== '1' && showType !== '9' && subjectRadio != 2">
  119. <div class="radio-input" style="margin-bottom: 15px; height: 35px">
  120. <span style="width: 98px"> 参会人数限制: </span>
  121. <template v-if="showType != 3">
  122. <el-radio v-model="radio" label="1">不限制</el-radio>
  123. <el-radio v-model="radio" label="2">限制</el-radio>
  124. </template>
  125. <el-input placeholder="输入人数上限" v-if="radio == 2 || showType !== '2'" class="astrict-inpt" onkeyup="value=value.replace(/[^\d]/g,'')" v-model="astrict" />
  126. </div>
  127. <div v-if="radio == 2 || showType !== '2'">
  128. <div class="checkbox-box">
  129. <span style="width: 98px; flex-shrink: 0">
  130. 活动可见:
  131. <el-tooltip :content="checkboxTooltip('活动可见')" placement="top-start">
  132. <i class="el-icon-info" />
  133. </el-tooltip>
  134. </span>
  135. <div>
  136. <div class="is-visible">
  137. <el-radio-group v-model="radioVisibleActivity">
  138. <el-radio :label="1">仅本组客户可见</el-radio>
  139. <el-radio :label="2">全部客户可见</el-radio>
  140. </el-radio-group>
  141. <el-checkbox v-model="decisionChecked">仅决策人可见</el-checkbox>
  142. </div>
  143. <div style="display: flex">
  144. <span style="width: 70px; flex-shrink: 0" class="text-right"> 套餐类型: </span>
  145. <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange" :disabled="checkAllIs">
  146. 全选
  147. <el-tooltip :content="checkboxTooltip('全选')" placement="top-start">
  148. <i class="el-icon-info" />
  149. </el-tooltip>
  150. </el-checkbox>
  151. <el-checkbox-group v-model="checkedCities" @change="handleCheckedCitiesChange">
  152. <el-checkbox v-for="item in cities" :label="item.CustomerTypeId" :key="item.CustomerTypeId" :disabled="forbidden.includes(String(item.CustomerTypeId))">
  153. {{ item.CustomerName }}
  154. <el-tooltip :content="item.Explain" placement="top-start" v-if="item.Explain">
  155. <i class="el-icon-info" />
  156. </el-tooltip>
  157. </el-checkbox>
  158. </el-checkbox-group>
  159. </div>
  160. <div class="checkbox-box" style="margin-top: 20px">
  161. <span class="text-right"> 管理规模: </span>
  162. <el-checkbox-group v-model="checkScaleList">
  163. <el-checkbox :disabled="scaleIsDisabled.includes('3')" label="3">100亿以上</el-checkbox>
  164. <el-checkbox :disabled="scaleIsDisabled.includes('2')" label="2">50~100亿</el-checkbox>
  165. </el-checkbox-group>
  166. </div>
  167. </div>
  168. </div>
  169. </div>
  170. </div>
  171. <template v-if="activeIsState == 3">
  172. <div class="audio-content">
  173. <span class="text">会议音频:</span>
  174. <el-button v-if="addEditVideo.length > 0" size="small" type="primary" @click="errorUpload">上传会议音频</el-button>
  175. <el-upload
  176. v-else
  177. class="upload-demo"
  178. action=""
  179. :http-request="handleUploadAudio"
  180. accept="audio/*"
  181. :on-remove="handleRemoveAudio"
  182. :before-remove="beforeRemoveAudio"
  183. :limit="1"
  184. :file-list="fileListAudio"
  185. >
  186. <el-button size="small" type="primary">上传会议音频</el-button>
  187. </el-upload>
  188. </div>
  189. <div class="audio-content" style="margin-top: 10px">
  190. <span class="text">会议视频:</span>
  191. <el-button v-if="fileListAudio.length" size="small" type="primary" @click="errorUpload">上传会议视频</el-button>
  192. <el-upload
  193. v-else
  194. class="upload-demo"
  195. action=""
  196. accept=".mp4"
  197. :http-request="handleUpload"
  198. :before-upload="handelBeforeUploadVideo"
  199. :before-remove="beforeRemoveAudio"
  200. :on-remove="handleRemoveVideo"
  201. :file-list="addEditVideo"
  202. :disabled="startUpload"
  203. :limit="1"
  204. >
  205. <el-button size="small" type="primary" :loading="startUpload">上传会议视频</el-button>
  206. </el-upload>
  207. <el-progress type="circle" :percentage="percentage" width="40" style="margin-left: 10px" v-if="startUpload"></el-progress>
  208. </div>
  209. <div class="audio-content cover-content" style="margin-top: 10px" v-if="(fileListAudio.length || addEditVideo.length) && defaultImage">
  210. <span class="text" style="width: 70px; text-align: right">封面:</span>
  211. <div class="img-content">
  212. <img :src="defaultImage" alt="" />
  213. <div class="modify" @click="modifyImgHandler">修改</div>
  214. </div>
  215. </div>
  216. </template>
  217. <div style="text-align: center; margin-top: 30px">
  218. <el-button type="primary" @click="submitForm('保存')">保存</el-button>
  219. <el-button v-if="isShow" type="primary" @click="submitForm('发布')">发布</el-button>
  220. <el-button @click="cancelBtn">取消</el-button>
  221. </div>
  222. </el-card>
  223. <el-dialog
  224. v-dialogDrag
  225. :close-on-click-modal="false"
  226. :modal-append-to-body="false"
  227. center
  228. :title="activityTypeName"
  229. :visible.sync="dialogVisible"
  230. customClass="customWidth"
  231. :before-close="handleClose"
  232. >
  233. <div id="dialog" v-html="copyText"></div>
  234. <div style="margin-bottom: 60px">
  235. <div class="content-template" v-if="activityTypeName == '公司调研电话会'">
  236. <div @click="contentTemplate('1')" :class="contentTemplateTitle == '1' ? 'active' : ''">进门财经模板</div>
  237. <div @click="contentTemplate('2')" :class="contentTemplateTitle == '2' ? 'active' : ''">zoom模板</div>
  238. </div>
  239. <div v-html="templatePText" v-if="contentTemplateTitle == '1'"></div>
  240. <div v-html="ZoomTemplateP" v-else></div>
  241. <p v-if="cactivityType == 1" class="no-cv" style="color: #f00">注:多个活动同时输入时,请用分割线隔开</p>
  242. <p v-else class="no-cv" style="color: #f00">注:每次只能输入一场活动信息{{ cactivityType == 6 ? ",多篇相关报告时,用分号“;”隔开" : "" }}</p>
  243. </div>
  244. <span slot="footer" class="dialog-footer">
  245. <el-button @click="dialogVisible = false">取消</el-button>
  246. <el-button id="copy_text" type="primary" v-if="contentTemplateTitle == '1'" :data-clipboard-text="copyTxt" @click="handleCopyFun">复制模版</el-button>
  247. <el-button id="copy_text" type="primary" v-else :data-clipboard-text="zoomTemplate" @click="handleCopyFun">复制模版</el-button>
  248. </span>
  249. </el-dialog>
  250. <add-industry-mark
  251. :optionFormregion="optionFormregion.includes('研选') ? '研选' : optionFormregion"
  252. :addIndustryDlg.sync="addIndustryDlg"
  253. :addMarkDlg.sync="addMarkDlg"
  254. @commitIndustryDlg="commitIndustryDlg"
  255. @commitMarkDlg="commitMarkDlg"
  256. :addMarkUpVal="addMarkUpVal"
  257. :source="3"
  258. />
  259. <el-dialog v-dialogDrag :close-on-click-modal="false" :modal-append-to-body="false" center title="查询标的" :visible.sync="dialogVisibleSubject" width="500px" :before-close="handleCloseSubject">
  260. <div>
  261. <el-select style="width: 100%" v-model="addSubjectName" remote :remote-method="remoteMethod" clearable filterable @change="searchInfo" placeholder="请输入标的名称">
  262. <el-option v-for="item in addSubjectOptions" :key="item.IndustrialSubjectId" :label="item.SubjectName" :value="item.SubjectName"> </el-option>
  263. </el-select>
  264. </div>
  265. <p class="subject-text" v-if="isShowSubject">暂无数据</p>
  266. <template v-else>
  267. <p class="subject-text" v-for="(item, index) in nameSubjectOptions" :key="index">{{ item.Name }} : {{ item.value }}</p>
  268. </template>
  269. <p style="padding-bottom: 50px"></p>
  270. </el-dialog>
  271. <modify-img-dlg :modifyImgVisible.sync="modifyImgVisible" :videoAndVoiceList.sync="videoAndVoiceList" />
  272. </div>
  273. </template>
  274. <script>
  275. import { raiInterface, customInterence, getOSSSign, resourceVoiceupload } from "@/api/api.js";
  276. import VueFroala from "vue-froala-wysiwyg";
  277. import Clipboard from "clipboard";
  278. import AddIndustryMark from "../../components/addIndustryMark.vue";
  279. import richTextMixins from "../../components/apply/RichTextMixins";
  280. import MD5 from "js-md5";
  281. import ResearchDeduct from "./addComopnents/ResearchDeduct.vue";
  282. import ModifyImgDlg from "./addComopnents/modifyImgDlg.vue";
  283. export default {
  284. name: "",
  285. components: { AddIndustryMark, ResearchDeduct, ModifyImgDlg },
  286. props: {},
  287. data() {
  288. return {
  289. cactivityType: "",
  290. content: "", //内容
  291. optionFormregion: "", //行业选择
  292. radio: "1", //单选按钮
  293. isOptionRef: false,
  294. chartPermissionList: [], //行业的数组
  295. cactivityTypeList: [], //活动类型
  296. dialogVisible: false, //弹框
  297. astrict: "", //人数限制
  298. copyTxt: "1", //复制的模版
  299. templatePText: "",
  300. checkedCities: [], //
  301. checkedCitiesTwo: "",
  302. cities: [], //
  303. isIndeterminate: false, //是否
  304. checkAll: false,
  305. showType: "9",
  306. activityTypeName: "纪要内容模板",
  307. isShow: true,
  308. isShowSelect: true,
  309. forbidden: [],
  310. checkAllIs: false,
  311. contentTemplateTitle: "1",
  312. zoomTemplate: "",
  313. zoomTemplateP: "",
  314. industryArr: [], //所有的行业
  315. industryCascade: "", //所有行业及联的选择
  316. markValue: "", //添加标的
  317. markOptions: [], ///添加标的的数组
  318. addMarkUpVal: {
  319. industrialName: "",
  320. industrialId: "",
  321. }, //弹框里的
  322. radioTemporary: false, //临时标签
  323. valTemporary: "", //临时标签的输入框
  324. selectDisabled: false, //临时标签的输入后全部禁用
  325. defaultProps: {
  326. label: "PermissionName",
  327. children: "List",
  328. value: "ChartPermissionId",
  329. },
  330. addIndustryDlg: false,
  331. addMarkDlg: false,
  332. subjectRadio: "1",
  333. addSubjectLabel: [],
  334. dialogVisibleSubject: false,
  335. addSubjectName: "",
  336. addSubjectOptions: "",
  337. nameSubjectOptions: [],
  338. isShowSubject: false,
  339. ListSubject: [],
  340. checkScaleList: [], //选择规模
  341. scaleIsDisabled: "", //选择规模 禁用
  342. isMark: false,
  343. radioVisibleActivity: 2,
  344. decisionChecked: false,
  345. fileListAudio: [],
  346. baseApi: process.env.API_ROOT,
  347. activeIsState: "",
  348. addEditVideo: [],
  349. startUpload: false, //开始上传
  350. percentage: 0,
  351. isShowAddIcon: true, //主题标签的添加的iocn 是否显示
  352. modifyImgVisible: false,
  353. defaultImage: "",
  354. shareImg:'',
  355. videoAndVoiceList: [],
  356. };
  357. },
  358. computed: {},
  359. mixins: [richTextMixins],
  360. watch: {
  361. radio: {
  362. handler(newVal) {
  363. if (newVal == 1) {
  364. this.astrict = "";
  365. }
  366. if (this.$route.query.id) return;
  367. this.isCheckAllType(this.cactivityType == 3 && newVal == 2 ? true : false);
  368. },
  369. },
  370. radioTemporary() {
  371. if (this.radioTemporary) {
  372. this.selectDisabled = true;
  373. } else {
  374. this.valTemporary = "";
  375. this.selectDisabled = false;
  376. }
  377. },
  378. subjectRadio() {
  379. this.addSubjectLabel = [];
  380. },
  381. cactivityType: {
  382. handler(newval) {
  383. if (this.$route.query.id) return;
  384. this.isCheckAllType(newval === 4 ? true : false);
  385. },
  386. },
  387. },
  388. created() {},
  389. mounted() {
  390. this.chartPermission();
  391. this.getActivityType();
  392. this.customerTypelist();
  393. this.getIndustry();
  394. if (this.$route.query.id) {
  395. this.getDetail();
  396. }
  397. if (this.$route.query.isShow == 1) {
  398. this.isShow = false;
  399. }
  400. if (this.$route.query.isShow >= 0) {
  401. this.isShowSelect = false;
  402. }
  403. },
  404. methods: {
  405. // 上传音频
  406. async handleUploadAudio(e) {
  407. const loading = this.$loading({
  408. lock: true,
  409. text: "上传音频中...",
  410. spinner: "el-icon-loading",
  411. background: "rgba(0, 0, 0, 0.7)",
  412. });
  413. let form = new FormData();
  414. form.append("file", e.file);
  415. const res = await resourceVoiceupload(form);
  416. if (res.Ret === 200) {
  417. this.getVideoAndImg(1);
  418. let obj = {
  419. name: res.Data.ResourceName,
  420. url: res.Data.ResourceUrl,
  421. PlaySeconds: res.Data.PlaySeconds,
  422. };
  423. this.fileListAudio = [obj];
  424. loading.close();
  425. }
  426. },
  427. //删除新增的主题标签
  428. deleteSubject(index, item) {
  429. this.addSubjectLabel.splice(index, 1);
  430. },
  431. markSelectFocusAdd(index, item) {
  432. item.markOptions = [];
  433. item.IndustrialSubjectIdS = [];
  434. let arr = [];
  435. arr = item.IndustrialManagementIdS.map((key) => {
  436. return key[1];
  437. });
  438. raiInterface
  439. .getindustrialSubjectlistIds({
  440. IndustrialManagementIdStr: arr.join(","),
  441. })
  442. .then((res) => {
  443. if (res.Ret === 200) {
  444. item.markOptions = res.Data.List || [];
  445. }
  446. });
  447. },
  448. addLabelClick() {
  449. if (this.addSubjectLabel.length) {
  450. let index = this.addSubjectLabel.length - 1;
  451. this.addSubjectLabel.push({
  452. IndustrialManagementIdS: this.addSubjectLabel[index].IndustrialManagementIdS,
  453. IndustrialSubjectIdS: this.addSubjectLabel[index].IndustrialSubjectIdS,
  454. markOptions: this.addSubjectLabel[index].markOptions,
  455. isMark: this.addSubjectLabel[index].isMark,
  456. forbidden: this.addSubjectLabel[index].forbidden,
  457. temporary: this.addSubjectLabel[index].temporary,
  458. temporaryText: this.addSubjectLabel[index].temporaryText,
  459. subscribe: this.addSubjectLabel[index].subscribe,
  460. });
  461. } else {
  462. this.addSubjectLabel = [
  463. {
  464. IndustrialManagementIdS: this.industryCascade,
  465. IndustrialSubjectIdS: this.markValue,
  466. markOptions: this.markOptions,
  467. isMark: this.isMark,
  468. forbidden: this.selectDisabled,
  469. temporary: this.radioTemporary,
  470. temporaryText: this.valTemporary,
  471. subscribe: this.$refs.researchSelect.isCanAppointmentMinutes,
  472. },
  473. ];
  474. }
  475. },
  476. propertyChange() {
  477. if (this.subjectRadio == 2) return;
  478. this.markOptions = [];
  479. this.markValue = "";
  480. },
  481. //添加后的 临时标签
  482. temporaryChangeHandler(item) {
  483. item.forbidden = item.temporary;
  484. !item.forbidden ? (item.temporaryText = "") : "";
  485. },
  486. //编辑进来的详情
  487. getDetail() {
  488. raiInterface.activityDetail({ ActivityId: Number(this.$route.query.id) }).then((res) => {
  489. if (res.Ret !== 200) return;
  490. const { Data } = res;
  491. this.defaultImage = Data.BackgroundImg
  492. this.shareImg = Data.ShareImg
  493. this.activeIsState = Data.ActiveState;
  494. this.cactivityType = Data.ActivityTypeId;
  495. this.optionFormregion = Data.ChartPermissionName;
  496. this.checkedCities = Data.CustomerTypeIds ? Data.CustomerTypeIds.split(",").map((item) => Number(item)) : [];
  497. this.astrict = Data.LimitPeopleNum == "0" ? "" : Data.LimitPeopleNum;
  498. this.showType = Data.ShowType;
  499. this.content = Data.Body;
  500. this.checkScaleList = Data.Scale ? Data.Scale.split(",") : [];
  501. this.scaleIsDisabled = Data.Scale;
  502. this.radioVisibleActivity = Data.VisibleRange > 0 ? Data.VisibleRange : 1;
  503. this.decisionChecked = Data.IsMakerShow == 1 ? true : false;
  504. let checkedCount = Data.CustomerTypeIds ? Data.CustomerTypeIds.split(",").length : "";
  505. this.checkAll = checkedCount === this.cities.length;
  506. this.isIndeterminate = checkedCount > 0 && checkedCount < this.cities.length;
  507. this.isMark = Data.IsShowSubjectName == 1 ? true : false;
  508. this.valTemporary = Data.TemporaryLabel;
  509. this.radioTemporary = this.valTemporary ? true : false;
  510. // 复选框模块
  511. this.$nextTick(() => {
  512. let RefPage = this.$refs.researchSelect;
  513. RefPage.isCanAppointmentMinutes = Data.IsCanAppointmentMinutes == 1 ? true : false;
  514. RefPage.isYidongConduct = Data.IsYidongConduct == 1 ? true : false;
  515. RefPage.isExternalLabel = Data.IsExternalLabel == 1 ? true : false;
  516. RefPage.isCanOutboundCall = Data.IsCanOutboundCall == 1 ? true : false;
  517. RefPage.isDeduct = Data.IsResearchPoints == 1 ? true : false;
  518. RefPage.provideEmail = Data.IsNeedEmail == 1 ? true : false;
  519. RefPage.isBClass = Data.IsBClass == 1 ? true : false;
  520. RefPage.SiginupDeadline = Data.SiginupDeadline;
  521. RefPage.PointsSet = Data.PointsSet;
  522. RefPage.institutionName = Data.PointsSet.CompanyName;
  523. });
  524. this.addEditVideo = Data.VideoDetail
  525. ? [Data.VideoDetail].map((item) => {
  526. return { name: item.VideoName, PlaySeconds: item.VideoDuration, url: item.VideoUrl };
  527. })
  528. : [];
  529. this.fileListAudio = Data.VoiceList
  530. ? Data.VoiceList.map((item) => {
  531. return { name: item.Name, PlaySeconds: item.PlaySeconds, url: item.Url };
  532. })
  533. : [];
  534. if (Data.PublishStatus == 1) {
  535. this.forbidden = Data.CustomerTypeIds ? Data.CustomerTypeIds.split(",") : [];
  536. this.checkAllIs = this.forbidden.length >= 1;
  537. }
  538. if (this.astrict > 0 && this.showType == 2) {
  539. this.radio = "2";
  540. }
  541. this.valTemporary = res.Data.TemporaryLabel;
  542. this.radioTemporary = this.valTemporary ? true : false;
  543. this.industryCascade = res.Data.ListIndustrial ? res.Data.ListIndustrial.map((item) => [item.ChartPermissionId, item.IndustrialManagementId]) : "";
  544. this.markValue = res.Data.ListSubject ? res.Data.ListSubject.map((item) => item.IndustrialSubjectId) : "";
  545. if (this.markValue) {
  546. this.markSelectFocus();
  547. }
  548. });
  549. },
  550. //提交发布活保存前的校验
  551. submitForm(type) {
  552. if (this.checkedCities) {
  553. this.checkedCitiesTwo = this.checkedCities.join(",");
  554. }
  555. if (!this.radioTemporary && !this.industryCascade.length) return this.$message.error("请选择产业!");
  556. if (this.radioTemporary && !this.valTemporary) return this.$message.error("请输入临时标签!");
  557. let arr = [];
  558. if (this.industryCascade.length) {
  559. arr = this.industryCascade.map((item) => {
  560. return item[1];
  561. });
  562. }
  563. if (this.showType == "3" || this.radio == "2") {
  564. if (!this.astrict) return this.$message.error("请在输入框输入人数上限!");
  565. }
  566. if (!this.cactivityType || !this.optionFormregion) return this.$message.error("请选择行业或活动类型");
  567. if (this.subjectRadio == 2) {
  568. let labelArr = this.addSubjectLabel.map((item) => {
  569. let labelArrList = [];
  570. item.IndustrialManagementIdS.forEach((val) => {
  571. labelArrList.push(val[1]);
  572. });
  573. return {
  574. IndustrialManagementIdS: labelArrList.join(","),
  575. IndustrialSubjectIdS: item.IndustrialSubjectIdS.join(","),
  576. IsShowSubjectName: item.isMark ? 1 : 0,
  577. TemporaryLabel: item.temporary ? item.temporaryText : "",
  578. IsCanAppointmentMinutes: item.subscribe ? 1 : 0,
  579. };
  580. });
  581. this.ListSubject = [
  582. {
  583. IndustrialManagementIdS: arr.length ? arr.join(",") : "",
  584. IndustrialSubjectIdS: this.markValue.length ? this.markValue.join(",") : "",
  585. IsShowSubjectName: this.isMark ? 1 : 0,
  586. TemporaryLabel: this.radioTemporary ? this.valTemporary : "",
  587. IsCanAppointmentMinutes: this.$refs.researchSelect.isCanAppointmentMinutes ? 1 : 0,
  588. },
  589. ...labelArr,
  590. ];
  591. } else {
  592. this.ListSubject = [
  593. {
  594. IndustrialManagementIdS: arr.length ? arr.join(",") : "",
  595. IndustrialSubjectIdS: this.markValue.length ? this.markValue.join(",") : "",
  596. IsShowSubjectName: this.isMark ? 1 : 0,
  597. TemporaryLabel: this.radioTemporary ? this.valTemporary : "",
  598. IsCanAppointmentMinutes: this.$refs.researchSelect.isCanAppointmentMinutes ? 1 : 0,
  599. },
  600. ];
  601. }
  602. let VoiceList = this.fileListAudio.map((item) => {
  603. return {
  604. Name: item.name,
  605. PlaySeconds: item.PlaySeconds.toString(),
  606. Url: item.url,
  607. };
  608. });
  609. let VideoDetail = this.addEditVideo.map((item) => {
  610. return {
  611. VideoName: item.name,
  612. VideoDuration: item.PlaySeconds.toString(),
  613. VideoUrl: item.url,
  614. };
  615. });
  616. this.saveTheRelease(type, arr, VoiceList, VideoDetail[0]);
  617. },
  618. //保存或发布
  619. async saveTheRelease(type, arr, VoiceList, VideoDetail) {
  620. let RefPage = this.$refs.researchSelect;
  621. let PointsSet = RefPage.PointsSet;
  622. const res = await raiInterface.preserveAndPublishAdd({
  623. DoType: type == "发布" ? 1 : 0,
  624. ActivityId: Number(this.$route.query.id) || 0,
  625. ActivityTypeId: Number(this.cactivityType),
  626. Body: this.content,
  627. PermissionName: this.optionFormregion,
  628. CustomerTypeIds: this.checkedCitiesTwo,
  629. IsAllCustomerType: this.checkAll ? 1 : 0,
  630. LimitPeopleNum: Number(this.astrict) || 0,
  631. IndustrialManagementIdS: arr.length ? arr.join(",") : "",
  632. IndustrialSubjectIdS: this.markValue.length ? this.markValue.join(",") : "",
  633. List: this.ListSubject,
  634. Scale: this.checkScaleList.length ? this.checkScaleList.join(",") : "",
  635. LabelType: Number(this.subjectRadio),
  636. IsShowSubjectName: this.isMark ? 1 : 0,
  637. IsMakerShow: this.decisionChecked ? 1 : 0,
  638. VisibleRange: this.radioVisibleActivity,
  639. VoiceList,
  640. VideoDetail,
  641. IsYidongConduct: RefPage.isYidongConduct ? 1 : 0,
  642. IsExternalLabel: RefPage.isExternalLabel ? 1 : 0,
  643. IsCanOutboundCall: RefPage.isCanOutboundCall ? 1 : 0,
  644. IsResearchPoints: RefPage.isDeduct ? 1 : 0,
  645. IsNeedEmail: RefPage.provideEmail ? 1 : 0,
  646. IsBClass: RefPage.isBClass ? 1 : 0,
  647. SiginupDeadline: RefPage.SiginupDeadline,
  648. PointsSet,
  649. BackgroundImg:this.defaultImage,
  650. ShareImg:this.shareImg,
  651. });
  652. if (res.Ret !== 200) return;
  653. this.$message.success("操作成功!");
  654. this.$router.back();
  655. },
  656. //获取行业
  657. chartPermission() {
  658. raiInterface.chartPermissionList().then((res) => {
  659. if (res.Ret === 200) {
  660. this.chartPermissionList = res.Data.List;
  661. }
  662. });
  663. },
  664. //获取活动类型
  665. getActivityType() {
  666. raiInterface.getActivityType().then((res) => {
  667. if (res.Ret === 200) {
  668. this.isShowAddIcon = res.Data.IsShowAddIcon;
  669. this.cactivityTypeList = res.Data.List;
  670. }
  671. });
  672. },
  673. //获取活动类型详情
  674. activityTypeDetail(e) {
  675. this.radio = "1"; //单选按钮
  676. this.astrict = ""; //人数限制
  677. this.contentTemplateTitle = "1";
  678. this.subjectRadio = "1";
  679. this.checkedCities = [];
  680. this.$refs.researchSelect.isBClass = false;
  681. this.radioVisibleActivity = this.cactivityType == 7 ? 1 : 2;
  682. if (!this.cactivityType) return;
  683. raiInterface
  684. .activityTypeDetail({
  685. ActivityTypeId: this.cactivityType - 0,
  686. })
  687. .then((res) => {
  688. if (res.Ret === 200) {
  689. this.copyTxt = res.Data.Template;
  690. this.templatePText = res.Data.TemplateP;
  691. this.zoomTemplate = res.Data.ZoomTemplate;
  692. this.ZoomTemplateP = res.Data.ZoomTemplateP;
  693. this.showType = res.Data.ShowType;
  694. this.activityTypeName = res.Data.ActivityTypeName;
  695. }
  696. });
  697. },
  698. // 操作:点击了复制按钮
  699. handleCopyFun() {
  700. let clipboard = new Clipboard("#copy_text");
  701. clipboard.on("success", (e) => {
  702. this.$message({
  703. type: "success",
  704. message: "复制成功!",
  705. });
  706. this.dialogVisible = false;
  707. clipboard.destroy(); // 释放内存
  708. });
  709. clipboard.on("error", (e) => {
  710. // 不支持复制
  711. this.$Message.info("该浏览器不支持自动复制");
  712. clipboard.destroy(); // 释放内存
  713. });
  714. },
  715. //点击了复制模版
  716. templateBtn() {
  717. if (!this.cactivityType) return this.$message.error("请选择活动类型");
  718. this.dialogVisible = true;
  719. },
  720. //获取多选的客户列表
  721. customerTypelist() {
  722. raiInterface.customerTypelist().then((res) => {
  723. if (res.Ret === 200) {
  724. this.cities = res.Data.List;
  725. }
  726. });
  727. },
  728. // 子组件来的事件 产业
  729. commitIndustryDlg(data, type = "") {
  730. this.getIndustry();
  731. this.industryCascade.push([Number(data.ChartPermissionId), Number(data.NewId)]);
  732. },
  733. // 子组件来的事件 标的
  734. commitMarkDlg(data) {
  735. let arr = this.industryCascade.flat(Infinity);
  736. raiInterface
  737. .getindustrialSubjectlistIds({
  738. IndustrialManagementIdStr: arr[1],
  739. })
  740. .then((res) => {
  741. if (res.Ret === 200) {
  742. this.markOptions = res.Data.List || [];
  743. }
  744. });
  745. this.markValue = data.split(",").map((item) => Number(item));
  746. },
  747. /* 获取全部的行业 */
  748. getIndustry() {
  749. raiInterface.getListIndustrial().then((res) => {
  750. if (res.Ret === 200) {
  751. this.industryArr = res.Data.List || [];
  752. }
  753. });
  754. },
  755. //top 行业清除的事件
  756. clearTopIndustry() {
  757. this.industryCascade = [];
  758. this.radioTemporary = false;
  759. this.valTemporary = "";
  760. this.markValue = "";
  761. this.radioVisibleActivity = 2;
  762. },
  763. //添加标的的点击事件
  764. isAddMarketDlg() {
  765. let arr = this.industryCascade.flat(Infinity);
  766. this.industryArr.forEach((item) => {
  767. if (item.ChartPermissionId == arr[0]) {
  768. this.addMarkUpVal.industrialId = arr[1];
  769. item.List.forEach((key) => {
  770. if (key.ChartPermissionId == arr[1]) {
  771. this.addMarkUpVal.industrialName = key.PermissionName;
  772. }
  773. });
  774. }
  775. });
  776. if (this.industryCascade.length == 1) {
  777. this.addMarkDlg = true;
  778. } else if (this.industryCascade.length > 1) {
  779. this.$message.error("已选多个产业,无法添加标的");
  780. } else {
  781. this.$message.error("请先选择产业");
  782. }
  783. },
  784. //点击添加标的的下拉选择框
  785. markSelectFocus() {
  786. if (!this.industryCascade.length) {
  787. this.$message.error("请先选择产业");
  788. } else {
  789. let arr = [];
  790. arr = this.industryCascade.map((item) => {
  791. return item[1];
  792. });
  793. raiInterface
  794. .getindustrialSubjectlistIds({
  795. IndustrialManagementIdStr: arr.join(","),
  796. })
  797. .then((res) => {
  798. if (res.Ret === 200) {
  799. this.markOptions = res.Data.List || [];
  800. }
  801. });
  802. }
  803. },
  804. handleCheckAllChange(val) {
  805. if (val) {
  806. let newCodeList = this.cities.map((item) => item.CustomerTypeId);
  807. this.checkedCities = newCodeList;
  808. } else {
  809. this.checkedCities = [];
  810. }
  811. this.checkedCitiesTwo = this.checkedCities.join(",");
  812. this.isIndeterminate = false;
  813. },
  814. handleCheckedCitiesChange(value) {
  815. let checkedCount = value.length;
  816. this.checkAll = checkedCount === this.cities.length;
  817. this.isIndeterminate = checkedCount > 0 && checkedCount < this.cities.length;
  818. },
  819. cancelBtn() {
  820. this.$router.back();
  821. },
  822. contentTemplate(type) {
  823. this.contentTemplateTitle = type;
  824. },
  825. handleCloseSubject() {
  826. this.nameSubjectOptions = [];
  827. this.addSubjectName = "";
  828. this.addSubjectOptions = [];
  829. this.dialogVisibleSubject = false;
  830. },
  831. async remoteMethod(query) {
  832. if (query !== "") {
  833. const res = await raiInterface.industrialSubjectSearch({
  834. KeyWord: query,
  835. });
  836. if (res.Ret === 200) {
  837. this.addSubjectOptions = res.Data.List || [];
  838. }
  839. }
  840. },
  841. async searchInfo(val) {
  842. if (val !== "") {
  843. const res = await raiInterface.industrialSubjectSearchInfo({
  844. KeyWord: val,
  845. });
  846. if (res.Ret === 200) {
  847. this.isShowSubject = res.Data.List ? false : true;
  848. let arrList = [];
  849. arrList = res.Data.List
  850. ? res.Data.List.map((item) => {
  851. let arr = [];
  852. item.List.forEach((key) => {
  853. arr.push(key.Name);
  854. });
  855. return {
  856. ...item,
  857. value: arr.join(","),
  858. };
  859. })
  860. : [];
  861. this.nameSubjectOptions = arrList;
  862. }
  863. } else {
  864. this.nameSubjectOptions = [];
  865. }
  866. },
  867. //套餐类型的 提升文本
  868. checkboxTooltip(val) {
  869. let str = "";
  870. switch (val) {
  871. case "全选":
  872. str = "所有客户均可看到该活动(冻结、流失客户也可看到,但会提示无权限参会)";
  873. break;
  874. case "活动可见":
  875. str = "套餐类型和管理规模两项下,均有勾选时,只要满足其中之一的条件,客户就可见此活动。例如:勾选了大套餐客户和100亿以上,则大套餐客户和100亿以上规模的客户都可以看到此活动";
  876. break;
  877. }
  878. return str;
  879. },
  880. //删除上传
  881. handleRemoveAudio(file, fileList) {
  882. this.fileListAudio = [];
  883. },
  884. //删除上传前得确认
  885. beforeRemoveAudio(file, fileList) {
  886. return this.$confirm(`确定移除 ${file.name}?`);
  887. },
  888. //删除视频的上传
  889. handleRemoveVideo(file, fileList) {
  890. this.addEditVideo = [];
  891. },
  892. //获取视频时长的promise
  893. handleGetDuration(file) {
  894. return new Promise((resolve, reject) => {
  895. const fileUrl = URL.createObjectURL(file);
  896. const audioEl = new Audio(fileUrl);
  897. audioEl.addEventListener("loadedmetadata", (e) => {
  898. resolve(audioEl.duration);
  899. });
  900. });
  901. },
  902. //上传视频判断格式
  903. handelBeforeUploadVideo(e) {
  904. if (e.type != "video/mp4") {
  905. this.$message.warning("上传失败,上传视频格式不正确");
  906. return false;
  907. }
  908. },
  909. // 上传视频
  910. async handleUpload(e) {
  911. const duration = await this.handleGetDuration(e.file);
  912. this.addEditVideo.push({
  913. name: e.file.name,
  914. PlaySeconds: duration + "",
  915. url: "",
  916. });
  917. const res = await getOSSSign();
  918. if (res.Ret === 200) {
  919. let accessKeyId = res.Data.AccessKeyId;
  920. let accessKeySecret = res.Data.AccessKeySecret;
  921. let stsToken = res.Data.SecurityToken;
  922. this.handleUploadToOSS(e.file, accessKeyId, accessKeySecret, stsToken);
  923. }
  924. },
  925. //上传到阿里云
  926. async handleUploadToOSS(file, accessKeyId, accessKeySecret, stsToken) {
  927. this.startUpload = true;
  928. const ALOSSINS = new OSS({
  929. // yourRegion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
  930. region: "oss-cn-shanghai",
  931. // 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
  932. accessKeyId: accessKeyId,
  933. accessKeySecret: accessKeySecret,
  934. // 从STS服务获取的安全令牌(SecurityToken)。
  935. stsToken: stsToken,
  936. // 填写Bucket名称,例如examplebucket。
  937. bucket: "hzchart",
  938. endpoint: "hzstatic.hzinsights.com",
  939. cname: true,
  940. timeout: 600000,
  941. });
  942. // 生成文件名
  943. const t = new Date().getTime().toString();
  944. const temName = `static/yb/video/${MD5(t)}.${file.name.split(".")[1]}`;
  945. console.log(temName);
  946. const options = {
  947. // 获取分片上传进度、断点和返回值。
  948. progress: (p, cpt, res) => {
  949. console.log(p);
  950. this.percentage = parseInt(p * 100);
  951. },
  952. // 设置并发上传的分片数量。
  953. parallel: 10,
  954. // 设置分片大小。默认值为1 MB,最小值为100 KB。
  955. partSize: 1024 * 1024 * 10, // 10MB
  956. };
  957. try {
  958. const res = await ALOSSINS.multipartUpload(temName, file, { ...options });
  959. console.log("上传结果", res);
  960. if (res.res.status === 200) {
  961. this.getVideoAndImg(2);
  962. let VideoUrl = "https://hzstatic.hzinsights.com/" + res.name;
  963. this.addEditVideo[0].url = VideoUrl;
  964. this.startUpload = false;
  965. this.percentage = 0;
  966. }
  967. } catch (error) {
  968. this.$message.warning("上传失败,请刷新重试");
  969. this.startUpload = false;
  970. this.percentage = 0;
  971. }
  972. },
  973. errorUpload() {
  974. this.$message.error("音频文件和视频文件,仅支•持•上•传一个");
  975. },
  976. // 公司线下调研 调研电话会 的选择
  977. isCheckAllType(newval) {
  978. if (newval) {
  979. let newCodeList = [];
  980. this.cities.forEach((item) => {
  981. if (![5, 6, 7].includes(item.CustomerTypeId)) {
  982. newCodeList.push(item.CustomerTypeId);
  983. }
  984. });
  985. this.checkedCities = newCodeList;
  986. this.checkedCitiesTwo = this.checkedCities.join(",");
  987. this.isIndeterminate = true;
  988. this.checkAll = false;
  989. } else {
  990. this.checkedCities = [];
  991. this.checkedCitiesTwo = "";
  992. this.checkAll = false;
  993. }
  994. },
  995. // 点击修改图片的弹框
  996. modifyImgHandler() {
  997. let type = this.addEditVideo.length > 0 ? 2 : 1;
  998. this.getVideoAndImg(type, "修改");
  999. this.modifyImgVisible = true;
  1000. },
  1001. // video_and_voiceImgActivityVideo()
  1002. async getVideoAndImg(type, isOne = "") {
  1003. const res = await raiInterface.video_and_voiceImgActivityVideo({
  1004. FileType: type,
  1005. ActivityId: Number(this.$route.query.id),
  1006. });
  1007. if (res.Ret === 200) {
  1008. isOne == "修改" ? "" : (this.defaultImage = res.Data.List[0].ImgUrl);
  1009. this.videoAndVoiceList = res.Data.List;
  1010. }
  1011. },
  1012. },
  1013. };
  1014. </script>
  1015. <style lang="scss">
  1016. .container-addAct {
  1017. .content-template {
  1018. display: flex;
  1019. div {
  1020. margin-right: 20px;
  1021. padding-bottom: 4px;
  1022. }
  1023. .active {
  1024. border-bottom: 4px solid #409eff;
  1025. }
  1026. margin-bottom: 20px;
  1027. }
  1028. .customWidth {
  1029. width: 550px !important;
  1030. }
  1031. .top-box {
  1032. display: flex;
  1033. justify-content: space-between;
  1034. }
  1035. .fr-second-toolbar {
  1036. display: none;
  1037. }
  1038. #dialog {
  1039. -webkit-touch-callout: none;
  1040. -webkit-user-select: none;
  1041. -khtml-user-select: none;
  1042. -moz-user-select: none;
  1043. -ms-user-select: none;
  1044. user-select: none;
  1045. color: #333;
  1046. font-size: 14px;
  1047. div {
  1048. margin-bottom: 40px;
  1049. }
  1050. }
  1051. .no-cv {
  1052. margin-top: 30px;
  1053. -webkit-user-select: none;
  1054. -khtml-user-select: none;
  1055. -moz-user-select: none;
  1056. -ms-user-select: none;
  1057. user-select: none;
  1058. }
  1059. .text-right {
  1060. display: inline-block;
  1061. text-align: right;
  1062. }
  1063. .radio-input {
  1064. display: flex;
  1065. align-items: center;
  1066. .el-input__inner {
  1067. box-sizing: border-box;
  1068. line-height: 30px;
  1069. width: 112px;
  1070. height: 28px !important;
  1071. background: #ffffff;
  1072. border: 1px solid #aab4cc;
  1073. border-radius: 4px;
  1074. }
  1075. }
  1076. .astrict-inpt {
  1077. box-sizing: border-box;
  1078. line-height: 30px;
  1079. width: 112px;
  1080. height: 28px !important;
  1081. background: #ffffff;
  1082. input {
  1083. padding: 10px;
  1084. }
  1085. }
  1086. .checkbox-box {
  1087. display: flex;
  1088. margin-bottom: 10px;
  1089. .el-checkbox {
  1090. margin-left: 5px;
  1091. margin-right: 30px;
  1092. }
  1093. }
  1094. .subject-text {
  1095. padding-top: 20px;
  1096. }
  1097. .is-visible {
  1098. margin-bottom: 20px;
  1099. .el-checkbox {
  1100. margin-left: 20px;
  1101. }
  1102. }
  1103. .audio-content {
  1104. display: flex;
  1105. align-items: center;
  1106. .test {
  1107. flex-shrink: 0;
  1108. }
  1109. .upload-demo {
  1110. display: flex;
  1111. .el-upload-list {
  1112. margin-left: 20px;
  1113. }
  1114. }
  1115. }
  1116. .cover-content {
  1117. align-items: stretch;
  1118. vertical-align: bottom;
  1119. .img-content {
  1120. position: relative;
  1121. height: 200px;
  1122. width: 200px;
  1123. border: 1px solid #ccc;
  1124. img {
  1125. width: 100%;
  1126. height: 100%;
  1127. }
  1128. }
  1129. .modify {
  1130. position: absolute;
  1131. bottom: 0;
  1132. right: -50px;
  1133. height: 20px;
  1134. cursor: pointer;
  1135. color: #409eff;
  1136. }
  1137. }
  1138. .el-upload-list__item.is-success.focusing .el-icon-close-tip {
  1139. display: none !important;
  1140. }
  1141. }
  1142. .fr-visible {
  1143. display: none !important;
  1144. }
  1145. .add-delete {
  1146. display: flex;
  1147. align-items: center;
  1148. img {
  1149. width: 18px;
  1150. }
  1151. }
  1152. </style>