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. <el-tooltip class="item" effect="dark" content="限制反复预约,恶意占用资源" placement="top">
  311. <i class="el-icon-info"></i>
  312. </el-tooltip>
  313. </div>
  314. </div>
  315. </div>
  316. </el-form-item>
  317. </template>
  318. <el-form-item label="是否允许用户发起退款:" prop="refund_type" required>
  319. <el-radio-group v-model="formData.refund_type">
  320. <el-radio :label="0">未使用到期自动退
  321. <el-tooltip class="item" effect="dark" content="用户下单后,未使用到期自动退" placement="top">
  322. <i class="el-icon-info"></i>
  323. </el-tooltip>
  324. </el-radio>
  325. <el-radio :label="1">不允许退款
  326. <el-tooltip class="item" effect="dark" content="用户下单后,无法发起主动退款申请操作" placement="top">
  327. <i class="el-icon-info"></i>
  328. </el-tooltip>
  329. </el-radio>
  330. <el-radio :label="2">允许退款
  331. <el-tooltip class="item" effect="dark" content="卡过期或者已停卡时,允许申请退款。发起申请退款金额=剩余核销次数*(开卡实付金额÷总核销数)" placement="top">
  332. <i class="el-icon-info"></i>
  333. </el-tooltip>
  334. </el-radio>
  335. </el-radio-group>
  336. </el-form-item>
  337. <el-form-item label="每人限购次数:" prop="limit_type">
  338. <el-radio :label="0" v-model="formData.limit_type">不限开卡次数
  339. <el-tooltip class="item" effect="dark" content="用户可重复开卡,不限制领卡次数" placement="top">
  340. <i class="el-icon-info"></i>
  341. </el-tooltip>
  342. </el-radio>
  343. <div class="flex-y-center" style="margin-bottom: 10px">
  344. <el-radio style="margin-right: 0" :label="1" v-model="formData.limit_type"><span></span></el-radio>
  345. <span>有效期内限开卡次数</span>
  346. <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>
  347. <span>次</span>
  348. <el-tooltip class="item" effect="dark" content="领取次数仅统计用户领卡的次数,不统计商家发卡" placement="top">
  349. <i class="el-icon-info"></i>
  350. </el-tooltip>
  351. </div>
  352. </el-form-item>
  353. <el-form-item label="适用门店:" prop="use_type" required>
  354. <el-select v-model="formData.store_type" size="mini" placeholder="请选择" :disabled="disabled" style="width:100px;">
  355. <el-option
  356. label="O2O门店"
  357. :value="1">
  358. </el-option>
  359. </el-select>
  360. <el-radio-group v-model="formData.use_type">
  361. <el-radio :label="0" :disabled="disabled">全部门店</el-radio>
  362. <el-radio :label="1" :disabled="disabled">指定店铺</el-radio>
  363. </el-radio-group>
  364. <span class="tips-text" style="font-weight: normal; color:red">(提示:保存后无法修可核销门店)</span>
  365. </el-form-item>
  366. <el-form-item label="选择门店" prop="store_ids" required v-if="formData.use_type==1">
  367. <el-col :span="20">
  368. <el-button type="text" icon="el-icon-circle-plus" @click="onChooseStore" :disabled="disabled">选择门店</el-button>
  369. </el-col>
  370. <el-table v-if="formData.store_list.length" :data="id?formData.store_list:tableList" stripe size="small" style="width: 80%" >
  371. <el-table-column label="店铺名称" prop="store_name" align="center"></el-table-column>
  372. <el-table-column label="类型" ><template slot-scope="scope">O2O门店 </template></el-table-column>
  373. <el-table-column label="店长/联系方式" prop="shop_mobile" >
  374. <template slot-scope="scope">
  375. <span>{{scope.row.shop_owner}}</span>
  376. <span>{{scope.row.shop_mobile}}</span>
  377. </template>
  378. </el-table-column>
  379. <el-table-column label="操作" align="center">
  380. <template slot-scope="scope">
  381. <el-button type="text" size="small" :disabled="disabled"style="color:red" @click.native.prevent="deleteStore(scope.$index)">删除</el-button>
  382. </template>
  383. </el-table-column>
  384. </el-table>
  385. <el-row type="flex" class="page" style="margin-top:10px;">
  386. <el-pagination @current-change="paginationClerkStore" background layout="prev, pager, next" :page-count="pageCountClerk" v-if="id && formData.store_list.length"></el-pagination>
  387. <el-pagination
  388. background
  389. v-if="!id && formData.store_list.length"
  390. :hide-on-single-page="true"
  391. @current-change="handleCurrentChange"
  392. :current-page="listQuery.page"
  393. :page-size="listQuery.pageNum"
  394. layout="prev, pager, next"
  395. :total="formData.store_list.length">
  396. </el-pagination>
  397. </el-row>
  398. </el-form-item>
  399. <el-form-item label="服务方式" prop="reserve.service_type"
  400. v-if="formData.reservation_model==2">
  401. <el-radio v-model="formData.reservation_service_type" :label="2">到店服务</el-radio>
  402. <el-radio v-model="formData.reservation_service_type" :label="1">上门服务</el-radio>
  403. <el-radio v-model="formData.reservation_service_type" :label="3">到店服务/上门服务</el-radio>
  404. </el-form-item>
  405. <el-form-item label="使用规则:" prop="rule" required>
  406. <el-col :span="20">
  407. <el-input type="textarea" v-model="formData.rule" rows="10" placeholder="请输入使用条件范围及限制内容,避免产生纠纷!" ></el-input>
  408. </el-col>
  409. </el-form-item>
  410. </el-form>
  411. </div>
  412. <div class="flex-x-center" style="padding-bottom: 20px;">
  413. <el-button @click="cancel">取消</el-button>
  414. <el-button type="primary" @click="submitForm">提交</el-button>
  415. </div>
  416. </el-scrollbar>
  417. </transition>
  418. </div>
  419. <!-- 选择店铺 -->
  420. <el-dialog title="选择店铺" width="800px" :visible.sync="isShowStore" :close-on-click-modal="false">
  421. <div>
  422. <el-form :inline="true" size="small">
  423. <el-form-item label="店铺名称">
  424. <el-input clearable v-model="store_name" placeholder="请输入店铺名称进行搜索"></el-input>
  425. </el-form-item>
  426. <el-form-item label="">
  427. <el-button type="primary" size="small" @click="onSearchStore">搜索</el-button>
  428. </el-form-item>
  429. </el-form>
  430. <el-table :data="storeTableData" stripe size="small" style="width: 100%" row-key='id' ref="storeTable" @selection-change='handleSelectionChange'>
  431. <el-table-column type="selection" reserve-selection width="55"> </el-table-column>
  432. <el-table-column label="序号" prop="id" width="160" align="left">
  433. </el-table-column>
  434. <el-table-column label="店铺名称" prop="store_name" width="100" align="center"></el-table-column>
  435. <el-table-column label="店长/联系方式" prop="shop_mobile" width="150" >
  436. <template slot-scope="scope">
  437. <span>{{scope.row.shop_owner}}</span>
  438. <span>{{scope.row.shop_mobile}}</span>
  439. </template>
  440. </el-table-column>
  441. <el-table-column label="地址" prop="address" ></el-table-column>
  442. </el-table>
  443. <div style="padding: 15px 0">
  444. <el-pagination v-if="store_pagination" style="float: right;" background @current-change="onChangeStorePage"
  445. layout="prev, pager, next" :page-count="store_count">
  446. </el-pagination>
  447. <div style="clear: both"></div>
  448. </div>
  449. <div style="text-align: center; padding-bottom: 15px">
  450. <el-button type="primary" size="small" @click="onSelectedStore">确定</el-button>
  451. <el-button type="info" size="small" @click="onCancelStore">取消</el-button>
  452. </div>
  453. </div>
  454. </el-dialog>
  455. </div>
  456. <script src="<?= Yii::$app->request->baseUrl ?>/resources/unpkg/vuedraggable@2.18.1/dist/vuedraggable.umd.min.js"></script>
  457. <script>
  458. new Vue({
  459. el: '#app',
  460. data() {
  461. //自定义校验规则
  462. //背景图片
  463. let val_background_type = (rule, value, callback) => {
  464. console.log('value',value,this.background_diy)
  465. if (value === 1 && this.background_diy ==null) {
  466. callback(new Error('请上传自定义背景'));
  467. } else {
  468. callback();
  469. }
  470. };
  471. //次卡有效期类型
  472. let val_expire_type = (rule, value, callback) => {
  473. console.log('this.formData.end_at',value)
  474. if (value === 1 && this.formData.expire_day =='') {
  475. callback(new Error('请输入有效天数'));
  476. } else if (value === 2 && this.formData.begin_at =='') {
  477. callback(new Error('请选择有效期范围'));
  478. } else if (value === 2 && this.formData.sell_time_end) {
  479. let sell_time_end_seconds = (new Date(this.formData.sell_time_end)).getTime()
  480. console.log('this.formData.end_at',this.formData.end_at)
  481. let end_at_seconds = (new Date(this.formData.end_at +' 23:59:59')).getTime()
  482. if(end_at_seconds <= sell_time_end_seconds){
  483. callback(new Error('次卡有效期不能小于售卖时段'));
  484. }
  485. callback();
  486. } else {
  487. callback();
  488. }
  489. };
  490. // 预约限制
  491. // let val_reservation_limit_people = (rule, value, callback) => {
  492. // if (value === 1 && this.formData.expire_day =='') {
  493. // callback(new Error('请输入有效天数'));
  494. // } else if (value === 2 && this.formData.begin_at =='' ) {
  495. // callback(new Error('请选择有效期范围'));
  496. // } else {
  497. // callback();
  498. // }
  499. // };
  500. //
  501. return {
  502. static_img_prefix: '<?= Yii::getAlias('@attachurl') ?>'+'/static',
  503. loading:false,
  504. id:'',
  505. disabled:false,
  506. session_key:'',
  507. formData: {
  508. name: '',
  509. background_type:0,// '次卡背景类型,0:默认背景,1:自定义',
  510. font_color:'#FF9031',
  511. background:'/addons/SecondaryCard/background2.png',//次卡背景
  512. sell_time_start:'',//售卖开始时间
  513. sell_time_end:'',
  514. expire_type:1,//次卡有效期类型:1=购买时起N天内有效,2=指定有效期
  515. begin_at:'',
  516. end_at:'',
  517. expire_day:'',//有效天数 expire_type =1
  518. price:'',
  519. original_price:'',
  520. verifiable_times:'',
  521. max_times:'',//最大开卡数
  522. virtual_sales:'',//虚拟销量
  523. service:[],//卡服务设置
  524. reservation_type:0,// '是否需要预约,0:不需要,1:需要',
  525. reservation_model:1,//预约模式:1:预约门店;2:预约服务人
  526. reservation_service_type: 2,// 服务方式:1:上门服务;2:到店服务;3:上门/到店
  527. reservation_time:[],//可预约时间段
  528. appointment_interval_duration:0,
  529. reservation_cancel_type:1,
  530. reservation_cancel_hour:0,
  531. reservation_cancel_deduct:0,
  532. reservation_limit_people:0,
  533. reservation_limit_repeat:0,
  534. refund_type:0,// '退款类型,0:未使用到期自动退,1:不允许退款,2:允许退款',
  535. limit_type:0,//限购类型,0:不限开卡次数(用户可重复开卡,不限制领卡次数),1:有效期内限开卡次数'
  536. limit_times:'',//次数 领取次数仅统计用户领卡的次数,不统计商家发卡'
  537. store_type:1,//门店类型 1 o2o
  538. use_type:0,//使用范围 0:全部店铺 1:指定店铺
  539. store_ids:[],
  540. store_list:[],
  541. rule:'',//使用规则
  542. temp_reservation_time:[]// 预约时间,
  543. },
  544. sell_time_start_end:'',//售卖时段
  545. begin_end_at:'', //次卡有效期
  546. background_default:'/addons/SecondaryCard/background2.png',
  547. background_diy:null,
  548. everyDay:false,
  549. checkAll: false,
  550. isIndeterminate: false,
  551. dayCheckList:[],
  552. serviceModel:{ //服务项
  553. list:[
  554. {
  555. service_title:'',
  556. service_subtitle:'',
  557. service_original_price:'',
  558. service_num:1
  559. }
  560. ]
  561. },
  562. //门店表格相关
  563. isShowStore:false,
  564. storeTableData:[],
  565. store_name:'',
  566. store_page: 1,
  567. store_pagination: null,
  568. store_count: null,
  569. multipleSelection: [],
  570. rules: {
  571. name: [
  572. { required: true, message: '请输入次卡名称', trigger: 'blur' },
  573. { max: 15, message: '长度不能超过15个字', trigger: 'blur' }
  574. ],
  575. background_type: [
  576. { required: true, message: '请选择背景图', trigger: 'blur' },
  577. { validator: val_background_type, trigger: 'blur' }
  578. ],
  579. expire_type:[
  580. { required: true, message: '请输入次卡有效期', trigger: 'blur' },
  581. { validator: val_expire_type, trigger: 'blur' }
  582. ],
  583. price: [
  584. { required: true, message: '请输入售价', trigger: 'blur' }
  585. ],
  586. original_price: [
  587. { required: true, message: '请输入原价', trigger: 'blur' }
  588. ],
  589. verifiable_times: [
  590. { required: true, message: '请输入可核销数', trigger: 'blur' }
  591. ],
  592. max_times: [
  593. { required: true, message: '请输入库存', trigger: 'blur' }
  594. ],
  595. temp_reservation_time:[
  596. { type: 'array', required: true, message: '请至少选择一个可预约日期', trigger: 'change' }
  597. ],
  598. rule: [
  599. { required: true, message: '请输入使用规则', trigger: 'blur' }
  600. ],
  601. store_ids: [
  602. { required: true, message: '请选择门店', trigger: 'blur' }
  603. ],
  604. appointment_interval_duration:[
  605. { required: true, message: '请输入项目时长', trigger: 'blur' }
  606. ]
  607. },
  608. defaultStyle:{
  609. 'bg1':{
  610. bg_url:'/addons/SecondaryCard/background2.png',//黄色
  611. font_color:'#FF9031'
  612. },
  613. 'bg2':{
  614. bg_url:'/addons/SecondaryCard/background3.png',//黑色
  615. font_color:'#FFFFFF'
  616. },
  617. 'bg3':{
  618. bg_url:'/addons/SecondaryCard/background1.png',//蓝色
  619. font_color:'#4B83E0'
  620. },
  621. 'bg4':{
  622. bg_url:'/addons/SecondaryCard/background4.png',//粉色
  623. font_color:'#F65B66'
  624. }
  625. },
  626. weekListMate:{
  627. 1:'星期一',
  628. 2:'星期二',
  629. 3:'星期三',
  630. 4:'星期四',
  631. 5:'星期五',
  632. 6:'星期六',
  633. 0:'星期日',
  634. },
  635. weekList:[{
  636. code:1,
  637. label:'星期一'
  638. },{
  639. code:2,
  640. label:'星期二'
  641. },{
  642. code:3,
  643. label:'星期三'
  644. },{
  645. code:4,
  646. label:'星期四'
  647. },{
  648. code:5,
  649. label:'星期五'
  650. },{
  651. code:6,
  652. label:'星期六'
  653. },{
  654. code:0,
  655. label:'星期日'
  656. }],
  657. // 分页参数
  658. listQuery: {
  659. page: 1,
  660. pageNum: 10,
  661. },
  662. }
  663. },
  664. computed: {
  665. strColor(){
  666. if(!this.formData.font_color){
  667. return ['#FF9031']
  668. } else{
  669. return [this.formData.font_color]
  670. }
  671. },
  672. tableList() {
  673. // 分页的起始下标
  674. const startIndex = (this.listQuery.page - 1) * this.listQuery.pageNum;
  675. // 分页的末尾下标
  676. const endIndex = startIndex + this.listQuery.pageNum;
  677. // 返回切割后的数据
  678. return this.formData.store_list.slice(startIndex, endIndex);
  679. },
  680. // 总分页数
  681. total() {
  682. return Math.ceil(this.formData.store_list.length / this.listQuery.pageNum);
  683. },
  684. },
  685. created() {
  686. this.type = getQuery('id') ? "edit" : "add"
  687. this.id = getQuery('id')
  688. if(this.id){
  689. this.disabled = true
  690. let use_type = getQuery('use_type')
  691. this.detail()
  692. if(use_type==1){
  693. this.showCanClerkStore(this.id)
  694. }
  695. } else {
  696. let header_data = JSON.parse(localStorage.getItem("mall_header_data"));
  697. let mall_id = header_data.mall.id;
  698. let user_id = header_data.user.id;
  699. this.session_key = `${user_id}_${mall_id}_secondary_card`
  700. this.addView()
  701. }
  702. },
  703. methods: {
  704. dataURLtoFile(dataurl) { // 生成Blob
  705. var arr = dataurl.split(',');
  706. var mime = arr[0].match(/:(.*?);/)[1];
  707. var bstr = atob(arr[1]);
  708. var n = bstr.length;
  709. var u8arr = new Uint8Array(n);
  710. while (n--) {
  711. u8arr[n] = bstr.charCodeAt(n);
  712. }
  713. return new Blob([u8arr], {
  714. type: mime
  715. });
  716. },
  717. upload(file) {
  718. let formData = new FormData();
  719. const params = {
  720. upload_type: 'images'
  721. };
  722. params['r'] = 'common/file/upload';
  723. for (let i in this.fields) {
  724. formData.append(i, this.fields[i]);
  725. }
  726. formData.append('file', file, "image.png");
  727. return new Promise(successCallback => {
  728. this.$request({
  729. headers: {
  730. 'Content-Type': 'multipart/form-data'
  731. },
  732. params: params,
  733. method: 'post',
  734. data: formData,
  735. }).then(e => {
  736. successCallback(e.data)
  737. }).catch(e => {
  738. file._complete = true;
  739. });
  740. })
  741. },
  742. detail() {
  743. console.log('参数',this.id)
  744. // 详情
  745. this.loading = true
  746. request({
  747. params: {
  748. r: 'secondary-card/default/edit',
  749. id: this.id
  750. },
  751. method: 'get',
  752. }).then(res => {
  753. if(res.data.code == 0){
  754. if(!res.data.data) return
  755. this.updateView(res.data.data);
  756. } else {
  757. this.$message({
  758. message: res.data.msg,
  759. type: 'error'
  760. });
  761. }
  762. this.loading = false;
  763. }).finally(res => {
  764. this.loading = false
  765. })
  766. },
  767. addView(){
  768. let formDataStr = sessionStorage.getItem(this.session_key)
  769. if(formDataStr){
  770. let formData = JSON.parse(formDataStr);
  771. this.updateView(formData)
  772. }
  773. },
  774. updateView(item, index) {
  775. Object.keys(item).forEach(key=>{
  776. if(this.formData[key] !== undefined){
  777. this.formData.store_ids = this.formData.store_list.map(item=>item.id)
  778. if(key !=='store_list' && key !='store_ids'){
  779. this.formData[key]=item[key]
  780. }
  781. }
  782. })
  783. this.serviceModel.list = this.formData.service;
  784. if(Array.isArray(this.formData.reservation_time)){
  785. this.formData.temp_reservation_time = this.formatTime(this.formData.reservation_time,2)
  786. }
  787. if(this.formData.sell_time_start && this.formData.sell_time_end){
  788. this.sell_time_start_end = [this.formData.sell_time_start,this.formData.sell_time_end]
  789. }
  790. if(this.formData.begin_at && this.formData.end_at){
  791. this.begin_end_at = [this.formData.begin_at,this.formData.end_at]
  792. }
  793. if(this.formData.background_type ==1){
  794. this.background_diy = this.formData.background;
  795. }else {
  796. this.background_default = this.formData.background;
  797. }
  798. this.formData.name = this.formData.name+''
  799. this.formData.rule = this.formData.rule+''
  800. console.log('数据',this.formData.temp_reservation_time)
  801. },
  802. reservationTypeChange(){
  803. if(this.formData.reservation_type ==0) {
  804. this.checkAll = false;
  805. this.everyDay = false;
  806. this.dayCheckList = [];
  807. this.isIndeterminate = false;
  808. this.formData.temp_reservation_time = []
  809. }
  810. },
  811. beginEndAtChange(values){
  812. if(values){
  813. this.formData.begin_at = values[0]
  814. this.formData.end_at = values[1]
  815. } else {
  816. this.formData.begin_at = ''
  817. this.formData.end_at = ''
  818. }
  819. console.log('sss',values,this.formData)
  820. },
  821. backgroundTypeChange(value){
  822. console.log('值',value)
  823. if(value == 1){
  824. this.formData.background = this.background_diy?this.background_diy:''
  825. } else {
  826. this.formData.background = this.background_default
  827. }
  828. },
  829. backgroundChange(command){
  830. if(this.formData.background_type ==0){
  831. this.formData.background = this.defaultStyle[command].bg_url
  832. console.log('this.formData.background ',this.formData.background )
  833. this.background_default = this.formData.background;
  834. this.formData.font_color = this.defaultStyle[command].font_color
  835. }
  836. },
  837. coverPic(e) { // 选择图片
  838. this.formData.background = e[0].url
  839. this.background_diy = this.formData.background
  840. },
  841. delPic(){
  842. this.background_diy = null
  843. this.formData.background = this.background_diy;
  844. },
  845. updateColor(e){
  846. console.log('key',e[0].color)
  847. this.formData.font_color = e[0].color;
  848. this.colorInfos = e
  849. },
  850. serviceAdd(){
  851. this.serviceModel.list.push({
  852. service_title:'',
  853. service_subtitle:'',
  854. service_original_price:'',
  855. service_num:1
  856. })
  857. },
  858. serviceDel(index){
  859. if(this.serviceModel.list.length ==1){
  860. this.$message.error('最少需要保留一组服务项')
  861. return
  862. }
  863. this.serviceModel.list.splice(index,1)
  864. },
  865. handleCheckAllDaysChange(val){
  866. this.dayCheckList = val ? [1,2,3,4,5,6,0] : [];
  867. this.handleCheckedDaysChange(this.dayCheckList)
  868. this.isIndeterminate = false;
  869. },
  870. handleCheckedDaysChange(arr){
  871. let checkedCount = arr.length;
  872. this.everyDay = checkedCount === 7;
  873. this.isIndeterminate = checkedCount > 0 && checkedCount < 7;
  874. if(checkedCount ==0){
  875. this.formData.temp_reservation_time = []
  876. } else {
  877. let newList = [],all_start_end = '';
  878. if(this.formData.temp_reservation_time.length>0 && this.checkAll==true){
  879. all_start_end = this.formData.temp_reservation_time[0].time_start_end
  880. }
  881. arr.forEach(day=>{
  882. let result = this.formData.temp_reservation_time.find(item=>item.day ==day)
  883. let time_start_end = result ? result.time_start_end :all_start_end;
  884. newList.push({
  885. day,
  886. time_start_end:time_start_end
  887. })
  888. })
  889. this.formData.temp_reservation_time = newList;
  890. this.$refs['otherForm'].validateField('temp_reservation_time')
  891. }
  892. },
  893. setAllTime(){
  894. if(this.checkAll){
  895. this.formData.temp_reservation_time.forEach(item=>{
  896. item.time_start_end= this.formData.temp_reservation_time[0].time_start_end
  897. })
  898. }
  899. },
  900. formatData(){
  901. //格式化数据
  902. this.formData.service = this.serviceModel.list
  903. if(Array.isArray(this.formData.reservation_time)){
  904. this.formData.reservation_time = this.formatTime(this.formData.temp_reservation_time)
  905. }
  906. this.formData.store_ids = this.formData.store_list.map(item=>item.id)
  907. if(Array.isArray(this.sell_time_start_end)){
  908. this.formData.sell_time_start = this.sell_time_start_end[0]
  909. this.formData.sell_time_end = this.sell_time_start_end[1]
  910. }
  911. this.formData.name = this.formData.name+''
  912. this.formData.rule = this.formData.rule+''
  913. },
  914. validateForm(){
  915. this.formatData()
  916. let formList = [{
  917. formName:'basisForm',
  918. state:false
  919. },{
  920. formName:'priceForm',
  921. state:false
  922. },{
  923. formName:'serviceForm',
  924. state:false
  925. },{
  926. formName:'otherForm',
  927. state:false
  928. }]
  929. formList.forEach(item=>{
  930. this.$refs[item.formName].validate(valid => {
  931. if (valid) {
  932. item.state = true;
  933. }
  934. })
  935. })
  936. let result = formList.find(item=>item.state == false)
  937. console.log('result',result)
  938. if(result) this.$message.error('部分参数验证不通过')
  939. return result? false : true
  940. },
  941. submitForm() {
  942. if(this.validateForm()) {
  943. this.loading = true
  944. if(this.type == 'edit') {
  945. this.formData['id'] = this.id
  946. }
  947. let data = {
  948. form:JSON.stringify(this.formData)
  949. }
  950. console.log('请求参数',data)
  951. request({
  952. params: {
  953. r: 'secondary-card/default/edit',
  954. },
  955. method: 'post',
  956. data
  957. }).then(e => {
  958. if (e.data.code === 0) {
  959. if(this.type !== 'edit'){
  960. sessionStorage.removeItem(this.session_key)
  961. }
  962. this.$message.success(e.data.msg)
  963. navigateTo({
  964. r: 'secondary-card/default/index'
  965. })
  966. } else {
  967. this.$message.error(e.data.msg)
  968. }
  969. }).finally(res => {
  970. this.loading = false
  971. })
  972. }
  973. },
  974. cancel(){
  975. if(this.type !== 'edit'){
  976. this.formatData()
  977. let formDataStr = JSON.stringify(this.formData)
  978. sessionStorage.setItem(this.session_key, formDataStr);
  979. }
  980. navigateTo({
  981. r: 'secondary-card/default/index'
  982. })
  983. },
  984. //查看回显门店
  985. showCanClerkStore(secondary_card_id){
  986. this.secondary_card_id = secondary_card_id;
  987. var param = {
  988. r: 'secondary-card/default/can-clerk-store-list',
  989. page: this.page_clerk,
  990. id: secondary_card_id,
  991. limit: 10
  992. }
  993. request({
  994. params: param,
  995. }).then(e => {
  996. if (e.data.code === 0) {
  997. this.formData.store_list = e.data.data.list;
  998. this.formData.store_ids = this.formData.store_list.map(item=>item.id)
  999. this.pageCountClerk = e.data.data.page_count;
  1000. this.currentPageClerk = e.data.data.pagination.current_page;
  1001. } else {
  1002. this.$message.error(e.data.msg);
  1003. }
  1004. }).catch(e => {
  1005. });
  1006. },
  1007. paginationClerkStore(currentPage) {
  1008. this.page_clerk = currentPage;
  1009. this.showCanClerkStore(this.id);
  1010. },
  1011. // 当前分页数(第几页)
  1012. handleCurrentChange(val) {
  1013. this.listQuery.page = val;
  1014. },
  1015. //表格相关操作
  1016. onChooseStore() {
  1017. this.isShowStore = true
  1018. this.loading = true
  1019. console.log('this.$refs',this.$refs)
  1020. request({
  1021. method: 'get',
  1022. params: {
  1023. r: 'secondary-card/default/store-list',
  1024. page: this.store_page,
  1025. limit: 10,
  1026. keyword:this.store_name,
  1027. store_type:'1'
  1028. },
  1029. }).then(e => {
  1030. this.loading = false
  1031. // this.$refs.storeTable.clearSelection()
  1032. if (e.data.code === 0) {
  1033. this.storeTableData = e.data.data.list;
  1034. this.store_pagination = e.data.data.pagination;
  1035. this.store_count = e.data.data.page_count;
  1036. } else {
  1037. this.$message({
  1038. message: e.data.msg,
  1039. type: 'error'
  1040. });
  1041. }
  1042. }).catch(e => {
  1043. this.loading = false
  1044. });
  1045. },
  1046. onSearchStore() {
  1047. this.store_page = 1
  1048. this.onChooseStore();
  1049. },
  1050. onChangeStorePage(page) {
  1051. this.store_page = page;
  1052. this.onChooseStore();
  1053. },
  1054. handleSelectionChange(val){
  1055. this.multipleSelection = val
  1056. },
  1057. deleteStore(index){
  1058. this.formData.store_list.splice(index, 1);
  1059. },
  1060. onSelectedStore(){
  1061. this.formData.store_list = this.multipleSelection;
  1062. this.isShowStore = false
  1063. },
  1064. onCancelStore(){
  1065. this.isShowStore = false
  1066. },
  1067. formatTime(list,type){
  1068. let new_list = []
  1069. if(type){
  1070. if(list){
  1071. list.forEach(item=>{
  1072. new_list.push({
  1073. day:item.day,
  1074. time_start_end:[item.time_start,item.time_end]
  1075. })
  1076. })
  1077. this.dayCheckList= new_list.map(item=>item.day)
  1078. }
  1079. } else {
  1080. list.forEach(item=>{
  1081. if(Array.isArray(item.time_start_end) && item.time_start_end.length>1){
  1082. new_list.push({
  1083. day:item.day,
  1084. time_start:item.time_start_end[0],
  1085. time_end:item.time_start_end[1]
  1086. })
  1087. }
  1088. })
  1089. }
  1090. return new_list
  1091. },
  1092. }
  1093. })
  1094. // 拦截页面卸载
  1095. /* window.onbeforeunload = function(e) {
  1096. var e = window.event || e;
  1097. e.returnValue = ("确定离开当前页面吗?");
  1098. } */
  1099. </script>
  1100. <style>
  1101. #app {
  1102. display: flex;
  1103. flex-direction: column;
  1104. min-width: 1250px;
  1105. }
  1106. .diy-contain {
  1107. flex: 1;
  1108. overflow: auto;
  1109. background: #F4F6F8;
  1110. justify-content: space-between;
  1111. }
  1112. .diy-func-list {
  1113. box-sizing: border-box;
  1114. width: 354px;
  1115. background: #FFFFFF;
  1116. border-radius: 0px;
  1117. }
  1118. .diy-preview {
  1119. background: #F4F6F8;
  1120. justify-content: space-around;
  1121. width: 467px;
  1122. }
  1123. .dsp-contain {
  1124. flex: 1;
  1125. }
  1126. .flex {
  1127. display: flex;
  1128. }
  1129. .flex-x-center {
  1130. display: flex;
  1131. justify-content: center;
  1132. }
  1133. .flex-y-center {
  1134. display: flex;
  1135. align-items: center;
  1136. }
  1137. .flex-x-y-center {
  1138. display: flex;
  1139. justify-content: center;
  1140. align-items: center;
  1141. }
  1142. .flex-y-top {
  1143. align-items: flex-start;
  1144. }
  1145. :root {
  1146. /* 主题色 */
  1147. --diy-theme: #F10009;
  1148. /* 主要字体颜色 */
  1149. --diy-color: #F10009;
  1150. }
  1151. .dsp-contain {
  1152. position: relative;
  1153. flex: 1 ;
  1154. height: 100%;
  1155. background: #FFFFFF;
  1156. }
  1157. .title {
  1158. font-size:16px;
  1159. font-weight: bold;
  1160. padding: 16px 0 0 16px;
  1161. }
  1162. .add-box {
  1163. padding: 16px 0 0 16px;
  1164. font-size:16px;
  1165. color: #1890FF;
  1166. }
  1167. .service-item+.service-item {
  1168. margin-top:10px;
  1169. }
  1170. .service-con {
  1171. margin:0 80px;
  1172. background: #F5F5F5;
  1173. justify-content: space-evenly;
  1174. }
  1175. .setting-item {
  1176. text-align: center;
  1177. padding: 0 16px 16px;
  1178. }
  1179. .dropdown-link {
  1180. width: 111px;
  1181. height: 40px;
  1182. border:1px solid #DCDFE6;
  1183. }
  1184. .dropdown-item+.dropdown-item {
  1185. padding-left: 0;
  1186. }
  1187. .card-upload {
  1188. width: 103px;
  1189. height: 103px;
  1190. line-height:103px
  1191. }
  1192. </style>