baseManage.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714
  1. <template>
  2. <div>
  3. <el-breadcrumb separator-class="el-icon-arrow-right">
  4. <el-breadcrumb-item>基地管理</el-breadcrumb-item>
  5. </el-breadcrumb>
  6. <SearchBar>
  7. <div slot="type-check">
  8. <el-input
  9. placeholder="请输入内容"
  10. size="mini"
  11. suffix-icon="el-icon-search"
  12. v-model="search"
  13. @change="searchBase"
  14. clearable
  15. ></el-input>
  16. </div>
  17. <div slot="search-common">
  18. <el-button type="primary" size="mini" @click="addBase('新增基地')"
  19. >新增</el-button
  20. >
  21. </div>
  22. </SearchBar>
  23. <el-row :gutter="20">
  24. <el-col
  25. :xs="24"
  26. :sm="24"
  27. :md="12"
  28. :lg="12"
  29. :xl="8"
  30. class="col-item"
  31. v-for="(item, index) in baseList"
  32. :key="index"
  33. >
  34. <el-card class="box-card boxCard">
  35. <div class="baseCard">
  36. <div class="baseImg">
  37. <img :src="'/api/' + item.base_img" />
  38. </div>
  39. <div class="addBaseInfo">
  40. <h2>{{ item.base_name }}</h2>
  41. <div class="addBaseInfoDetails">
  42. <i class="iconfont icon-yonghu11"></i>
  43. <div class="caption">负责人 :</div>
  44. <div>{{ item.base_charge }}</div>
  45. </div>
  46. <div class="addBaseInfoDetails">
  47. <i class="iconfont icon-dianhua2"></i>
  48. <div class="caption">电&nbsp;&nbsp;&nbsp;&nbsp;话 :</div>
  49. <div>{{ item.base_phone }}</div>
  50. </div>
  51. <div class="addBaseInfoDetails">
  52. <i class="iconfont icon-mianji"></i>
  53. <div class="caption">面&nbsp;&nbsp;&nbsp;&nbsp;积 :</div>
  54. <div >{{ item.base_area }}</div>
  55. </div>
  56. <div class="addBaseInfoDetails" >
  57. <i class="iconfont icon-dingwei"></i>
  58. <div class="caption">地&nbsp;&nbsp;&nbsp;&nbsp;址 :</div>
  59. <div class="addr">{{ item.address || '未定位' }}</div>
  60. </div>
  61. </div>
  62. </div>
  63. <div class="baseEditBox" @click="editBase(item.id, '修改基地')">
  64. <img src="@/assets/images/fourMoodBase/baseEditIcon.png" alt />
  65. </div>
  66. <div class="baseBtn">
  67. <span class="detailBtn" @click="detailBase(item.id)">详情</span>
  68. <span class="delBtn" @click="delBase(item.id)">删除</span>
  69. </div>
  70. </el-card>
  71. </el-col>
  72. </el-row>
  73. <!-- 暂无数据 -->
  74. <div class="expertDiagnosis_referral_units_not" v-if="baseList.length <= 0">
  75. <img
  76. src="@/assets/images/expertDiagnosis/zanwu.png"
  77. alt
  78. class="expertDiagnosis_referral_units_notImg"
  79. />
  80. </div>
  81. <el-pagination
  82. v-if="baseList.length > 0"
  83. background
  84. :page-size="6"
  85. layout="prev, pager, next"
  86. :current-page="page"
  87. :total="totalNum"
  88. @current-change="changePage"
  89. ></el-pagination>
  90. <!-- 基地新增/修改 -->
  91. <el-dialog
  92. :title="title"
  93. :visible.sync="baseAddVisible"
  94. width="30%"
  95. @close="addBaseDialogClosed"
  96. >
  97. <el-form
  98. ref="addBaseFormRef"
  99. :model="addBaseInfo"
  100. label-width="90px"
  101. :rules="addUserFormRules"
  102. >
  103. <el-form-item label="基地名称 : " prop="baseName">
  104. <el-input v-model="addBaseInfo.baseName"></el-input>
  105. </el-form-item>
  106. <el-form-item label="基地图片 : " prop="imgSrc">
  107. <el-upload
  108. class="avatar-uploader"
  109. action
  110. :auto-upload="false"
  111. :show-file-list="false"
  112. :on-change="changeUpload"
  113. >
  114. <img
  115. v-if="addBaseInfo.imgSrc"
  116. :src="addBaseInfo.imgSrc"
  117. class="avatar"
  118. />
  119. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  120. </el-upload>
  121. </el-form-item>
  122. <el-form-item label="负责人 : " prop="principal">
  123. <el-input v-model="addBaseInfo.principal"></el-input>
  124. </el-form-item>
  125. <el-form-item label="联系电话 : " prop="phone">
  126. <el-input v-model="addBaseInfo.phone"></el-input>
  127. </el-form-item>
  128. <el-form-item label="面积(亩) : " prop="area">
  129. <el-input v-model="addBaseInfo.area"></el-input>
  130. </el-form-item>
  131. <el-form-item label="绑定设备 : " prop="bindEquip">
  132. <el-cascader
  133. :key="addBaseInfo.cascaderKey"
  134. style="width: 100%"
  135. :options="addBaseInfo.cascaderEquipArr"
  136. v-model="addBaseInfo.bindEquip"
  137. :props="{ multiple: true, label: 'type_name', value: 'type_name' }"
  138. clearable
  139. ></el-cascader>
  140. </el-form-item>
  141. <el-form-item label="基地描述 : " prop="baseIntro">
  142. <el-input type="textarea" v-model="addBaseInfo.baseIntro"></el-input>
  143. </el-form-item>
  144. <el-form-item label="基地地址 : " prop="address" class="addressItem">
  145. <el-input
  146. type="text"
  147. v-model="addBaseInfo.address"
  148. disabled
  149. placeholder="请定位"
  150. ></el-input>
  151. <el-button type="primary" size="mini" @click="goLocation"
  152. >基地定位</el-button
  153. >
  154. </el-form-item>
  155. </el-form>
  156. <span slot="footer" class="dialog-footer">
  157. <el-button @click="baseAddVisible = false">取 消</el-button>
  158. <el-button type="primary" @click="addBaseSubm">确认</el-button>
  159. </span>
  160. </el-dialog>
  161. <!-- vueCropper 剪裁图片实现-->
  162. <el-dialog title="图片剪裁" :visible.sync="cropperVisible" append-to-body>
  163. <div class="cropper-content">
  164. <div style="width: 100%; height: 500px">
  165. <vueCropper
  166. ref="cropper"
  167. :img="option.img"
  168. autoCrop
  169. centerBox
  170. fixed
  171. :fixedNumber="option.fixedNumber"
  172. :outputSize="option.size"
  173. :outputType="option.outputType"
  174. ></vueCropper>
  175. </div>
  176. </div>
  177. <div slot="footer" class="dialog-footer">
  178. <el-button @click="cropperVisible = false">取 消</el-button>
  179. <el-button type="primary" @click="finish">确认</el-button>
  180. </div>
  181. </el-dialog>
  182. <!-- 添加定位弹框 -->
  183. <el-dialog
  184. class="map_dialog"
  185. title="添加定位"
  186. v-if="addLocationDialogVisible"
  187. :visible.sync="addLocationDialogVisible"
  188. width="800px"
  189. @closed="addLocationDialogClosed"
  190. >
  191. <el-form
  192. :inline="true"
  193. :model="locationForm"
  194. class="demo-form-inline"
  195. size="mini"
  196. >
  197. <el-form-item label="经度">
  198. <el-input v-model="locationForm.lng"></el-input>
  199. </el-form-item>
  200. <el-form-item label="维度">
  201. <el-input v-model="locationForm.lat"></el-input>
  202. </el-form-item>
  203. <el-form-item>
  204. <el-button type="primary" size="mini" @click="locationSearch"
  205. >定位</el-button
  206. >
  207. </el-form-item>
  208. </el-form>
  209. <baidu-map
  210. class="Bmap"
  211. :center="center"
  212. :zoom="mapZoom"
  213. :scroll-wheel-zoom="true"
  214. @ready="handlerBMap"
  215. @click="locationPoint"
  216. ></baidu-map>
  217. <span slot="footer" class="dialog-footer">
  218. <el-button @click="addLocationDialogVisible = false">取 消</el-button>
  219. <el-button type="primary" @click="addLocationSubm">确 定</el-button>
  220. </span>
  221. </el-dialog>
  222. </div>
  223. </template>
  224. <script>
  225. import SearchBar from '@/components/SearchBar'
  226. export default {
  227. data() {
  228. return {
  229. dialogTxt: '',
  230. search: '',
  231. page: 1,
  232. flag: null, //编辑基地提交为1,添加基地为2
  233. totalNum: null,
  234. baseAddVisible: false,
  235. cropperVisible: false,
  236. title: '',
  237. addBaseInfo: {
  238. baseName: '',
  239. imgSrc: '',
  240. principal: '',
  241. phone: '',
  242. area: '',
  243. cascaderKey: 0, //绑定key值,key值改变,cascader就重新渲染
  244. cascaderEquipArr: [],
  245. bindEquip: [],
  246. baseIntro: '',
  247. address: '',
  248. lng: '',
  249. lat: '',
  250. base_id: ''
  251. },
  252. addUserFormRules: {
  253. baseName: [
  254. { required: true, message: '请输入基地名称', trigger: 'blur' }
  255. ],
  256. imgSrc: [
  257. { required: true, message: '请选择基地图片', trigger: 'change' }
  258. ],
  259. principal: [
  260. { required: true, message: '请输入负责人', trigger: 'blur' }
  261. ],
  262. phone: [{ required: true, message: '请输入联系电话', trigger: 'blur' }],
  263. area: [
  264. { required: true, message: '请输入基地面积', trigger: 'change' }
  265. ],
  266. cascaderEquipArr: [
  267. { required: true, message: '请选择基地设备', trigger: 'change' }
  268. ],
  269. address: [
  270. { required: true, message: '请选择基地地址', trigger: 'change' }
  271. ]
  272. },
  273. // 裁剪组件的基础配置option
  274. option: {
  275. img:
  276. 'https://qn-qn-kibey-../../assets-cdn.app-echo.com/goodboy-weixin.PNG', // 裁剪图片的地址
  277. info: true, // 裁剪框的大小信息
  278. outputSize: 0.8, // 裁剪生成图片的质量
  279. outputType: 'jpeg', // 裁剪生成图片的格式
  280. // canScale: false, // 图片是否允许滚轮缩放
  281. // autoCrop: true, // 是否默认生成截图框
  282. // autoCropWidth: 300, // 默认生成截图框宽度
  283. // autoCropHeight: 200, // 默认生成截图框高度
  284. // fixedBox: true, // 固定截图框大小 不允许改变
  285. fixed: true, // 是否开启截图框宽高固定比例
  286. fixedNumber: [10, 7], // 截图框的宽高比例
  287. full: true, // 是否输出原图比例的截图
  288. canMoveBox: false, // 截图框能否拖动
  289. original: false, // 上传图片按照原始比例渲染
  290. centerBox: false, // 截图框是否被限制在图片里面
  291. infoTrue: true // true 为展示真实输出图片宽高 false 展示看到的截图框宽高
  292. },
  293. baseList: [],
  294. //添加基地定位
  295. addLocationDialogVisible: false,
  296. locationForm: {
  297. lng: '',
  298. lat: ''
  299. },
  300. center: { lng: 113.271429, lat: 23.135336 },
  301. mapZoom: 6
  302. }
  303. },
  304. components: {
  305. SearchBar
  306. },
  307. created() {
  308. this.getBaseList()
  309. },
  310. methods: {
  311. getBaseList() {
  312. this.$axios({
  313. method: 'POST',
  314. url: '/api/api_gateway?method=base.bases.base_list',
  315. data: this.qs.stringify({
  316. ret: 'list',
  317. page_size: 6,
  318. search: this.search,
  319. page: this.page
  320. })
  321. }).then((res) => {
  322. if (res.data.message == '') {
  323. let data = res.data.data.data
  324. this.baseList = []
  325. data.map((item) => {
  326. let lat = item.lat
  327. let lng = item.lng
  328. this.$axios({
  329. //根据经纬度转换地址
  330. methos: 'GET',
  331. url: `/v3/?ak=nroAiX0Lf6ppNEGt2dBLtDkOldGCPFwF&output=json&coordtype=wgs84ll&location=${lat},${lng}`
  332. }).then((res) => {
  333. if (res.data.status == 0) {
  334. let addressComponent = res.data.result.addressComponent
  335. item.address =
  336. addressComponent.province +
  337. addressComponent.city +
  338. addressComponent.district
  339. } else {
  340. item.address = ''
  341. }
  342. this.baseList.push(item)
  343. })
  344. })
  345. this.totalNum = res.data.data.page_size
  346. }
  347. })
  348. },
  349. searchBase() {
  350. this.page = 1
  351. this.getBaseList()
  352. },
  353. //获取所有未绑定设备+自己已绑定的设备
  354. getEquipList(id) {
  355. this.$axios({
  356. method: 'POST',
  357. url: '/api/api_gateway?method=base.bases.base_equip',
  358. data: this.qs.stringify({
  359. base_id: id
  360. })
  361. }).then((res) => {
  362. let data = res.data.data.data
  363. this.addBaseInfo.cascaderEquipArr = data
  364. })
  365. },
  366. changePage(val) {
  367. this.page = val
  368. this.getBaseList()
  369. },
  370. addBaseDialogClosed() {
  371. this.$refs.addBaseFormRef.resetFields()
  372. this.addBaseInfo.cascaderKey++
  373. this.addBaseInfo.baseName = ''
  374. this.addBaseInfo.principal = ''
  375. this.addBaseInfo.phone = ''
  376. this.addBaseInfo.area = ''
  377. this.addBaseInfo.imgSrc = ''
  378. this.addBaseInfo.cascaderEquipArr = []
  379. this.addBaseInfo.bindEquip = []
  380. this.addBaseInfo.baseIntro = ''
  381. this.addBaseInfo.address = ''
  382. this.addBaseInfo.lat = ''
  383. this.addBaseInfo.lng = ''
  384. },
  385. //添加/删除基地
  386. addBaseSubm() {
  387. this.$refs.addBaseFormRef.validate((valid) => {
  388. if (valid) {
  389. let arr = this.addBaseInfo.bindEquip.map((item) => {
  390. return item[1]
  391. })
  392. if (this.flag == 1) {
  393. let ret = 'modify'
  394. //编辑
  395. this.baseFun(ret, arr, '修改成功')
  396. } else if (this.flag == 2) {
  397. let ret = 'add'
  398. //添加
  399. this.baseFun(ret, arr, '添加成功')
  400. }
  401. } else {
  402. return false
  403. }
  404. })
  405. this.getEquipList()
  406. },
  407. baseFun(ret, arr, txt) {
  408. this.$axios({
  409. method: 'POST',
  410. url: '/api/api_gateway?method=base.bases.base_list',
  411. data: this.qs.stringify({
  412. ret: ret,
  413. base_id: this.addBaseInfo.base_id,
  414. base_name: this.addBaseInfo.baseName,
  415. base_charge: this.addBaseInfo.principal,
  416. base_phone: this.addBaseInfo.phone,
  417. base_area: this.addBaseInfo.area,
  418. base_img: this.addBaseInfo.imgSrc.slice(5), //去掉/api/
  419. base_equip: arr.join('#'),
  420. base_describe: this.addBaseInfo.baseIntro,
  421. lng: this.addBaseInfo.lng,
  422. lat: this.addBaseInfo.lat
  423. })
  424. }).then((res) => {
  425. if (res.data.message == '') {
  426. this.baseAddVisible = false
  427. this.getBaseList()
  428. this.$message.success(txt)
  429. }
  430. })
  431. },
  432. // 上传按钮 限制图片大小
  433. changeUpload(file, fileList) {
  434. const isLt5M = file.size / 1024 / 1024 < 5
  435. if (!isLt5M) {
  436. this.$message.error('上传文件大小不能超过 5MB!')
  437. return false
  438. }
  439. // 上传成功后将图片地址赋值给裁剪框显示图片
  440. this.$nextTick(() => {
  441. this.option.img = URL.createObjectURL(file.raw)
  442. this.cropperVisible = true
  443. })
  444. },
  445. // 点击裁剪,这一步是可以拿到处理后的地址
  446. finish() {
  447. // 获取截图的base64 数据
  448. this.$refs.cropper.getCropBlob((data) => {
  449. var form = new FormData()
  450. let resFile = this.blobToFile(data, 'filename.jpg')
  451. form.append('img_file', resFile)
  452. this.cropperVisible = false
  453. this.$axios({
  454. method: 'POST',
  455. url: '/api/api_gateway?method=base.bases.base_photo',
  456. data: form
  457. }).then((res) => {
  458. if (res.data.message == '') {
  459. this.addBaseInfo.imgSrc = `/api/${res.data.data.src}`
  460. }
  461. })
  462. })
  463. },
  464. // base64 转 Blob
  465. // dataURLtoBlob(dataURI) {
  466. // var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0] // mime类型
  467. // var byteString = atob(dataURI.split(',')[1]) //base64 解码
  468. // var arrayBuffer = new ArrayBuffer(byteString.length) //创建缓冲数组
  469. // var intArray = new Uint8Array(arrayBuffer) //创建视图
  470. // for (var i = 0; i < byteString.length; i++) {
  471. // intArray[i] = byteString.charCodeAt(i)
  472. // }
  473. // return new Blob([intArray], { type: mimeString })
  474. // },
  475. //转成blob
  476. blobToFile(Blob, fileName) {
  477. Blob.lastModifiedDate = new Date()
  478. Blob.name = fileName
  479. return Blob
  480. },
  481. dataURLtoFile(dataurl, filename) {
  482. //将base64转换为文件
  483. var arr = dataurl.split(','),
  484. mime = arr[0].match(/:(.*?);/)[1],
  485. bstr = atob(arr[1]),
  486. n = bstr.length,
  487. u8arr = new Uint8Array(n)
  488. while (n--) {
  489. u8arr[n] = bstr.charCodeAt(n)
  490. }
  491. if (!!window.ActiveXObject || 'ActiveXObject' in window) {
  492. // ie浏览器
  493. return new Blob([u8arr.buffer], { type: mime })
  494. } else {
  495. //主流浏览器
  496. return new File([u8arr], filename, { type: mime })
  497. }
  498. },
  499. goLocation() {
  500. this.addLocationDialogVisible = true
  501. },
  502. addLocationDialogClosed() {},
  503. locationSearch() {},
  504. handlerBMap({ BMap, map }) {
  505. this.BMap = BMap
  506. this.map = map
  507. },
  508. //在地图中点击定位
  509. locationPoint(e) {
  510. let { point } = e
  511. this.locationForm = point
  512. this.map.clearOverlays()
  513. this.map.addOverlay(new BMap.Marker(point))
  514. },
  515. addLocationSubm() {
  516. this.addBaseInfo.address = `lng:${this.locationForm.lng},lat:${this.locationForm.lat}`
  517. this.addBaseInfo.lng = this.locationForm.lng
  518. this.addBaseInfo.lat = this.locationForm.lat
  519. this.addLocationDialogVisible = false
  520. },
  521. editBase(id, title) {
  522. this.title = title
  523. this.flag = 1
  524. this.addBaseInfo.base_id = id
  525. this.$axios({
  526. method: 'POST',
  527. url: '/api/api_gateway?method=base.bases.base_list',
  528. data: this.qs.stringify({
  529. ret: 'details',
  530. base_id: id
  531. })
  532. }).then((res) => {
  533. let item = res.data.data[0]
  534. this.addBaseInfo.baseName = item.base_name
  535. this.addBaseInfo.principal = item.base_charge
  536. this.addBaseInfo.phone = item.base_phone
  537. this.addBaseInfo.area = item.base_area
  538. this.addBaseInfo.imgSrc = `/api/${item.base_img}`
  539. this.addBaseInfo.bindEquip = item.base_equip
  540. this.addBaseInfo.baseIntro = item.base_describe
  541. this.addBaseInfo.address = `lng:${item.lng},lat:${item.lat}`
  542. this.addBaseInfo.lat = item.lat
  543. this.addBaseInfo.lng = item.lng
  544. this.getEquipList(id) //获取所有未绑定和已绑定的设备
  545. this.dialogTxt = '编辑基地'
  546. this.baseAddVisible = true
  547. })
  548. },
  549. addBase(title) {
  550. this.title = title
  551. this.flag = 2
  552. this.getEquipList('')
  553. this.baseAddVisible = true
  554. this.dialogTxt = '新建基地'
  555. },
  556. delBase(id) {
  557. console.log(id)
  558. this.$confirm(`确定删除基地么?`, '提示', {
  559. confirmButtonText: '确定',
  560. cancelButtonText: '取消',
  561. type: 'warning'
  562. })
  563. .then(() => {
  564. this.$axios({
  565. method: 'POST',
  566. url: '/api/api_gateway?method=base.bases.base_list',
  567. data: this.qs.stringify({
  568. ret: 'del',
  569. base_id: id
  570. })
  571. }).then((res) => {
  572. this.getBaseList()
  573. this.$message({
  574. type: 'success',
  575. message: '删除成功!'
  576. })
  577. })
  578. })
  579. .catch(() => {
  580. this.$message({
  581. type: 'info',
  582. message: '已取消删除'
  583. })
  584. })
  585. },
  586. detailBase(id) {
  587. this.$router.push({ path: '/index/baseShow', query: { id: id } })
  588. }
  589. }
  590. }
  591. </script>
  592. <style lang="less" scoped>
  593. .boxCard {
  594. position: relative;
  595. .baseCard {
  596. display: flex;
  597. .baseImg {
  598. flex: 1;
  599. overflow: hidden;
  600. height: 160px;
  601. img {
  602. width: 100%;
  603. height: auto;
  604. }
  605. }
  606. .addBaseInfo {
  607. flex: 1;
  608. padding-left: 15px;
  609. h2 {
  610. font-size: 16px;
  611. margin-bottom: 10px;
  612. white-space: nowrap;
  613. overflow: hidden;
  614. text-overflow: ellipsis;
  615. width: 80%;
  616. }
  617. .addBaseInfoDetails {
  618. display: flex;
  619. padding-bottom: 10px;
  620. color: #525252;
  621. line-height: 18px;
  622. font-size: 14px;
  623. i {
  624. font-size: 14px;
  625. }
  626. .caption {
  627. margin-left: 5px;
  628. width: 70px;
  629. flex-grow: 0;
  630. flex-shrink: 0;
  631. text-align: left;
  632. }
  633. .addr {
  634. flex-grow: 1;
  635. text-overflow: -o-ellipsis-lastline;
  636. overflow: hidden;
  637. text-overflow: ellipsis;
  638. display: -webkit-box;
  639. -webkit-line-clamp: 2;
  640. line-clamp: 2;
  641. -webkit-box-orient: vertical;
  642. min-height:40px;
  643. }
  644. }
  645. }
  646. }
  647. .baseEditBox {
  648. position: absolute;
  649. right: 20px;
  650. top: 0;
  651. cursor: pointer;
  652. img {
  653. width: 35px;
  654. }
  655. }
  656. .baseBtn {
  657. position: absolute;
  658. right: 20px;
  659. bottom: 10px;
  660. line-height: 22px;
  661. span {
  662. display: inline-block;
  663. width: 60px;
  664. border-radius: 20px;
  665. color: #666;
  666. text-align: center;
  667. cursor: pointer;
  668. }
  669. .delBtn {
  670. background: #ddd;
  671. }
  672. .detailBtn {
  673. background: #14a478;
  674. color: #fff;
  675. margin-right: 10px;
  676. }
  677. }
  678. }
  679. .avatar-uploader {
  680. /deep/.el-upload {
  681. .el-upload-dragge {
  682. width: 100%;
  683. height: 100%;
  684. }
  685. }
  686. }
  687. .col-item {
  688. height: 223px;
  689. }
  690. .cropper {
  691. width: auto;
  692. height: 300px;
  693. }
  694. .addressItem {
  695. /deep/.el-form-item__content {
  696. display: flex;
  697. .el-input {
  698. flex: 1;
  699. margin-right: 15px;
  700. }
  701. }
  702. }
  703. .Bmap {
  704. width: 100%;
  705. height: 400px;
  706. }
  707. // 暂无数据
  708. .expertDiagnosis_referral_units_not {
  709. width: 272px;
  710. margin: 0 auto;
  711. }
  712. </style>