edit.php 58 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230
  1. <script src="/resources/js/html2canvas.min.js"></script>
  2. <!-- 装修所需的数据 -->
  3. <script type="text/javascript" src="/resources/js/diy-util.js"></script>
  4. <script type="text/javascript" src="/resources/js/hotzone.js"></script>
  5. <?php
  6. use common\helpers\ComponentHelper;
  7. use common\models\diy\DiyComponents;
  8. ComponentHelper::loadComponentView('components/diy-preview', __DIR__);
  9. ComponentHelper::loadComponentView('components/diy/diy-color', __DIR__);
  10. $currentRoute = Yii::$app->controller->route;
  11. ?>
  12. <div id="app">
  13. <div class="diy-contain flex" v-loading="loading">
  14. <!-- 左侧内容 -->
  15. <diy-preview :active-item="formData" ></diy-preview>
  16. <!-- 右侧内容 -->
  17. <transition name="fade">
  18. <el-scrollbar class="dsp-contain">
  19. <div class="contain-box">
  20. <div class="title">基础信息</div>
  21. <el-divider></el-divider>
  22. <el-form :model="formData" :rules="rules" ref="basisForm" label-width="130px" >
  23. <el-form-item label="次卡名称:" prop="name">
  24. <el-col :span="14">
  25. <el-input v-model="formData.name" maxlength="15" show-word-limit ></el-input>
  26. </el-col>
  27. </el-form-item>
  28. <el-form-item label="卡面字体颜色:" >
  29. <diy-color :color-infos="['']" :str-color="strColor" @chang="updateColor"></diy-color>
  30. </el-form-item>
  31. <el-form-item label="次卡背景:" prop="background_type" required>
  32. <div class="flex-y-center" style="margin-bottom: 10px;">
  33. <el-radio style="margin-right: 0" v-model="formData.background_type" :label="0" @change="backgroundTypeChange" ><span></span></el-radio>
  34. <div>默认背景: </div>
  35. <div style="width:100px;margin:0 8px;">
  36. <el-dropdown trigger="click" @command="backgroundChange">
  37. <div class="dropdown-link flex-y-center" >
  38. <image :src="`${static_img_prefix}${background_default}`" style="width:80px;height:30px;margin: 2px;">
  39. <i class="el-icon-arrow-down el-icon--right"></i>
  40. </div>
  41. <el-dropdown-menu slot="dropdown">
  42. <div class="flex">
  43. <el-dropdown-item class="dropdown-item" command="bg1">
  44. <image :src="`${static_img_prefix}${defaultStyle.bg1.bg_url}`" style="width:50px;height:30px;">
  45. </el-dropdown-item>
  46. <el-dropdown-item class="dropdown-item" command="bg2">
  47. <image :src="`${static_img_prefix}${defaultStyle.bg2.bg_url}`" style="width:50px;height:30px;">
  48. </el-dropdown-item>
  49. </div>
  50. <div class="flex">
  51. <el-dropdown-item class="dropdown-item" command="bg3">
  52. <image :src="`${static_img_prefix}${defaultStyle.bg3.bg_url}`" style="width:50px;height:30px;">
  53. </el-dropdown-item>
  54. <el-dropdown-item class="dropdown-item" command="bg4">
  55. <image :src="`${static_img_prefix}${defaultStyle.bg4.bg_url}`" style="width:50px;height:30px;">
  56. </el-dropdown-item>
  57. </div>
  58. </el-dropdown-menu>
  59. </el-dropdown>
  60. </div>
  61. </div>
  62. <div class="flex-y-center flex-y-top">
  63. <el-radio style="margin-right: 0" v-model="formData.background_type" :label="1" @change="backgroundTypeChange"><span></span></el-radio>
  64. <div style="line-height: 16px; margin-right: 20px">自定义:</div>
  65. <div v-if="formData.background_type==1">
  66. <com-attachment v-if="!background_diy" :multiple="false" :max="1" type="images" @selected="coverPic">
  67. <div class="card-upload">
  68. <i class="el-icon-plus"></i>
  69. </div>
  70. </com-attachment>
  71. <div class="card-coverimg" v-else>
  72. <el-image style="width: 80px; height: 80px" :src="background_diy"></el-image>
  73. <el-button @click="delPic" class="icon-close" type="primary" size="mini" icon="el-icon-close" circle></el-button>
  74. </div>
  75. <p class="tips-text">尺寸:686*360像素,小于1M,支持jpg、png、jpeg格式</p>
  76. </div>
  77. </div>
  78. </el-form-item>
  79. <el-form-item>
  80. <label slot="label">售卖时段:
  81. <el-tooltip class="item" effect="dark" content="配置后,该卡在指定时段内才可售卖和兑换。" placement="top">
  82. <i class="el-icon-info"></i>
  83. </el-tooltip>
  84. </label>
  85. <el-date-picker
  86. v-model="sell_time_start_end"
  87. type="datetimerange"
  88. value-format="yyyy-MM-dd HH:mm:ss"
  89. range-separator="至"
  90. start-placeholder="开始日期"
  91. end-placeholder="结束日期"
  92. :default-time="['00:00:00', '23:59:59']"></el-date-picker>
  93. </el-form-item>
  94. <el-form-item label="次卡有效期:" prop="expire_type" required>
  95. <div class="flex-y-center" style="margin-bottom: 10px">
  96. <el-radio style="margin-right: 0" v-model="formData.expire_type" :label="1"><span></span></el-radio>
  97. <span>购买时起 </span>
  98. <div style="width:80px;margin:0 8px;"> <el-input placeholder="请输入" size="mini" v-model="formData.expire_day" oninput="value=value.replace(/^0|[^0-9]/g,'')"/></div>
  99. <span> 天内有效</span>
  100. </div>
  101. <div class="flex-y-center">
  102. <el-radio style="margin-right: 0" v-model="formData.expire_type" :label="2"><span></span></el-radio>
  103. <el-col :span="11">
  104. <el-date-picker
  105. format="yyyy-MM-dd"
  106. value-format="yyyy-MM-dd"
  107. v-model="begin_end_at"
  108. type="daterange"
  109. range-separator="~ "
  110. start-placeholder="开始日期"
  111. end-placeholder="结束日期"
  112. @change="beginEndAtChange">
  113. </el-date-picker>
  114. </el-col>
  115. </div>
  116. </el-form-item>
  117. <el-form-item label="次卡价格设置:" >
  118. <el-form :model="formData" :rules="rules" ref="priceForm" label-position="top" label-width="100px">
  119. <el-col :span="20" class="flex" style="margin-bottom: 10px;background: #F5F5F5">
  120. <div class="setting-item">
  121. <el-form-item label="售价" prop="price" class="is-required">
  122. <el-input v-model="formData.price" size="mini" @input="(v) => (formData.price = v.replace(/[^\d.]/g, '').replace(/(\..*?)\..*/g, '$1').replace(/^(\d+)(\.\d{0,2})?.*$/, '$1$2').replace(/(\.\d{2})\d+$/, '$1'))" ></el-input>
  123. </el-form-item>
  124. </div>
  125. <div class="setting-item">
  126. <el-form-item label="原价" prop="original_price" class="is-required">
  127. <el-input v-model="formData.original_price" size="mini" @input="(v) => (formData.original_price = v.replace(/[^\d.]/g, '').replace(/(\..*?)\..*/g, '$1').replace(/^(\d+)(\.\d{0,2})?.*$/, '$1$2').replace(/(\.\d{2})\d+$/, '$1'))" ></el-input>
  128. </el-form-item>
  129. </div>
  130. <div class="setting-item">
  131. <el-form-item prop="verifiable_times" class="is-required">
  132. <label slot="label">可核销数
  133. <el-tooltip class="item" effect="dark" content="表示该卡可核销 享受的服务次数、达到限制时将不再支持核销" placement="top">
  134. <i class="el-icon-info"></i>
  135. </el-tooltip>
  136. </label>
  137. <el-input v-model="formData.verifiable_times" size="mini" @input="(v) => (formData.verifiable_times = v.replace(/^0|[^0-9]/g,''))" maxlength="9" ></el-input>
  138. </el-form-item>
  139. </div>
  140. <div class="setting-item">
  141. <el-form-item prop="max_times" class="is-required">
  142. <label slot="label">库存
  143. <el-tooltip class="item" effect="dark" content="表示该次卡最多可开通多少张,包含售卡和兑换方式开卡。达到限制时将不支持购买和兑换!" placement="top">
  144. <i class="el-icon-info"></i>
  145. </el-tooltip>
  146. </label>
  147. <el-input v-model="formData.max_times" size="mini" @input="(v) => (formData.max_times = v.replace(/^0|[^0-9]/g,''))" maxlength="9"></el-input>
  148. </el-form-item>
  149. </div>
  150. <div class="setting-item">
  151. <el-form-item label="虚拟销量" prop="virtual_sales">
  152. <el-input v-model="formData.virtual_sales" size="mini" @input="(v) => (formData.virtual_sales = v.replace(/^0|[^0-9]/g,''))" maxlength="9"></el-input>
  153. </el-form-item>
  154. </div>
  155. </el-col>
  156. </el-form>
  157. </el-form-item>
  158. </el-form>
  159. </div>
  160. <div class="contain-box">
  161. <div class="flex">
  162. <div class="title">卡服务设置<span class="tips-text" style="font-weight: normal;">(每张次卡可设置多项卡服务,可拖动调整显示排序)</span></div>
  163. <el-button type="text" icon="el-icon-circle-plus" class="add-box" @click="serviceAdd">新增服务项</el-button>
  164. </div>
  165. <el-divider></el-divider>
  166. <div class="service-box">
  167. <el-form :model="serviceModel" ref="serviceForm" label-width="130px" >
  168. <draggable :list="serviceModel.list" handle=".dargBtn" :animation="1000">
  169. <div class="service-item draggable" v-for="(service,index) in serviceModel.list" :key="index">
  170. <div class="flex service-con">
  171. <div class="flex-x-y-center dargBtn" style="width:50px;font-size: 30px;color:#888;">
  172. <div><i class="el-icon-s-unfold"></i></div>
  173. </div>
  174. <div style="padding-top:26px;">
  175. <el-form-item label="服务主标题:"
  176. :prop="'list.' + index + '.service_title'"
  177. :rules="{required: true, message: '服务主标题不能为空', trigger: 'blur'}">
  178. <el-col >
  179. <el-input v-model="service.service_title" maxlength="20" show-word-limit></el-input>
  180. </el-col>
  181. </el-form-item>
  182. <el-form-item label="服务副标题:" prop="service_subtitle">
  183. <el-col >
  184. <el-input v-model="service.service_subtitle" maxlength="20" show-word-limit></el-input>
  185. </el-col>
  186. </el-form-item>
  187. <el-row>
  188. <el-col :span="12">
  189. <el-form-item label="服务原价:" prop="service_original_price">
  190. <el-input-number size="small" v-model="service.service_original_price" :precision="2" :min="0.00" controls-position="right" ></el-input-number>
  191. </el-form-item>
  192. </el-col>
  193. <el-col :span="12">
  194. <el-form-item label="服务项数量:"
  195. :prop="'list.' + index + '.service_num'"
  196. :rules="{required: true, message: '服务项数量:不能为空', trigger: 'blur'}">
  197. <el-input-number size="small" v-model="service.service_num" controls-position="right" :min="1" :precision="0"></el-input-number>
  198. </el-form-item>
  199. </el-col>
  200. </el-row>
  201. </div>
  202. <div class="flex-x-y-center" style="width:50px;font-size: 30px;color:#888;">
  203. <div><i class="el-icon-delete" @click="serviceDel(index)"></i></div>
  204. </div>
  205. </div>
  206. </div>
  207. </draggable>
  208. </el-form>
  209. </div>
  210. </div>
  211. <div class="title">其他设置</div>
  212. <el-divider></el-divider>
  213. <div>
  214. <el-form :model="formData" :rules="rules" ref="otherForm" label-width="180px" >
  215. <el-form-item label="是否需要预约:" prop="reservation_type" required>
  216. <el-radio-group v-model="formData.reservation_type" @change="reservationTypeChange">
  217. <el-radio :label="0" :disabled="disabled">不需要预约</el-radio>
  218. <el-radio :label="1" :disabled="disabled">需要提前预约</el-radio>
  219. </el-radio-group>
  220. <span class="tips-text" style="font-weight: normal; color:red">(提示:保存后无法修预约设置)</span>
  221. </el-form-item>
  222. <template v-if="formData.reservation_type==1">
  223. <el-form-item label="预约模式:" prop="reservation_model">
  224. <el-radio-group v-model="formData.reservation_model">
  225. <el-radio :label="1" :disabled="disabled">预约门店</el-radio>
  226. <!-- <el-radio :label="2" :disabled="disabled">预约服务人</el-radio>-->
  227. </el-radio-group>
  228. </el-form-item>
  229. <el-form-item label="可预约时间:" prop="temp_reservation_time" required v-if="formData.reservation_model ==1">
  230. <el-checkbox :indeterminate="isIndeterminate" v-model="everyDay" @change="handleCheckAllDaysChange" :disabled="disabled">每天</el-checkbox>
  231. <el-checkbox-group v-model="dayCheckList" @change="handleCheckedDaysChange">
  232. <el-checkbox v-for="(item, index) in weekList" :label="item.code" :key="index" :disabled="disabled">{{item.label}}</el-checkbox>
  233. </el-checkbox-group>
  234. </el-form-item>
  235. <template v-if="formData.reservation_model ==1">
  236. <div class="flex-y-center" v-for="(reservation,index) in formData.temp_reservation_time" style="margin:0 0 8px 0;">
  237. <el-form-item :label="weekListMate[reservation.day]"
  238. :prop="'temp_reservation_time.' + index + '.time_start_end'"
  239. :rules="{required: true, message: '请选择可预约时间范围', trigger: 'blur'}">
  240. <el-time-picker
  241. v-if="index==0"
  242. :disabled="disabled"
  243. is-range
  244. format="HH:mm"
  245. value-format="HH:mm"
  246. v-model="reservation.time_start_end"
  247. range-separator="至"
  248. start-placeholder="开始时间"
  249. end-placeholder="结束时间"
  250. placeholder="选择时间范围"
  251. @change="setAllTime">
  252. </el-time-picker >
  253. <el-time-picker
  254. v-else
  255. :disabled="disabled"
  256. is-range
  257. format="HH:mm"
  258. value-format="HH:mm"
  259. v-model="reservation.time_start_end"
  260. range-separator="至"
  261. start-placeholder="开始时间"
  262. end-placeholder="结束时间"
  263. placeholder="选择时间范围">
  264. </el-time-picker >
  265. <el-checkbox v-model="checkAll" v-if="index==0" @change="setAllTime" :disabled="disabled">设置全部</el-checkbox>
  266. </el-form-item>
  267. </div>
  268. </template>
  269. <el-form-item label="项目时长:" prop="appointment_interval_duration" required>
  270. <div class="flex-y-center" style="margin-bottom: 10px">
  271. <div style="margin:0 8px;">
  272. <el-input-number v-model="formData.appointment_interval_duration" size="small" controls-position="right" :disabled="disabled" :min="15" :step="5" :precision="0"></el-input-number>
  273. </div>
  274. <span> 分钟</span>
  275. <el-tooltip class="item" effect="dark" content="设置可预约的间隔时间,举例设置30分钟,那么服务人员每隔30分钟可接受一次预约" placement="top">
  276. <i class="el-icon-info"></i>
  277. </el-tooltip>
  278. </div>
  279. </el-form-item>
  280. <el-form-item label="预约取消:" prop="reservation_cancel_type" >
  281. <el-radio style="margin-right: 0" v-model="formData.reservation_cancel_type" :disabled="disabled" :label="1">不允许取消</el-radio>
  282. <div class="flex-y-center" style="margin-bottom: 10px">
  283. <el-radio style="margin-right: 0" v-model="formData.reservation_cancel_type" :disabled="disabled" :label="2"><span></span></el-radio>
  284. <span>服务开始前 </span>
  285. <div style="margin:0 8px;">
  286. <el-input-number placeholder="0" v-model="formData.reservation_cancel_hour" size="small" controls-position="right" :disabled="disabled" :min="0" :precision="0"></el-input-number>
  287. </div>
  288. <span>小时、取消并扣除</span>
  289. <div style="margin:0 8px;">
  290. <el-input-number placeholder="0" v-model="formData.reservation_cancel_deduct" size="small" controls-position="right" :disabled="disabled" :min="0" :precision="0"></el-input-number>
  291. </div>
  292. <span> 次可服务(核销)数</span>
  293. </div>
  294. </el-form-item>
  295. <el-form-item label="预约限制:" prop="reservation_limit_people" >
  296. <div class="flex">
  297. <div class="flex-y-center" style="margin-bottom: 10px">
  298. <span>同时段可预约: </span>
  299. <div style="margin:0 8px;"> <el-input-number placeholder="1" v-model="formData.reservation_limit_people" size="small" controls-position="right" :disabled="disabled" :min="1" :precision="0"></el-input-number></div>
  300. <div>人
  301. <el-tooltip class="item" effect="dark" content="限制同时段门店/服务人,同时被约人数" placement="top">
  302. <i class="el-icon-info"></i>
  303. </el-tooltip>
  304. </div>
  305. </div>
  306. <div class="flex-y-center" style="margin-bottom: 10px">
  307. <div style="margin-left:30px;">反复预约限制: </div>
  308. <div style="margin:0 8px;"><el-input-number placeholder="0" v-model="formData.reservation_limit_repeat" size="small" controls-position="right" :disabled="disabled" :min="0" :precision="0"></el-input-number></div>
  309. <div>
  310. 次
  311. <el-tooltip class="item" effect="dark" content="限制反复预约,恶意占用资源" placement="top">
  312. <i class="el-icon-info"></i>
  313. </el-tooltip>
  314. </div>
  315. </div>
  316. </div>
  317. </el-form-item>
  318. </template>
  319. <el-form-item label="是否允许用户发起退款:" prop="refund_type" required>
  320. <el-radio-group v-model="formData.refund_type">
  321. <el-radio :label="0">未使用到期自动退
  322. <el-tooltip class="item" effect="dark" content="用户下单后,未使用到期自动退" placement="top">
  323. <i class="el-icon-info"></i>
  324. </el-tooltip>
  325. </el-radio>
  326. <el-radio :label="1">不允许退款
  327. <el-tooltip class="item" effect="dark" content="用户下单后,无法发起主动退款申请操作" placement="top">
  328. <i class="el-icon-info"></i>
  329. </el-tooltip>
  330. </el-radio>
  331. <el-radio :label="2">允许退款
  332. <el-tooltip class="item" effect="dark" content="卡过期或者已停卡时,允许申请退款。发起申请退款金额=剩余核销次数*(开卡实付金额÷总核销数)" placement="top">
  333. <i class="el-icon-info"></i>
  334. </el-tooltip>
  335. </el-radio>
  336. </el-radio-group>
  337. </el-form-item>
  338. <el-form-item label="每人限购次数:" prop="limit_type">
  339. <el-radio :label="0" v-model="formData.limit_type">不限开卡次数
  340. <el-tooltip class="item" effect="dark" content="用户可重复开卡,不限制领卡次数" placement="top">
  341. <i class="el-icon-info"></i>
  342. </el-tooltip>
  343. </el-radio>
  344. <div class="flex-y-center" style="margin-bottom: 10px">
  345. <el-radio style="margin-right: 0" :label="1" v-model="formData.limit_type"><span></span></el-radio>
  346. <span>有效期内限开卡次数</span>
  347. <div style="width:80px;margin:0 8px;"><el-input-number placeholder="1" v-model="formData.limit_times" size="small" controls-position="right" :disabled="disabled" :min="1" :precision="0"></el-input-number></div>
  348. <span>次</span>
  349. <el-tooltip class="item" effect="dark" content="领取次数仅统计用户领卡的次数,不统计商家发卡" placement="top">
  350. <i class="el-icon-info"></i>
  351. </el-tooltip>
  352. </div>
  353. </el-form-item>
  354. <el-form-item label="适用门店:" prop="use_type" required>
  355. <el-select v-model="formData.store_type" size="mini" placeholder="请选择" :disabled="disabled" style="width:100px;">
  356. <el-option
  357. label="O2O门店"
  358. :value="1">
  359. </el-option>
  360. </el-select>
  361. <el-radio-group v-model="formData.use_type">
  362. <el-radio :label="0" :disabled="disabled">全部门店</el-radio>
  363. <el-radio :label="1" :disabled="disabled">指定店铺</el-radio>
  364. </el-radio-group>
  365. <span class="tips-text" style="font-weight: normal; color:red">(提示:保存后无法修可核销门店)</span>
  366. </el-form-item>
  367. <el-form-item label="选择门店" prop="store_ids" required v-if="formData.use_type==1">
  368. <el-col :span="20">
  369. <el-button type="text" icon="el-icon-circle-plus" @click="onChooseStore" :disabled="disabled">选择门店</el-button>
  370. </el-col>
  371. <el-table v-if="formData.store_list.length" :data="id?formData.store_list:tableList" stripe size="small" style="width: 80%" >
  372. <el-table-column label="店铺名称" prop="store_name" align="center"></el-table-column>
  373. <el-table-column label="类型" ><template slot-scope="scope">O2O门店 </template></el-table-column>
  374. <el-table-column label="店长/联系方式" prop="shop_mobile" >
  375. <template slot-scope="scope">
  376. <span>{{scope.row.shop_owner}}</span>
  377. <span>{{scope.row.shop_mobile}}</span>
  378. </template>
  379. </el-table-column>
  380. <el-table-column label="操作" align="center">
  381. <template slot-scope="scope">
  382. <el-button type="text" size="small" :disabled="disabled"style="color:red" @click.native.prevent="deleteStore(scope.$index)">删除</el-button>
  383. </template>
  384. </el-table-column>
  385. </el-table>
  386. <el-row type="flex" class="page" style="margin-top:10px;">
  387. <el-pagination @current-change="paginationClerkStore" background layout="prev, pager, next" :page-count="pageCountClerk" v-if="id && formData.store_list.length"></el-pagination>
  388. <el-pagination
  389. background
  390. v-if="!id && formData.store_list.length"
  391. :hide-on-single-page="true"
  392. @current-change="handleCurrentChange"
  393. :current-page="listQuery.page"
  394. :page-size="listQuery.pageNum"
  395. layout="prev, pager, next"
  396. :total="formData.store_list.length">
  397. </el-pagination>
  398. </el-row>
  399. </el-form-item>
  400. <el-form-item label="服务方式" prop="reserve.service_type"
  401. v-if="formData.reservation_model==2">
  402. <el-radio v-model="formData.reservation_service_type" :label="2">到店服务</el-radio>
  403. <el-radio v-model="formData.reservation_service_type" :label="1">上门服务</el-radio>
  404. <el-radio v-model="formData.reservation_service_type" :label="3">到店服务/上门服务</el-radio>
  405. </el-form-item>
  406. <el-form-item label="使用规则:" prop="rule" required>
  407. <el-col :span="20">
  408. <el-input type="textarea" v-model="formData.rule" rows="10" placeholder="请输入使用条件范围及限制内容,避免产生纠纷!" ></el-input>
  409. </el-col>
  410. </el-form-item>
  411. </el-form>
  412. </div>
  413. <div class="flex-x-center" style="padding-bottom: 20px;">
  414. <el-button @click="cancel">取消</el-button>
  415. <el-button type="primary" @click="submitForm">提交</el-button>
  416. </div>
  417. </el-scrollbar>
  418. </transition>
  419. </div>
  420. <!-- 选择店铺 -->
  421. <el-dialog title="选择店铺" width="800px" :visible.sync="isShowStore" :close-on-click-modal="false">
  422. <div>
  423. <el-form :inline="true" size="small">
  424. <el-form-item label="店铺名称">
  425. <el-input clearable v-model="store_name" placeholder="请输入店铺名称进行搜索"></el-input>
  426. </el-form-item>
  427. <el-form-item label="">
  428. <el-button type="primary" size="small" @click="onSearchStore">搜索</el-button>
  429. </el-form-item>
  430. </el-form>
  431. <el-table :data="storeTableData" stripe size="small" style="width: 100%" row-key='id' ref="storeTable" @selection-change='handleSelectionChange'>
  432. <el-table-column type="selection" reserve-selection width="55"> </el-table-column>
  433. <el-table-column label="序号" prop="id" width="160" align="left">
  434. </el-table-column>
  435. <el-table-column label="店铺名称" prop="store_name" width="100" align="center"></el-table-column>
  436. <el-table-column label="店长/联系方式" prop="shop_mobile" width="150" >
  437. <template slot-scope="scope">
  438. <span>{{scope.row.shop_owner}}</span>
  439. <span>{{scope.row.shop_mobile}}</span>
  440. </template>
  441. </el-table-column>
  442. <el-table-column label="地址" prop="address" ></el-table-column>
  443. </el-table>
  444. <div style="padding: 15px 0">
  445. <el-pagination v-if="store_pagination" style="float: right;" background @current-change="onChangeStorePage"
  446. layout="prev, pager, next" :page-count="store_count">
  447. </el-pagination>
  448. <div style="clear: both"></div>
  449. </div>
  450. <div style="text-align: center; padding-bottom: 15px">
  451. <el-button type="primary" size="small" @click="onSelectedStore">确定</el-button>
  452. <el-button type="info" size="small" @click="onCancelStore">取消</el-button>
  453. </div>
  454. </div>
  455. </el-dialog>
  456. </div>
  457. <script src="<?= Yii::$app->request->baseUrl ?>/resources/unpkg/vuedraggable@2.18.1/dist/vuedraggable.umd.min.js"></script>
  458. <script>
  459. new Vue({
  460. el: '#app',
  461. data() {
  462. //自定义校验规则
  463. //背景图片
  464. let val_background_type = (rule, value, callback) => {
  465. console.log('value',value,this.background_diy)
  466. if (value === 1 && this.background_diy ==null) {
  467. callback(new Error('请上传自定义背景'));
  468. } else {
  469. callback();
  470. }
  471. };
  472. //次卡有效期类型
  473. let val_expire_type = (rule, value, callback) => {
  474. console.log('this.formData.end_at',value)
  475. if (value === 1 && this.formData.expire_day =='') {
  476. callback(new Error('请输入有效天数'));
  477. } else if (value === 2 && this.formData.begin_at =='') {
  478. callback(new Error('请选择有效期范围'));
  479. } else if (value === 2 && this.formData.sell_time_end) {
  480. let sell_time_end_seconds = (new Date(this.formData.sell_time_end)).getTime()
  481. console.log('this.formData.end_at',this.formData.end_at)
  482. let end_at_seconds = (new Date(this.formData.end_at +' 23:59:59')).getTime()
  483. if(end_at_seconds <= sell_time_end_seconds){
  484. callback(new Error('次卡有效期不能小于售卖时段'));
  485. }
  486. callback();
  487. } else {
  488. callback();
  489. }
  490. };
  491. // 预约限制
  492. // let val_reservation_limit_people = (rule, value, callback) => {
  493. // if (value === 1 && this.formData.expire_day =='') {
  494. // callback(new Error('请输入有效天数'));
  495. // } else if (value === 2 && this.formData.begin_at =='' ) {
  496. // callback(new Error('请选择有效期范围'));
  497. // } else {
  498. // callback();
  499. // }
  500. // };
  501. //
  502. return {
  503. static_img_prefix: '<?= Yii::getAlias('@attachurl') ?>'+'/static',
  504. loading:false,
  505. id:'',
  506. disabled:false,
  507. session_key:'',
  508. formData: {
  509. name: '',
  510. background_type:0,// '次卡背景类型,0:默认背景,1:自定义',
  511. font_color:'#FF9031',
  512. background:'/addons/SecondaryCard/background2.png',//次卡背景
  513. sell_time_start:'',//售卖开始时间
  514. sell_time_end:'',
  515. expire_type:1,//次卡有效期类型:1=购买时起N天内有效,2=指定有效期
  516. begin_at:'',
  517. end_at:'',
  518. expire_day:'',//有效天数 expire_type =1
  519. price:'',
  520. original_price:'',
  521. verifiable_times:'',
  522. max_times:'',//最大开卡数
  523. virtual_sales:'',//虚拟销量
  524. service:[],//卡服务设置
  525. reservation_type:0,// '是否需要预约,0:不需要,1:需要',
  526. reservation_model:1,//预约模式:1:预约门店;2:预约服务人
  527. reservation_service_type: 2,// 服务方式:1:上门服务;2:到店服务;3:上门/到店
  528. reservation_time:[],//可预约时间段
  529. appointment_interval_duration:0,
  530. reservation_cancel_type:1,
  531. reservation_cancel_hour:0,
  532. reservation_cancel_deduct:0,
  533. reservation_limit_people:0,
  534. reservation_limit_repeat:0,
  535. refund_type:0,// '退款类型,0:未使用到期自动退,1:不允许退款,2:允许退款',
  536. limit_type:0,//限购类型,0:不限开卡次数(用户可重复开卡,不限制领卡次数),1:有效期内限开卡次数'
  537. limit_times:'',//次数 领取次数仅统计用户领卡的次数,不统计商家发卡'
  538. store_type:1,//门店类型 1 o2o
  539. use_type:0,//使用范围 0:全部店铺 1:指定店铺
  540. store_ids:[],
  541. store_list:[],
  542. rule:'',//使用规则
  543. temp_reservation_time:[]// 预约时间,
  544. },
  545. sell_time_start_end:'',//售卖时段
  546. begin_end_at:'', //次卡有效期
  547. background_default:'/addons/SecondaryCard/background2.png',
  548. background_diy:null,
  549. everyDay:false,
  550. checkAll: false,
  551. isIndeterminate: false,
  552. dayCheckList:[],
  553. serviceModel:{ //服务项
  554. list:[
  555. {
  556. service_title:'',
  557. service_subtitle:'',
  558. service_original_price:'',
  559. service_num:1
  560. }
  561. ]
  562. },
  563. //门店表格相关
  564. isShowStore:false,
  565. storeTableData:[],
  566. store_name:'',
  567. store_page: 1,
  568. store_pagination: null,
  569. store_count: null,
  570. multipleSelection: [],
  571. rules: {
  572. name: [
  573. { required: true, message: '请输入次卡名称', trigger: 'blur' },
  574. { max: 15, message: '长度不能超过15个字', trigger: 'blur' }
  575. ],
  576. background_type: [
  577. { required: true, message: '请选择背景图', trigger: 'blur' },
  578. { validator: val_background_type, trigger: 'blur' }
  579. ],
  580. expire_type:[
  581. { required: true, message: '请输入次卡有效期', trigger: 'blur' },
  582. { validator: val_expire_type, trigger: 'blur' }
  583. ],
  584. price: [
  585. { required: true, message: '请输入售价', trigger: 'blur' }
  586. ],
  587. original_price: [
  588. { required: true, message: '请输入原价', trigger: 'blur' }
  589. ],
  590. verifiable_times: [
  591. { required: true, message: '请输入可核销数', trigger: 'blur' }
  592. ],
  593. max_times: [
  594. { required: true, message: '请输入库存', trigger: 'blur' }
  595. ],
  596. temp_reservation_time:[
  597. { type: 'array', required: true, message: '请至少选择一个可预约日期', trigger: 'change' }
  598. ],
  599. rule: [
  600. { required: true, message: '请输入使用规则', trigger: 'blur' }
  601. ],
  602. store_ids: [
  603. { required: true, message: '请选择门店', trigger: 'blur' }
  604. ],
  605. appointment_interval_duration:[
  606. { required: true, message: '请输入项目时长', trigger: 'blur' }
  607. ]
  608. },
  609. defaultStyle:{
  610. 'bg1':{
  611. bg_url:'/addons/SecondaryCard/background2.png',//黄色
  612. font_color:'#FF9031'
  613. },
  614. 'bg2':{
  615. bg_url:'/addons/SecondaryCard/background3.png',//黑色
  616. font_color:'#FFFFFF'
  617. },
  618. 'bg3':{
  619. bg_url:'/addons/SecondaryCard/background1.png',//蓝色
  620. font_color:'#4B83E0'
  621. },
  622. 'bg4':{
  623. bg_url:'/addons/SecondaryCard/background4.png',//粉色
  624. font_color:'#F65B66'
  625. }
  626. },
  627. weekListMate:{
  628. 1:'星期一',
  629. 2:'星期二',
  630. 3:'星期三',
  631. 4:'星期四',
  632. 5:'星期五',
  633. 6:'星期六',
  634. 0:'星期日',
  635. },
  636. weekList:[{
  637. code:1,
  638. label:'星期一'
  639. },{
  640. code:2,
  641. label:'星期二'
  642. },{
  643. code:3,
  644. label:'星期三'
  645. },{
  646. code:4,
  647. label:'星期四'
  648. },{
  649. code:5,
  650. label:'星期五'
  651. },{
  652. code:6,
  653. label:'星期六'
  654. },{
  655. code:0,
  656. label:'星期日'
  657. }],
  658. // 分页参数
  659. listQuery: {
  660. page: 1,
  661. pageNum: 10,
  662. },
  663. }
  664. },
  665. computed: {
  666. strColor(){
  667. if(!this.formData.font_color){
  668. return ['#FF9031']
  669. } else{
  670. return [this.formData.font_color]
  671. }
  672. },
  673. tableList() {
  674. // 分页的起始下标
  675. const startIndex = (this.listQuery.page - 1) * this.listQuery.pageNum;
  676. // 分页的末尾下标
  677. const endIndex = startIndex + this.listQuery.pageNum;
  678. // 返回切割后的数据
  679. return this.formData.store_list.slice(startIndex, endIndex);
  680. },
  681. // 总分页数
  682. total() {
  683. return Math.ceil(this.formData.store_list.length / this.listQuery.pageNum);
  684. },
  685. },
  686. created() {
  687. this.type = getQuery('id') ? "edit" : "add"
  688. this.id = getQuery('id')
  689. if(this.id){
  690. this.disabled = true
  691. let use_type = getQuery('use_type')
  692. this.detail()
  693. if(use_type==1){
  694. this.showCanClerkStore(this.id)
  695. }
  696. } else {
  697. let header_data = JSON.parse(localStorage.getItem("mall_header_data"));
  698. let mall_id = header_data.mall.id;
  699. let user_id = header_data.user.id;
  700. this.session_key = `${user_id}_${mall_id}_secondary_card`
  701. this.addView()
  702. }
  703. },
  704. methods: {
  705. dataURLtoFile(dataurl) { // 生成Blob
  706. var arr = dataurl.split(',');
  707. var mime = arr[0].match(/:(.*?);/)[1];
  708. var bstr = atob(arr[1]);
  709. var n = bstr.length;
  710. var u8arr = new Uint8Array(n);
  711. while (n--) {
  712. u8arr[n] = bstr.charCodeAt(n);
  713. }
  714. return new Blob([u8arr], {
  715. type: mime
  716. });
  717. },
  718. upload(file) {
  719. let formData = new FormData();
  720. const params = {
  721. upload_type: 'images'
  722. };
  723. params['r'] = 'common/file/upload';
  724. for (let i in this.fields) {
  725. formData.append(i, this.fields[i]);
  726. }
  727. formData.append('file', file, "image.png");
  728. return new Promise(successCallback => {
  729. this.$request({
  730. headers: {
  731. 'Content-Type': 'multipart/form-data'
  732. },
  733. params: params,
  734. method: 'post',
  735. data: formData,
  736. }).then(e => {
  737. successCallback(e.data)
  738. }).catch(e => {
  739. file._complete = true;
  740. });
  741. })
  742. },
  743. detail() {
  744. console.log('参数',this.id)
  745. // 详情
  746. this.loading = true
  747. request({
  748. params: {
  749. r: 'secondary-card/default/edit',
  750. id: this.id
  751. },
  752. method: 'get',
  753. }).then(res => {
  754. if(res.data.code == 0){
  755. if(!res.data.data) return
  756. this.updateView(res.data.data);
  757. } else {
  758. this.$message({
  759. message: res.data.msg,
  760. type: 'error'
  761. });
  762. }
  763. this.loading = false;
  764. }).finally(res => {
  765. this.loading = false
  766. })
  767. },
  768. addView(){
  769. let formDataStr = sessionStorage.getItem(this.session_key)
  770. if(formDataStr){
  771. let formData = JSON.parse(formDataStr);
  772. this.updateView(formData)
  773. }
  774. },
  775. updateView(item, index) {
  776. Object.keys(item).forEach(key=>{
  777. if(this.formData[key] !== undefined){
  778. this.formData.store_ids = this.formData.store_list.map(item=>item.id)
  779. if(key !=='store_list' && key !='store_ids'){
  780. this.formData[key]=item[key]
  781. }
  782. }
  783. })
  784. this.serviceModel.list = this.formData.service;
  785. if(Array.isArray(this.formData.reservation_time)){
  786. this.formData.temp_reservation_time = this.formatTime(this.formData.reservation_time,2)
  787. }
  788. if(this.formData.sell_time_start && this.formData.sell_time_end){
  789. this.sell_time_start_end = [this.formData.sell_time_start,this.formData.sell_time_end]
  790. }
  791. if(this.formData.begin_at && this.formData.end_at){
  792. this.begin_end_at = [this.formData.begin_at,this.formData.end_at]
  793. }
  794. if(this.formData.background_type ==1){
  795. this.background_diy = this.formData.background;
  796. }else {
  797. this.background_default = this.formData.background;
  798. }
  799. this.formData.name = this.formData.name+''
  800. this.formData.rule = this.formData.rule+''
  801. console.log('数据',this.formData.temp_reservation_time)
  802. },
  803. reservationTypeChange(){
  804. if(this.formData.reservation_type ==0) {
  805. this.checkAll = false;
  806. this.everyDay = false;
  807. this.dayCheckList = [];
  808. this.isIndeterminate = false;
  809. this.formData.temp_reservation_time = []
  810. }
  811. },
  812. beginEndAtChange(values){
  813. if(values){
  814. this.formData.begin_at = values[0]
  815. this.formData.end_at = values[1]
  816. } else {
  817. this.formData.begin_at = ''
  818. this.formData.end_at = ''
  819. }
  820. console.log('sss',values,this.formData)
  821. },
  822. backgroundTypeChange(value){
  823. console.log('值',value)
  824. if(value == 1){
  825. this.formData.background = this.background_diy?this.background_diy:''
  826. } else {
  827. this.formData.background = this.background_default
  828. }
  829. },
  830. backgroundChange(command){
  831. if(this.formData.background_type ==0){
  832. this.formData.background = this.defaultStyle[command].bg_url
  833. console.log('this.formData.background ',this.formData.background )
  834. this.background_default = this.formData.background;
  835. this.formData.font_color = this.defaultStyle[command].font_color
  836. }
  837. },
  838. coverPic(e) { // 选择图片
  839. this.formData.background = e[0].url
  840. this.background_diy = this.formData.background
  841. },
  842. delPic(){
  843. this.background_diy = null
  844. this.formData.background = this.background_diy;
  845. },
  846. updateColor(e){
  847. console.log('key',e[0].color)
  848. this.formData.font_color = e[0].color;
  849. this.colorInfos = e
  850. },
  851. serviceAdd(){
  852. this.serviceModel.list.push({
  853. service_title:'',
  854. service_subtitle:'',
  855. service_original_price:'',
  856. service_num:1
  857. })
  858. },
  859. serviceDel(index){
  860. if(this.serviceModel.list.length ==1){
  861. this.$message.error('最少需要保留一组服务项')
  862. return
  863. }
  864. this.serviceModel.list.splice(index,1)
  865. },
  866. handleCheckAllDaysChange(val){
  867. this.dayCheckList = val ? [1,2,3,4,5,6,0] : [];
  868. this.handleCheckedDaysChange(this.dayCheckList)
  869. this.isIndeterminate = false;
  870. },
  871. handleCheckedDaysChange(arr){
  872. let checkedCount = arr.length;
  873. this.everyDay = checkedCount === 7;
  874. this.isIndeterminate = checkedCount > 0 && checkedCount < 7;
  875. if(checkedCount ==0){
  876. this.formData.temp_reservation_time = []
  877. } else {
  878. let newList = [],all_start_end = '';
  879. if(this.formData.temp_reservation_time.length>0 && this.checkAll==true){
  880. all_start_end = this.formData.temp_reservation_time[0].time_start_end
  881. }
  882. arr.forEach(day=>{
  883. let result = this.formData.temp_reservation_time.find(item=>item.day ==day)
  884. let time_start_end = result ? result.time_start_end :all_start_end;
  885. newList.push({
  886. day,
  887. time_start_end:time_start_end
  888. })
  889. })
  890. this.formData.temp_reservation_time = newList;
  891. this.$refs['otherForm'].validateField('temp_reservation_time')
  892. }
  893. },
  894. setAllTime(){
  895. if(this.checkAll){
  896. this.formData.temp_reservation_time.forEach(item=>{
  897. item.time_start_end= this.formData.temp_reservation_time[0].time_start_end
  898. })
  899. }
  900. },
  901. formatData(){
  902. //格式化数据
  903. this.formData.service = this.serviceModel.list
  904. if(Array.isArray(this.formData.reservation_time)){
  905. this.formData.reservation_time = this.formatTime(this.formData.temp_reservation_time)
  906. }
  907. this.formData.store_ids = this.formData.store_list.map(item=>item.id)
  908. if(Array.isArray(this.sell_time_start_end)){
  909. this.formData.sell_time_start = this.sell_time_start_end[0]
  910. this.formData.sell_time_end = this.sell_time_start_end[1]
  911. }
  912. this.formData.name = this.formData.name+''
  913. this.formData.rule = this.formData.rule+''
  914. },
  915. validateForm(){
  916. this.formatData()
  917. let formList = [{
  918. formName:'basisForm',
  919. state:false
  920. },{
  921. formName:'priceForm',
  922. state:false
  923. },{
  924. formName:'serviceForm',
  925. state:false
  926. },{
  927. formName:'otherForm',
  928. state:false
  929. }]
  930. formList.forEach(item=>{
  931. this.$refs[item.formName].validate(valid => {
  932. if (valid) {
  933. item.state = true;
  934. }
  935. })
  936. })
  937. let result = formList.find(item=>item.state == false)
  938. console.log('result',result)
  939. if(result) this.$message.error('部分参数验证不通过')
  940. return result? false : true
  941. },
  942. submitForm() {
  943. if(this.validateForm()) {
  944. this.loading = true
  945. if(this.type == 'edit') {
  946. this.formData['id'] = this.id
  947. }
  948. let data = {
  949. form:JSON.stringify(this.formData)
  950. }
  951. console.log('请求参数',data)
  952. request({
  953. params: {
  954. r: 'secondary-card/default/edit',
  955. },
  956. method: 'post',
  957. data
  958. }).then(e => {
  959. if (e.data.code === 0) {
  960. if(this.type !== 'edit'){
  961. sessionStorage.removeItem(this.session_key)
  962. }
  963. this.$message.success(e.data.msg)
  964. navigateTo({
  965. r: 'secondary-card/default/index'
  966. })
  967. } else {
  968. this.$message.error(e.data.msg)
  969. }
  970. }).finally(res => {
  971. this.loading = false
  972. })
  973. }
  974. },
  975. cancel(){
  976. if(this.type !== 'edit'){
  977. this.formatData()
  978. let formDataStr = JSON.stringify(this.formData)
  979. sessionStorage.setItem(this.session_key, formDataStr);
  980. }
  981. navigateTo({
  982. r: 'secondary-card/default/index'
  983. })
  984. },
  985. //查看回显门店
  986. showCanClerkStore(secondary_card_id){
  987. this.secondary_card_id = secondary_card_id;
  988. var param = {
  989. r: 'secondary-card/default/can-clerk-store-list',
  990. page: this.page_clerk,
  991. id: secondary_card_id,
  992. limit: 10
  993. }
  994. request({
  995. params: param,
  996. }).then(e => {
  997. if (e.data.code === 0) {
  998. this.formData.store_list = e.data.data.list;
  999. this.formData.store_ids = this.formData.store_list.map(item=>item.id)
  1000. this.pageCountClerk = e.data.data.page_count;
  1001. this.currentPageClerk = e.data.data.pagination.current_page;
  1002. } else {
  1003. this.$message.error(e.data.msg);
  1004. }
  1005. }).catch(e => {
  1006. });
  1007. },
  1008. paginationClerkStore(currentPage) {
  1009. this.page_clerk = currentPage;
  1010. this.showCanClerkStore(this.id);
  1011. },
  1012. // 当前分页数(第几页)
  1013. handleCurrentChange(val) {
  1014. this.listQuery.page = val;
  1015. },
  1016. //表格相关操作
  1017. onChooseStore() {
  1018. this.isShowStore = true
  1019. this.loading = true
  1020. console.log('this.$refs',this.$refs)
  1021. request({
  1022. method: 'get',
  1023. params: {
  1024. r: 'secondary-card/default/store-list',
  1025. page: this.store_page,
  1026. limit: 10,
  1027. keyword:this.store_name,
  1028. store_type:'1'
  1029. },
  1030. }).then(e => {
  1031. this.loading = false
  1032. // this.$refs.storeTable.clearSelection()
  1033. if (e.data.code === 0) {
  1034. this.storeTableData = e.data.data.list;
  1035. this.store_pagination = e.data.data.pagination;
  1036. this.store_count = e.data.data.page_count;
  1037. } else {
  1038. this.$message({
  1039. message: e.data.msg,
  1040. type: 'error'
  1041. });
  1042. }
  1043. }).catch(e => {
  1044. this.loading = false
  1045. });
  1046. },
  1047. onSearchStore() {
  1048. this.store_page = 1
  1049. this.onChooseStore();
  1050. },
  1051. onChangeStorePage(page) {
  1052. this.store_page = page;
  1053. this.onChooseStore();
  1054. },
  1055. handleSelectionChange(val){
  1056. this.multipleSelection = val
  1057. },
  1058. deleteStore(index){
  1059. this.formData.store_list.splice(index, 1);
  1060. },
  1061. onSelectedStore(){
  1062. this.formData.store_list = this.multipleSelection;
  1063. this.isShowStore = false
  1064. },
  1065. onCancelStore(){
  1066. this.isShowStore = false
  1067. },
  1068. formatTime(list,type){
  1069. let new_list = []
  1070. if(type){
  1071. if(list){
  1072. list.forEach(item=>{
  1073. new_list.push({
  1074. day:item.day,
  1075. time_start_end:[item.time_start,item.time_end]
  1076. })
  1077. })
  1078. this.dayCheckList= new_list.map(item=>item.day)
  1079. }
  1080. } else {
  1081. list.forEach(item=>{
  1082. if(Array.isArray(item.time_start_end) && item.time_start_end.length>1){
  1083. new_list.push({
  1084. day:item.day,
  1085. time_start:item.time_start_end[0],
  1086. time_end:item.time_start_end[1]
  1087. })
  1088. }
  1089. })
  1090. }
  1091. return new_list
  1092. },
  1093. }
  1094. })
  1095. // 拦截页面卸载
  1096. /* window.onbeforeunload = function(e) {
  1097. var e = window.event || e;
  1098. e.returnValue = ("确定离开当前页面吗?");
  1099. } */
  1100. </script>
  1101. <style>
  1102. #app {
  1103. display: flex;
  1104. flex-direction: column;
  1105. min-width: 1250px;
  1106. }
  1107. .diy-contain {
  1108. flex: 1;
  1109. overflow: auto;
  1110. background: #F4F6F8;
  1111. justify-content: space-between;
  1112. }
  1113. .diy-func-list {
  1114. box-sizing: border-box;
  1115. width: 354px;
  1116. background: #FFFFFF;
  1117. border-radius: 0px;
  1118. }
  1119. .diy-preview {
  1120. background: #F4F6F8;
  1121. justify-content: space-around;
  1122. width: 467px;
  1123. }
  1124. .dsp-contain {
  1125. flex: 1;
  1126. }
  1127. .flex {
  1128. display: flex;
  1129. }
  1130. .flex-x-center {
  1131. display: flex;
  1132. justify-content: center;
  1133. }
  1134. .flex-y-center {
  1135. display: flex;
  1136. align-items: center;
  1137. }
  1138. .flex-x-y-center {
  1139. display: flex;
  1140. justify-content: center;
  1141. align-items: center;
  1142. }
  1143. .flex-y-top {
  1144. align-items: flex-start;
  1145. }
  1146. :root {
  1147. /* 主题色 */
  1148. --diy-theme: #F10009;
  1149. /* 主要字体颜色 */
  1150. --diy-color: #F10009;
  1151. }
  1152. .dsp-contain {
  1153. position: relative;
  1154. flex: 1 ;
  1155. height: 100%;
  1156. background: #FFFFFF;
  1157. }
  1158. .title {
  1159. font-size:16px;
  1160. font-weight: bold;
  1161. padding: 16px 0 0 16px;
  1162. }
  1163. .add-box {
  1164. padding: 16px 0 0 16px;
  1165. font-size:16px;
  1166. color: #1890FF;
  1167. }
  1168. .service-item+.service-item {
  1169. margin-top:10px;
  1170. }
  1171. .service-con {
  1172. margin:0 80px;
  1173. background: #F5F5F5;
  1174. justify-content: space-evenly;
  1175. }
  1176. .setting-item {
  1177. text-align: center;
  1178. padding: 0 16px 16px;
  1179. }
  1180. .dropdown-link {
  1181. width: 111px;
  1182. height: 40px;
  1183. border:1px solid #DCDFE6;
  1184. }
  1185. .dropdown-item+.dropdown-item {
  1186. padding-left: 0;
  1187. }
  1188. .card-upload {
  1189. width: 103px;
  1190. height: 103px;
  1191. line-height:103px
  1192. }
  1193. </style>