screenSet.vue 42 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229
  1. <template>
  2. <div class="all-box">
  3. <div class="all" style="padding: 20px;">
  4. <div class="flex-box-ce" style="padding: 30px 10px;">
  5. <div class="flex-1">
  6. <div style="font-size: 24px;font-weight: 700;margin-bottom: 5px;">数据大屏
  7. <el-popover
  8. placement="bottom-start"
  9. title="使用须知"
  10. width="500"
  11. trigger="hover"
  12. content="这是一段内容,这是一段内容,这是一段内容,这是一段内容。">
  13. <div>
  14. <div style="padding: 10px 0;font-weight: 700;">如何显示大屏数据:</div>
  15. <p>1.会议平板访问:在平板中输入大屏访问链接,密码验证后可直接访问</p>
  16. <p>2.电脑投屏到其他设备:在电脑的浏览器上访问链接,投屏到大屏设备中</p>
  17. <div style="padding: 10px 0;font-weight: 700">其他须知:</div>
  18. <p>1.创建大屏名称和备注可用于区分不同区域或场景下的大屏,最多创建10个大屏</p>
  19. <p>2.每个大屏仅支持3个窗口同时访问,每打开一个窗口都会占用访问数,请避免打开多余窗口</p>
  20. <p>3.链接复制到其他设备,请用浏览器输入并打开访问链接,首次进入需输入密码</p>
  21. <p>4.更换设置可直接操作保存,更换后刷新页面或稍候5分钟即可</p>
  22. <p>5.如需切换其他大屏,请点击大屏右上角退出登录,重新输入其他大屏的密码即可</p>
  23. <p>6.分享链接的密码重置后,对应的大屏需重新输入密码验证</p>
  24. <p>7.本机上每次打开链接都需要密码</p>
  25. </div>
  26. <span style="font-size:12px;cursor: pointer;" class="blue" slot="reference">使用须知</span>
  27. </el-popover>
  28. </div>
  29. <div style="font-size: 14px;" class="fontColorB">积分可视化数据大屏,直观展现积分排名、积分快讯、运作情况,支持电脑投屏、会议平板直接访问。</div>
  30. </div>
  31. <el-button type="primary" @click="isPz = true" :disabled="list.length==10">
  32. 创建数据大屏
  33. <i class="el-icon-setting el-icon--right"></i>
  34. </el-button>
  35. </div>
  36. <el-alert title="最多创建10个大屏链接,每个链接仅支持3个窗口同时在线访问,超出后无法获取数据" type="warning"></el-alert>
  37. <el-table ref="multipleTable" :data="list" tooltip-effect="dark" align="center" v-loading="loading">
  38. <el-table-column label="大屏名称" prop="name"></el-table-column>
  39. <el-table-column label="备注" min-width="300" prop="remark"></el-table-column>
  40. <el-table-column label="操作">
  41. <template slot-scope="scope">
  42. <div class="flex-box-ce">
  43. <div @click.stop="openSet(scope.row)" style="margin-right: 10px;"><span class="lookQrcode blue">设置</span></div>
  44. <!-- <div @click.stop="preview(scope.row,1)" style="margin-right: 10px;"><span class="lookQrcode green">预览</span></div> -->
  45. <div @click.stop="preview(scope.row,2)" style="margin-right: 10px;"><span class="lookQrcode green">访问大屏</span></div>
  46. <div @click.stop="compile(scope.row)" style="margin-right: 10px;"><span class="lookQrcode">编辑</span></div>
  47. <div @click.stop="deleteSet(scope.row)"><span class="lookQrcode red">删除</span></div>
  48. </div>
  49. </template>
  50. </el-table-column>
  51. <template slot="empty">
  52. <noData :isSolt="true">
  53. <div>
  54. 您当前没有数据大屏配置,去添加
  55. <span style="cursor: pointer;margin-left: 10px;" @click="isPz = true" class="blue">添加</span>
  56. </div>
  57. </noData>
  58. </template>
  59. </el-table>
  60. </div>
  61. <el-dialog :title="isCompile? '编辑数据大屏':'创建数据大屏'" :visible.sync="isPz" width="500px" class="dialog">
  62. <el-form label-width="80px" :model="formData" ref="setForm" class="form">
  63. <el-form-item
  64. label="名称"
  65. prop="name"
  66. :rules="[{ required: true, message: '请输入名称', trigger: 'blur' }, { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' }]"
  67. >
  68. <el-input maxlength="20" show-word-limit v-model="formData.name" placeholder="请输入名称"></el-input>
  69. </el-form-item>
  70. <el-form-item
  71. label="备注"
  72. prop="remark"
  73. :rules="[{ required: true, message: '请输入备注', trigger: 'blur' }, { min: 2, max: 100, message: '长度在 2 到 100 个字符', trigger: 'blur' }]"
  74. >
  75. <el-input type="textarea" placeholder="请输入备注" :rows="4" maxlength="100" show-word-limit v-model="formData.remark"></el-input>
  76. </el-form-item>
  77. </el-form>
  78. <div class="flex-box-end">
  79. <el-button @click="isPz = false">取消</el-button>
  80. <el-button type="primary" :loading="setLoading" :disabled="setLoading" @click="saveFirst('setForm')">确定</el-button>
  81. </div>
  82. </el-dialog>
  83. <el-dialog title="打开方式" :visible.sync="isPreview" width="500px" class="dialog">
  84. <div>
  85. <div style="margin-bottom: 20px;">{{selectItem.name}}</div>
  86. <div>打开方式1:扫码登录(新)</div>
  87. <div class="flex-box-ce" style="margin: 10px 0;">
  88. <el-input style="width: 300px;" v-model="previewUrl2" disabled placeholder="链接"></el-input>
  89. <div class="blue" style="padding-left: 10px;cursor: pointer;" @click="copy('3')">复制大屏链接</div>
  90. </div>
  91. <div style="font-size: 12px;position: relative;top: -10px;" class="orange">扫码方式适用于触摸屏和投屏场景,不支持手动输入链接地址及纯遥控选择操作,请根据设备条件选择打开方式</div>
  92. <div style="margin-top: 30px;">打开方式2:密码登录(旧)</div>
  93. <div class="flex-box-ce" style="margin: 10px 0;">
  94. <el-input style="width: 300px;" v-model="previewUrl" disabled placeholder="链接"></el-input>
  95. <div class="blue" style="padding-left: 10px;cursor: pointer;" @click="copy('1')">复制大屏链接</div>
  96. </div>
  97. <div class="flex-box-ce">
  98. <el-input style="width: 300px;" v-model="code" placeholder="随机密码" disabled>
  99. <el-button slot="append" @click="refresh">刷新</el-button>
  100. </el-input>
  101. <div class="blue" style="padding-left: 10px;cursor: pointer;" @click="copy('2')">复制密码</div>
  102. </div>
  103. <div class="orange" style="font-size: 12px;margin-bottom: 10px;">刷新后原有的密码将失效</div>
  104. <!-- <div class="orange">每个链接仅支持3个窗口同时在线访问,超出后无法获取数据</div> -->
  105. </div>
  106. <div class="flex-box-end" style="margin: 10px 0;">
  107. <!-- <el-button @click="preview({},1)" type="primary" plain>打开大屏</el-button> -->
  108. <div class="flex-1"></div>
  109. <el-button @click="isPreview = false" type="">关 闭</el-button>
  110. </div>
  111. </el-dialog>
  112. <el-dialog :title="'设置('+selectItem.name+')'" :visible.sync="dialogVisible" width="1000px" class="dialog">
  113. <div class="flex-box">
  114. <div class="flex-4" style="padding-top: 50px;">
  115. <div style="color: #222;font-weight: 700;font-size: 16px;padding-left: 8px;">点击下面模块,快速定位到设置项
  116. <el-popover placement="bottom-start" title="示例" width="500" trigger="hover">
  117. <div><img src="@/assets/image/321.jpg" style="width: 100%;"/></div>
  118. <span style="font-size:14px;cursor: pointer;" class="blue" slot="reference">示例</span>
  119. </el-popover>
  120. </div>
  121. <div class="flex-box-ce">
  122. <div class="flex-1">
  123. <div class="border1" @click="activeQie('2')" :class="activeBor == '2' ? 'activeBor' : ''" style="height: 40px;line-height: 40px;">组织名称和logo设置</div>
  124. <div class="border1" @click="activeQie('3')" :class="activeBor == '3' ? 'activeBor' : ''" style="height: 300px;line-height: 300px;">排行榜设置</div>
  125. </div>
  126. <div class="flex-1">
  127. <div class="border1" @click="activeQie('1')" :class="activeBor == '1' ? 'activeBor' : ''" style="height: 40px;line-height: 40px;">标题设置</div>
  128. <div class="border1" @click="activeQie('4')" :class="activeBor == '4' ? 'activeBor' : ''" style="height: 80px;line-height: 80px;">今日积分数据设置</div>
  129. <div class="border1" @click="activeQie('5')" :class="activeBor == '5' ? 'activeBor' : ''" style="height: 212px;line-height: 212px;">活跃度设置</div>
  130. </div>
  131. <div class="flex-1">
  132. <div class="" style="height: 44px;"></div>
  133. <div class="border1" @click="activeQie('6')" :class="activeBor == '6' ? 'activeBor' : ''" style="height: 300px;line-height: 300px;">积分快讯设置</div>
  134. </div>
  135. </div>
  136. </div>
  137. <div class="flex-3 scroll-bar" id="scroll" style="height: 500px;overflow-y: scroll;margin-left: 10px;" @scroll="myFunction">
  138. <el-form label-width="80px" :model="config" ref="setForm" class="form">
  139. <div class="kuai">
  140. <div class="formTitle">标题设置</div>
  141. <div class="formBox">
  142. <el-form-item label="标题名称">
  143. <el-input class="width250" maxlength="10" show-word-limit v-model.trim="config.title" placeholder="请输入名称"></el-input>
  144. </el-form-item>
  145. </div>
  146. </div>
  147. <div class="kuai">
  148. <div class="formTitle">组织名称和logo设置</div>
  149. <div class="formBox">
  150. <el-form-item label="组织名称">
  151. <el-input class="width250" maxlength="10" show-word-limit v-model.trim="config.company.name" placeholder="请输入名称"></el-input>
  152. </el-form-item>
  153. <el-form-item label="logo">
  154. <upload
  155. :headers="Xtoken"
  156. class="avatar-uploader"
  157. action="https://integralsys.oss-cn-shenzhen.aliyuncs.com"
  158. :show-file-list="false"
  159. :multiple="false"
  160. :limit="100"
  161. accept="image/jpeg,image/png"
  162. :on-success="handleFilesSuccess"
  163. :before-upload="beforeUpload"
  164. >
  165. <img v-if="config.company.logo" :src="config.company.logo" class="avatar" />
  166. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  167. </upload>
  168. <div class="orange" style="font-size: 12px;">比例为1:1,最大不超过5M</div>
  169. </el-form-item>
  170. </div>
  171. </div>
  172. <div class="kuai">
  173. <div class="formTitle">排行榜设置</div>
  174. <div class="formBox">
  175. <el-form-item style="margin-bottom: 30px;">
  176. <el-radio-group v-model="config.ranking_type">
  177. <el-radio label="ranking">阶段排名</el-radio>
  178. <el-radio label="ranking_total">累计排名</el-radio>
  179. </el-radio-group>
  180. <div style="position: absolute;z-index: 999;left: 0px;top: 30px;font-size: 12px;line-height: 14px;" class="fontColorC">
  181. <span v-if="config.ranking_type=='ranking'">阶段排名仅统计时间区间内的积分数据<br/>不包含基础分和工龄分</span>
  182. <span v-else>累计B分排名即员工从入职至今的所有B分总计<br/>包含基础分和工龄分</span>
  183. </div>
  184. </el-form-item>
  185. <div style="min-height: 362px;">
  186. <template v-if="config.ranking_type=='ranking'">
  187. <el-form-item label="名称">
  188. <el-input class="width250" maxlength="10" show-word-limit v-model.trim="config.ranking.name" placeholder="请输入名称"></el-input>
  189. </el-form-item>
  190. <el-form-item label="时间">
  191. <el-select class="width250" v-model="config.ranking.condition.date" placeholder="请选择积分类型">
  192. <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option>
  193. </el-select>
  194. <el-date-picker
  195. class="width250"
  196. v-if="config.ranking.condition.date == 1"
  197. v-model="config.ranking.condition.time"
  198. type="daterange"
  199. value-format="timestamp"
  200. @change="setTime"
  201. :clearable="false"
  202. range-separator="至"
  203. start-placeholder="开始日期"
  204. end-placeholder="结束日期"
  205. ></el-date-picker>
  206. </el-form-item>
  207. <el-form-item label="部门">
  208. <template slot="label">
  209. <el-tooltip effect="dark" placement="top">
  210. <template slot="content">
  211. 选择部门默认包含子部门
  212. </template>
  213. <span>部门 <i class="el-icon-warning"></i></span>
  214. </el-tooltip>
  215. </template>
  216. <el-cascader
  217. v-model="config.ranking.condition.deptArr"
  218. :options="dept_tree"
  219. :props="{checkStrictly: true, multiple : true, value: 'id', label: 'name', children: '_child' }"
  220. class="width250"
  221. ref="dept1"
  222. filterable
  223. collapse-tags
  224. placeholder="全公司"
  225. clearable
  226. ></el-cascader>
  227. </el-form-item>
  228. <el-form-item label="人员">
  229. <el-select class="width250" v-model="config.ranking.condition.position" placeholder="请选择人员范围">
  230. <el-option v-for="item in roleOptions" :key="item.value" :label="item.label" :value="item.value"></el-option>
  231. </el-select>
  232. </el-form-item>
  233. <el-form-item label="类型">
  234. <el-select class="width250" v-model="config.ranking.condition.point_id" placeholder="请选择积分类型">
  235. <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value" v-if="item.value != 1"></el-option>
  236. </el-select>
  237. </el-form-item>
  238. <el-form-item label="排除">
  239. <el-input class="width250" auto-complete="off" v-model="config.ranking.condition.employeeName" placeholder="请选择排除对象"></el-input>
  240. <div @click="noPersonnelListTips" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
  241. </el-form-item>
  242. </template>
  243. <template v-else>
  244. <el-form-item label="名称">
  245. <el-input class="width250" maxlength="10" show-word-limit v-model.trim="config.ranking_total.name" placeholder="请输入名称"></el-input>
  246. </el-form-item>
  247. <el-form-item label="部门">
  248. <template slot="label">
  249. <el-tooltip effect="dark" placement="top">
  250. <template slot="content">
  251. 选择部门默认包含子部门
  252. </template>
  253. <span>部门 <i class="el-icon-warning"></i></span>
  254. </el-tooltip>
  255. </template>
  256. <el-cascader
  257. v-model="config.ranking_total.condition.deptArr"
  258. :options="dept_tree"
  259. :props="{checkStrictly: true, multiple : true, value: 'id', label: 'name', children: '_child' }"
  260. class="width250"
  261. ref="dept6"
  262. filterable
  263. collapse-tags
  264. placeholder="全公司"
  265. clearable
  266. ></el-cascader>
  267. </el-form-item>
  268. </template>
  269. </div>
  270. </div>
  271. </div>
  272. <div class="kuai">
  273. <div class="formTitle">今日积分数据设置</div>
  274. <div class="formBox">
  275. <el-form-item label="部门">
  276. <template slot="label">
  277. <el-tooltip effect="dark" placement="top">
  278. <template slot="content">
  279. 选择部门默认包含子部门
  280. </template>
  281. <span>部门 <i class="el-icon-warning"></i></span>
  282. </el-tooltip>
  283. </template>
  284. <el-cascader
  285. v-model="config.center.deptArr"
  286. :options="dept_tree"
  287. :props="{checkStrictly: true, multiple : true, value: 'id', label: 'name', children: '_child' }"
  288. ref="dept2"
  289. class="width250"
  290. filterable
  291. collapse-tags
  292. placeholder="全公司"
  293. clearable
  294. ></el-cascader>
  295. </el-form-item>
  296. </div>
  297. </div>
  298. <div class="kuai">
  299. <div class="formTitle">活跃度设置
  300. <el-tooltip effect="dark" placement="top">
  301. <template slot="content">
  302. 获得积分人员占比=获得积分的人数/参与积分的总人数</br>
  303. 执行奖扣管理人员占比=有执行奖扣的人/总管理者人数</br>
  304. 基准标尺为执行下限,要求活跃度在标尺之上执行才算执行到位
  305. </template>
  306. <i class="el-icon-warning"></i>
  307. </el-tooltip>
  308. </div>
  309. <div class="formBox">
  310. <el-form-item label="部门">
  311. <template slot="label">
  312. <el-tooltip effect="dark" placement="top">
  313. <template slot="content">
  314. 选择部门默认包含子部门
  315. </template>
  316. <span>部门 <i class="el-icon-warning"></i></span>
  317. </el-tooltip>
  318. </template>
  319. <el-cascader
  320. v-model="config.active.deptArr"
  321. :options="dept_tree"
  322. :props="{checkStrictly: true, multiple : true, value: 'id', label: 'name', children: '_child' }"
  323. ref="dept3"
  324. class="width250"
  325. filterable
  326. collapse-tags
  327. placeholder="全公司"
  328. clearable
  329. ></el-cascader>
  330. </el-form-item>
  331. <el-form-item label="时间范围">
  332. <el-select class="width250" v-model="config.active.type" placeholder="请选择时间范围">
  333. <el-option key="1" label="近三天" :value="1"></el-option>
  334. <el-option key="2" label="近三周" :value="2"></el-option>
  335. </el-select>
  336. </el-form-item>
  337. <el-form-item label="标尺">
  338. <el-input class="width250" @input="config.active.base_ratio=config.active.base_ratio.replace(/^(0+)|[^\d]+/g,'')" v-model="config.active.base_ratio" placeholder="请输入标尺">
  339. <template slot="append">
  340. %
  341. </template>
  342. </el-input>
  343. </el-form-item>
  344. </div>
  345. </div>
  346. <div class="kuai">
  347. <div class="formTitle">积分快讯设置</div>
  348. <div class="formBox">
  349. <div style="color: #333;font-weight: 700;margin-bottom: 10px;">显示最新产生的100条积分事件</div>
  350. <el-form-item label="名称">
  351. <el-input class="width250" maxlength="10" show-word-limit v-model.trim="config.event.name" placeholder="请输入名称"></el-input>
  352. </el-form-item>
  353. <el-form-item label="来源">
  354. <el-select class="width250" multiple v-model="config.event.source_type" placeholder="全部">
  355. <el-option v-for="item in sourceOptions" :key="item.value" :label="item.label" :value="item.value"></el-option>
  356. </el-select>
  357. </el-form-item>
  358. <el-form-item label="部门">
  359. <template slot="label">
  360. <el-tooltip effect="dark" placement="top">
  361. <template slot="content">
  362. 选择部门默认包含子部门
  363. </template>
  364. <span>部门 <i class="el-icon-warning"></i></span>
  365. </el-tooltip>
  366. </template>
  367. <el-cascader
  368. v-model="config.event.deptArr"
  369. :options="dept_tree"
  370. :props="{checkStrictly: true,multiple : true, value: 'id', label: 'name', children: '_child' }"
  371. ref="dept4"
  372. class="width250"
  373. filterable
  374. collapse-tags
  375. placeholder="全公司"
  376. clearable
  377. ></el-cascader>
  378. </el-form-item>
  379. <el-form-item label="类型">
  380. <el-select class="width250" v-model="config.event.ptId" placeholder="请选择积分类型">
  381. <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value"></el-option>
  382. </el-select>
  383. </el-form-item>
  384. </div>
  385. </div>
  386. </el-form>
  387. </div>
  388. </div>
  389. <div class="flex-box-end" style="padding-top: 10px;">
  390. <el-button @click="dialogVisible = false">取消</el-button>
  391. <el-button type="primary" :loading="setLoading" :disabled="setLoading" @click="submit()">确定</el-button>
  392. </div>
  393. <el-dialog title="选择人员" width="640px" :visible.sync="show_employee_selector" append-to-body>
  394. <EmployeeSelector
  395. v-if="show_employee_selector"
  396. ref="members"
  397. :isChecKedAll="false"
  398. :user_no_select="false"
  399. :max="30"
  400. :selected="employee_selected"
  401. @confirm="move_employee_confirm"
  402. />
  403. <span slot="footer" class="dialog-footer">
  404. <el-button @click="show_employee_selector = false">取 消</el-button>
  405. <el-button type="primary" @click="submitMembers()">保 存</el-button>
  406. </span>
  407. </el-dialog>
  408. </el-dialog>
  409. </div>
  410. </template>
  411. <script>
  412. import upload from '@/components/upload';
  413. import EmployeeSelector from '@/components/EmployeeSelector.vue';
  414. export default {
  415. name: 'screenSet',
  416. components: { upload, EmployeeSelector },
  417. data() {
  418. return {
  419. Xtoken: { 'X-Token': this.$getToken() },
  420. loading: false,
  421. setLoading: false,
  422. ding_enable: true,
  423. list: [],
  424. dialogVisible: false,
  425. isPz: false,
  426. dept_tree: [], //部门列表
  427. options: [
  428. {
  429. value: -5,
  430. label: '本年'
  431. },
  432. {
  433. value: -4,
  434. label: '本季'
  435. },
  436. {
  437. value: -3,
  438. label: '本月'
  439. },
  440. {
  441. value: -2,
  442. label: '本周'
  443. },
  444. {
  445. value: -1,
  446. label: '本天'
  447. },
  448. {
  449. value: 1,
  450. label: '自定义时间区间'
  451. }
  452. ],
  453. roleOptions: [
  454. {
  455. value: 'all',
  456. label: '全部'
  457. },
  458. {
  459. value: 'manager',
  460. label: '管理员'
  461. },
  462. {
  463. value: 'employee',
  464. label: '员工'
  465. }
  466. ],
  467. sourceOptions: [
  468. {
  469. value: 1,
  470. label: '积分奖扣'
  471. },
  472. {
  473. value: 2,
  474. label: '任务'
  475. },
  476. {
  477. value: 3,
  478. label: '积分系统分配'
  479. },
  480. {
  481. value: 4,
  482. label: '考勤系统分配'
  483. },
  484. {
  485. value: 5,
  486. label: '积分申请'
  487. },
  488. // {
  489. // value: 6,
  490. // label: '绩效任务包'
  491. // },
  492. {
  493. value: 8,
  494. label: '积分导入'
  495. },
  496. {
  497. value: 9,
  498. label: 'A分转B分'
  499. },
  500. {
  501. value: 10,
  502. label: '钉钉汇报(日志)奖扣分'
  503. }
  504. ],
  505. typeOptions: [
  506. {
  507. value: 1,
  508. label: '全部'
  509. },
  510. {
  511. value: 2,
  512. label: 'A分'
  513. },
  514. {
  515. value: 3,
  516. label: 'B分'
  517. }
  518. ],
  519. activeBor: '1',
  520. isShowName: false,
  521. nameVal: '',
  522. employeeName: '',
  523. employee_selected: { dept: [], employee: [] },
  524. show_employee_selector: false,
  525. isCompile:false,//是否编辑
  526. isPreview: false,
  527. previewUrl:'',
  528. previewUrl2:'',
  529. code:'',
  530. selectItem:{},
  531. formData: {
  532. // id:'',//修改与删除时,必传 不传则为新增
  533. name: '', //不是删除则必填 配置名称 1-20个字符
  534. remark: '', //备注信息 最多20个字符 默认空
  535. del: 0, //是否为删除操作 1 是 其他否 默认0
  536. remake_code: 0 //是否重新生成校验码 1 是 默认0
  537. },
  538. defaultConfig: {
  539. //配置格式 不是删除则必填
  540. ranking_type:'ranking',
  541. company: {
  542. name: this.$getUserData().company_info.name.slice(0, 10), //不超过十个字 公司名截断
  543. logo: 'https://integralsys.oss-cn-shenzhen.aliyuncs.com/intesys/dd/17/2022/07/01/CaBis82ryBYbncxc3nehiSXkiwDbhbwi.png' //公司logo
  544. },
  545. title: '积分数据大屏', //不超过十个字
  546. ranking_total: { //累计B分排名拿数据
  547. name: "排行榜", //不超过十个字
  548. condition: { //筛选条件
  549. dept: [], //限定部门ID列表 空全公司
  550. deptArr: [],
  551. point_id: "2",//2AF 3BF,
  552. position: "employee",//employee manager all//员工 管理员 全部
  553. exclusion: [],//不参与排名用户ID数组,
  554. }
  555. },
  556. ranking: {
  557. //从阶段排名拿数据
  558. name: '排行榜', //不超过十个字
  559. condition: {//筛选条件
  560. time: [],
  561. date: -3,
  562. start_date: -3, //结束时间
  563. end_date: -3, //开始时间
  564. deptArr: [],
  565. dept: [], //限定部门ID列表 空全公司
  566. point_id: 3, //2AF 3BF,
  567. position: 'all', //manager all//员工 管理员 全部
  568. employeeName: '',
  569. exclusion: [] ,//不参与排名,
  570. employee:[],
  571. }
  572. },
  573. center: {
  574. deptArr: [],
  575. dept: [] //部门ID列表 空全公司
  576. },
  577. active: {
  578. base_ratio: 60, //基准比例
  579. deptArr: [],
  580. dept: [], //部门ID列表 空全公司
  581. type: 1
  582. },
  583. event: {
  584. name: '积分快讯', //排行榜名称
  585. source_type: [1, 2, 5], //来源ID列表 1积分录入 2任务 3积分系统分配 4考勤系统分配 5积分申请 6绩效任务包 8积分导入 9A分转B分 10钉钉报告直接奖励
  586. deptArr: [],
  587. dept: [], //部门ID列表 空全公司
  588. point_id: [2, 3], //积分类型 2AF 3BF
  589. ptId: 1
  590. }
  591. },
  592. config: {
  593. //配置格式 不是删除则必填
  594. ranking_type:'ranking',
  595. company: {
  596. name: this.$getUserData().company_info.name.slice(0, 10), //不超过十个字 公司名截断
  597. logo: 'https://integralsys.oss-cn-shenzhen.aliyuncs.com/intesys/dd/17/2022/07/01/CaBis82ryBYbncxc3nehiSXkiwDbhbwi.png' //公司logo
  598. },
  599. title: '积分数据大屏', //不超过十个字
  600. ranking_total: { //累计B分排名拿数据
  601. name: "累计B分排名", //不超过十个字
  602. condition: { //筛选条件
  603. dept: [], //限定部门ID列表 空全公司
  604. deptArr: [],
  605. point_id: "2",//2AF 3BF,
  606. position: "employee",//employee manager all//员工 管理员 全部
  607. exclusion: [],//不参与排名用户ID数组,
  608. }
  609. },
  610. ranking: {
  611. //从阶段排名拿数据
  612. name: '排行榜', //不超过十个字
  613. condition: {
  614. //筛选条件,
  615. time: [],
  616. date: -3,
  617. start_date: -3, //结束时间
  618. end_date: -3, //开始时间
  619. deptArr: [],
  620. dept: [], //限定部门ID列表 空全公司
  621. point_id: 3, //2AF 3BF,
  622. position: 'all', //manager all//员工 管理员 全部
  623. employeeName: '',
  624. exclusion: [] ,//不参与排名,
  625. employee:[],
  626. }
  627. },
  628. center: {
  629. deptArr: [],
  630. dept: [] //部门ID列表 空全公司
  631. },
  632. active: {
  633. base_ratio: 60, //基准比例
  634. deptArr: [],
  635. dept: [], //部门ID列表 空全公司
  636. type: 1
  637. },
  638. event: {
  639. name: '积分快讯', //排行榜名称
  640. source_type: [1, 2, 5], //来源ID列表 1积分录入 2任务 3积分系统分配 4考勤系统分配 5积分申请 6绩效任务包 8积分导入 9A分转B分 10钉钉报告直接奖励
  641. deptArr: [],
  642. dept: [], //部门ID列表 空全公司
  643. point_id: [2, 3], //积分类型 2AF 3BF
  644. ptId: 1
  645. }
  646. },
  647. };
  648. },
  649. watch: {
  650. 'config.event.ptId'(val) {
  651. if (val == 1) {
  652. this.config.event.point_id = [2, 3];
  653. } else {
  654. this.config.event.point_id = [val];
  655. }
  656. },
  657. 'config.event.deptArr'(val) {
  658. if(val.length>0){
  659. let dept_ids=[];
  660. val.forEach((item)=>{
  661. dept_ids.push(item[item.length-1]);
  662. // dept_ids.push(...item);
  663. })
  664. let set =new Set(dept_ids);
  665. this.config.event.dept = [...set];
  666. }else{
  667. this.config.event.dept=[];
  668. }
  669. this.closeDept()
  670. },
  671. 'config.active.deptArr'(val) {
  672. if(val.length>0){
  673. let dept_ids=[];
  674. val.forEach((item)=>{
  675. dept_ids.push(item[item.length-1]);
  676. // dept_ids.push(...item);
  677. })
  678. let set =new Set(dept_ids);
  679. this.config.active.dept = [...set];
  680. }else{
  681. this.config.active.dept=[];
  682. }
  683. this.closeDept()
  684. },
  685. 'config.center.deptArr'(val) {
  686. if(val.length>0){
  687. let dept_ids=[];
  688. val.forEach((item)=>{
  689. dept_ids.push(item[item.length-1]);
  690. // dept_ids.push(...item);
  691. })
  692. let set =new Set(dept_ids);
  693. this.config.center.dept = [...set];
  694. }else{
  695. this.config.center.dept=[];
  696. }
  697. this.closeDept()
  698. },
  699. 'config.ranking.condition.deptArr'(val) {
  700. if(val.length>0){
  701. let dept_ids=[];
  702. val.forEach((item)=>{
  703. dept_ids.push(item[item.length-1]);
  704. // dept_ids.push(...item);
  705. })
  706. let set =new Set(dept_ids);
  707. this.config.ranking.condition.dept = [...set];
  708. }else{
  709. this.config.ranking.condition.dept=[];
  710. }
  711. this.closeDept()
  712. },
  713. 'config.ranking_total.condition.deptArr'(val) {
  714. if(val.length>0){
  715. let dept_ids=[];
  716. val.forEach((item)=>{
  717. dept_ids.push(item[item.length-1]);
  718. // dept_ids.push(...item);
  719. })
  720. let set =new Set(dept_ids);
  721. this.config.ranking_total.condition.dept = [...set];
  722. }else{
  723. this.config.ranking_total.condition.dept=[];
  724. }
  725. this.closeDept()
  726. },
  727. 'config.ranking.condition.date'(val){
  728. if(val!=1){
  729. this.config.ranking.condition.start_date= val; //结束时间
  730. this.config.ranking.condition.end_date= val; //结束时间
  731. }else{
  732. this.config.ranking.condition.start_date= ''; //结束时间
  733. this.config.ranking.condition.end_date= ''; //结束时间
  734. }
  735. },
  736. isPz(val) {
  737. if (!val) {
  738. this.formData={
  739. // id:'',//修改与删除时,必传 不传则为新增
  740. name: '', //不是删除则必填 配置名称 1-20个字符
  741. remark: '', //备注信息 最多20个字符 默认空
  742. del: 0, //是否为删除操作 1 是 其他否 默认0
  743. remake_code: 0 //是否重新生成校验码 1 是 默认0
  744. }
  745. this.isCompile=false;//是否编辑
  746. }
  747. },
  748. dialogVisible(val) {
  749. if (!val) {
  750. // this.activeBor='1';
  751. }else{
  752. setTimeout(()=>{
  753. document.getElementById('scroll').scrollTop = 0;
  754. },200)
  755. }
  756. }
  757. },
  758. mounted() {
  759. this.getList();
  760. this.getDepartment();
  761. },
  762. methods: {
  763. setTime(val){
  764. if(val&&val.length>0){
  765. this.config.ranking.condition.start_date= val[0]; //结束时间
  766. this.config.ranking.condition.end_date= val[1]+86399000; //结束时间
  767. }else{
  768. this.config.ranking.condition.start_date= ''; //结束时间
  769. this.config.ranking.condition.end_date= ''; //结束时间
  770. }
  771. },
  772. //编辑
  773. compile(item){
  774. this.isCompile=true;//是否编辑
  775. // this.selectItem=item;
  776. this.isPz=true;//是否编辑
  777. this.formData={
  778. id:item.id,//修改与删除时,必传 不传则为新增
  779. name: item.name, //不是删除则必填 配置名称 1-20个字符
  780. remark: item.remark, //备注信息 最多20个字符 默认空
  781. del: 0, //是否为删除操作 1 是 其他否 默认0
  782. remake_code: 0 ,//是否重新生成校验码 1 是 默认0
  783. config:JSON.stringify(item.config)
  784. }
  785. },
  786. copy (index) {
  787. //创建input标签
  788. var input = document.createElement('input')
  789. //将input的值设置为需要复制的内容
  790. input.value =index==1? this.previewUrl:index==2? this.code:this.previewUrl2;
  791. //添加input标签
  792. document.body.appendChild(input)
  793. //选中input标签
  794. input.select()
  795. //执行复制
  796. document.execCommand('copy')
  797. //成功提示信息
  798. this.$message.success('已复制')
  799. //移除input标签
  800. document.body.removeChild(input)
  801. },
  802. refresh(){
  803. this.$confirm('刷新后原有密码将会失效,确定要刷新吗?', '提示', {
  804. confirmButtonText: '确定',
  805. cancelButtonText: '取消',
  806. type: 'warning'
  807. }).then(() => {
  808. let data={
  809. id:this.selectItem.id,
  810. name: this.selectItem.name, //不是删除则必填 配置名称 1-20个字符
  811. remark: this.selectItem.remark, //备注信息 最多20个字符 默认空
  812. del: 0, //是否为删除操作 1 是 其他否 默认0
  813. remake_code: 1 ,//是否重新生成校验码 1 是 默认0
  814. config:JSON.stringify(this.selectItem.config)
  815. }
  816. this.$axios('post', '/api/integral/site/edit_screen', data).then(res => {
  817. if (res.data.code == 1) {
  818. this.code=res.data.data.code
  819. this.getList();
  820. }
  821. })
  822. });
  823. },
  824. preview(item,index){
  825. // this.previewUrl='http://localhost:8080/#/screen';
  826. this.previewUrl=process.env.VUE_APP_BASE_API+'/pc/#/screen';
  827. let corpId=window.btoa(this.$getCache('corpId'))
  828. this.previewUrl2=process.env.VUE_APP_BASE_API+'/pc/#/screenSan?corpId='+corpId;
  829. if (process.env.NODE_ENV === 'development') {
  830. this.previewUrl=process.env.VUE_APP_BASE_API+'#/screen';
  831. this.previewUrl2=process.env.VUE_APP_BASE_API+'#/screenSan?corpId='+corpId;
  832. }
  833. if(index==1){
  834. window.open(this.previewUrl+'?preview=1', '_blank');
  835. }else{
  836. this.selectItem=item;
  837. this.code=item.code;
  838. this.isPreview=true;
  839. }
  840. },
  841. submitMembers() {
  842. this.$refs.members.confirm(); //调用组件的confirm();
  843. },
  844. //获取部门
  845. getDepartment() {
  846. this.$axios('get', '/api/department/tree').then(res => {
  847. this.dept_tree = this.getTreeData(res.data.data.list);
  848. });
  849. },
  850. // 递归判断列表,把最后的children设为undefined
  851. getTreeData(data) {
  852. for (var i = 0; i < data.length; i++) {
  853. if (data[i]._child.length < 1) {
  854. // children若为空数组,则将children设为undefined
  855. data[i]._child = undefined;
  856. } else {
  857. // children若不为空数组,则继续 递归调用 本方法
  858. this.getTreeData(data[i]._child);
  859. }
  860. }
  861. return data;
  862. },
  863. // 附件上传
  864. beforeUpload(file) {
  865. const isJPG = /^image\/(jpeg|png|jpg)$/.test(file.type);
  866. const isLt2M = file.size / 1024 / 1024 < 5;
  867. if (!isJPG) {
  868. this.$message.error('上传图只能是 JPEG,PNG,JPG 格式!');
  869. }
  870. if (!isLt2M) {
  871. this.$message.error('上传图片大小不能超过 5MB!');
  872. }
  873. return isJPG && isLt2M;
  874. },
  875. handleFilesSuccess(response, file, fileList) {
  876. this.config.company.logo=response.url
  877. },
  878. saveFirst(fromName) {
  879. this.$refs[fromName].validate(valid => {
  880. if (valid) {
  881. let formData = this.formData;
  882. if(!this.isCompile){
  883. formData.config = JSON.stringify(this.defaultConfig);
  884. }
  885. this.$axios('post', '/api/integral/site/edit_screen', formData).then(res => {
  886. this.$message.success(this.isCompile?'已编辑':'已添加');
  887. }).finally(() => {
  888. this.isPz=false;
  889. this.getList();
  890. });
  891. }
  892. });
  893. },
  894. deleteSet(e) {
  895. this.$confirm('确定要删除吗?', '提示', {
  896. confirmButtonText: '确定',
  897. cancelButtonText: '取消',
  898. type: 'warning'
  899. }).then(() => {
  900. this.$axios('POST', '/api/integral/site/edit_screen', { id: e.id,del:1 }).then(res => {
  901. if (res.data.code == 1) {
  902. this.$message.success('删除成功');
  903. this.getList();
  904. }
  905. });
  906. });
  907. },
  908. submit(fromName) {
  909. if (!this.config.title) {
  910. this.$message.error('请输入标题');
  911. return false;
  912. }
  913. if (!this.config.company.name) {
  914. this.$message.error('请输入组织名称和logo设置 “名称”');
  915. return false;
  916. }
  917. if(this.config.ranking_type=='ranking'){
  918. if (!this.config.ranking.name) {
  919. this.$message.error('请输入排行榜设置 “名称”');
  920. return false;
  921. }
  922. if(!this.config.ranking_total.name){
  923. this.config.ranking_total.name='累计B分排名'
  924. }
  925. if(this.config.ranking.condition.date == 1&&!this.config.ranking.condition.start_date){
  926. if(this.config.ranking.condition.time.length!=0){
  927. let time=this.config.ranking.condition.time
  928. this.config.ranking.condition.start_date= time[0]; //结束时间
  929. this.config.ranking.condition.end_date= time[1]+86399000; //结束时间
  930. }else{
  931. this.$message.error('请选择排行榜设置 “时间”');
  932. return false;
  933. }
  934. }
  935. }else{
  936. if (!this.config.ranking_total.name) {
  937. this.$message.error('请输入排行榜设置 “名称”');
  938. return false;
  939. }
  940. if(!this.config.ranking.name){
  941. this.config.ranking.name='排行榜'
  942. }
  943. }
  944. if (!this.config.event.name) {
  945. this.$message.error('请输入积分快讯设置 “名称”');
  946. return false;
  947. }
  948. if (this.config.active.base_ratio>100) {
  949. this.$message.error('活跃度设置 “标尺” 不能超过100');
  950. return false;
  951. }
  952. if (!this.config.active.base_ratio) {
  953. this.$message.error('活跃度设置 “标尺” 不能为空,请输入1~100');
  954. return false;
  955. }
  956. if (this.config.event.source_type.length==0) {
  957. this.$message.error('请输入积分快讯设置 “来源” 至少选择一项');
  958. return false;
  959. }
  960. let data={
  961. id:this.selectItem.id,
  962. name: this.selectItem.name, //不是删除则必填 配置名称 1-20个字符
  963. remark: this.selectItem.remark, //备注信息 最多20个字符 默认空
  964. del: 0, //是否为删除操作 1 是 其他否 默认0
  965. remake_code: 0 ,//是否重新生成校验码 1 是 默认0
  966. config:JSON.stringify(this.config)
  967. }
  968. // console.log(data)
  969. // return false
  970. this.$axios('post', '/api/integral/site/edit_screen', data).then(res => {
  971. if (res.data.code == 1) {
  972. this.$message.success("保存成功");
  973. this.getList();
  974. }
  975. }).finally(() => {
  976. this.dialogVisible = false;
  977. this.setLoading = false;
  978. });
  979. },
  980. openSet(item) {
  981. if(!item.config.ranking_total){
  982. item.config.ranking_total={
  983. name: "累计B分排名", //不超过十个字
  984. condition: { //筛选条件
  985. dept: [], //限定部门ID列表 空全公司
  986. deptArr: [],
  987. point_id: "2",//2AF 3BF,
  988. position: "employee",//employee manager all//员工 管理员 全部
  989. exclusion: [],//不参与排名用户ID数组,
  990. }
  991. }
  992. item.config.ranking_type='ranking'
  993. }
  994. this.$nextTick(()=>{
  995. this.config=JSON.parse(JSON.stringify(item.config));
  996. this.selectItem=item;
  997. this.employee_selected.employee=item.config.ranking.condition.employee;
  998. this.dialogVisible = true;
  999. })
  1000. },
  1001. getList() {
  1002. this.loading = true;
  1003. this.$axios('get', '/api/integral/site/screen')
  1004. .then(res => {
  1005. this.list = res.data.data.list;
  1006. })
  1007. .finally(err => {
  1008. this.loading = false;
  1009. });
  1010. },
  1011. closeDept(){
  1012. // this.$nextTick(() => {
  1013. // this.$refs.dept1.dropDownVisible = false;
  1014. // this.$refs.dept2.dropDownVisible = false;
  1015. // this.$refs.dept3.dropDownVisible = false;
  1016. // this.$refs.dept4.dropDownVisible = false;
  1017. // });
  1018. },
  1019. // 选择奖扣对象
  1020. move_employee_confirm(data) {
  1021. this.employee_selected = { dept: [], employee: [] };
  1022. this.config.ranking.condition.employeeName = '';
  1023. if (data.employee !== null && data.employee.length != 0) {
  1024. let exclusion = [];
  1025. this.employee_selected = data;
  1026. this.config.ranking.condition.employee=data.employee
  1027. data.employee.forEach(element => {
  1028. this.config.ranking.condition.employeeName += element.name + ',';
  1029. exclusion.push(element.id);
  1030. });
  1031. this.config.ranking.condition.exclusion = exclusion;
  1032. } else {
  1033. this.config.ranking.condition.exclusion = [];
  1034. this.config.ranking.condition.employee=[];
  1035. }
  1036. this.show_employee_selector = false;
  1037. },
  1038. noPersonnelListTips() {
  1039. this.show_employee_selector = true;
  1040. },
  1041. myFunction(e) {
  1042. let scrollTop = document.getElementById('scroll').scrollTop;
  1043. if (this.config.ranking.condition.date == 1) {
  1044. if (scrollTop < 85) {
  1045. this.activeBor = '1';
  1046. } else if (scrollTop > 85 && scrollTop < 355) {
  1047. this.activeBor = '2';
  1048. } else if (scrollTop >= 355 && scrollTop < 800) {
  1049. this.activeBor = '3';
  1050. } else if (scrollTop >= 800 && scrollTop < 900) {
  1051. this.activeBor = '4';
  1052. } else if (scrollTop >= 900 && scrollTop < 960) {
  1053. this.activeBor = '5';
  1054. } else if (scrollTop >= 960) {
  1055. this.activeBor = '6';
  1056. }
  1057. } else {
  1058. if (scrollTop < 85) {
  1059. this.activeBor = '1';
  1060. } else if (scrollTop >= 85 && scrollTop < 355) {
  1061. this.activeBor = '2';
  1062. } else if (scrollTop >= 355 && scrollTop < 760) {
  1063. this.activeBor = '3';
  1064. } else if (scrollTop >= 760 && scrollTop < 860) {
  1065. this.activeBor = '4';
  1066. } else if (scrollTop >= 860 && scrollTop < 900) {
  1067. this.activeBor = '5';
  1068. } else if (scrollTop >= 900) {
  1069. this.activeBor = '6';
  1070. }
  1071. }
  1072. },
  1073. activeQie(index) {
  1074. if (this.config.ranking.condition.date == 1) {
  1075. if (index == '1') {
  1076. document.getElementById('scroll').scrollTop = 0;
  1077. } else if (index == '2') {
  1078. document.getElementById('scroll').scrollTop = 87;
  1079. } else if (index == 3) {
  1080. document.getElementById('scroll').scrollTop = 357;
  1081. } else if (index == 4) {
  1082. document.getElementById('scroll').scrollTop = 802;
  1083. } else if (index == 5) {
  1084. document.getElementById('scroll').scrollTop = 902;
  1085. } else if (index == 6) {
  1086. document.getElementById('scroll').scrollTop = 1078;
  1087. }
  1088. } else {
  1089. if (index == 1) {
  1090. document.getElementById('scroll').scrollTop = 0;
  1091. } else if (index == 2) {
  1092. document.getElementById('scroll').scrollTop = 87;
  1093. } else if (index == 3) {
  1094. document.getElementById('scroll').scrollTop = 357;
  1095. } else if (index == 4) {
  1096. document.getElementById('scroll').scrollTop = 762;
  1097. } else if (index == 5) {
  1098. document.getElementById('scroll').scrollTop = 862;
  1099. } else if (index == 6) {
  1100. document.getElementById('scroll').scrollTop = 1038;
  1101. }
  1102. }
  1103. },
  1104. }
  1105. };
  1106. </script>
  1107. <style scoped lang="scss">
  1108. .activeBor {
  1109. // background-color: #;
  1110. color: #2490fd;
  1111. border: 1px solid #2490fd !important;
  1112. box-shadow: 0 0 3px #2490fd;
  1113. }
  1114. .border1 {
  1115. border: 1px solid #ccc;
  1116. border-radius: 3px;
  1117. margin: 5px;
  1118. text-align: center;
  1119. cursor: pointer;
  1120. }
  1121. .avatar-uploader ::v-deep .el-upload {
  1122. border: 1px dashed #d9d9d9;
  1123. border-radius: 6px;
  1124. cursor: pointer;
  1125. position: relative;
  1126. overflow: hidden;
  1127. }
  1128. .avatar-uploader ::v-deep .el-upload:hover {
  1129. border-color: #409eff;
  1130. }
  1131. .avatar-uploader-icon {
  1132. font-size: 28px;
  1133. color: #8c939d;
  1134. width: 100px;
  1135. height: 100px;
  1136. line-height: 100px;
  1137. text-align: center;
  1138. }
  1139. .avatar {
  1140. width: 100px;
  1141. height: 100px;
  1142. display: block;
  1143. }
  1144. .dialog ::v-deep .el-dialog__body {
  1145. padding: 20px;
  1146. }
  1147. .width250 {
  1148. width: 250px;
  1149. }
  1150. .kuai {
  1151. margin-bottom: 30px;
  1152. }
  1153. .kuai .formBox {
  1154. padding-left: 20px;
  1155. }
  1156. .form ::v-deep .el-form-item {
  1157. margin-bottom: 20px;
  1158. }
  1159. .form ::v-deep .el-form-item__label {
  1160. color: #777777;
  1161. }
  1162. .formTitle {
  1163. font-size: 16px;
  1164. font-weight: 700;
  1165. margin-bottom: 10px;
  1166. color: #222;
  1167. }
  1168. .diy-tip1 {
  1169. margin-bottom: 10px !important;
  1170. background: #f0f9eb !important;
  1171. color: #333 !important;
  1172. border: 1px solid #67c23a !important;
  1173. padding: 9px !important;
  1174. min-width: 800px;
  1175. border-radius: 4px;
  1176. }
  1177. .el-dialog__body {
  1178. position: relative;
  1179. top: -20px;
  1180. }
  1181. .widthInput {
  1182. width: 150px;
  1183. }
  1184. .title {
  1185. margin: 10px 0;
  1186. margin-top: 0;
  1187. font-size: 14px;
  1188. font-weight: 700;
  1189. padding-left: 13px;
  1190. }
  1191. .initia_title {
  1192. font-size: 20px;
  1193. color: rgba(48, 49, 51, 1);
  1194. font-family: PingFangSC-Regular;
  1195. }
  1196. .initia_title_1 {
  1197. color: #e6a23c;
  1198. font-size: 14px;
  1199. margin-top: 10px;
  1200. }
  1201. .lookQrcode {
  1202. color: #606266;
  1203. cursor: pointer;
  1204. transition: all 0.3s;
  1205. font-weight: 700;
  1206. }
  1207. .lookQrcode:hover {
  1208. color: #2490fd;
  1209. }
  1210. .name {
  1211. max-width: 200px;
  1212. margin-right: 10px;
  1213. }
  1214. </style>