StepFirst.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  1. <template>
  2. <!--填写注册信息-->
  3. <div class="section" @click="onHideAddress">
  4. <div class="register">
  5. <div class="x-form-set-header">
  6. <h4>企业注册信息</h4>
  7. </div>
  8. <div class="row">
  9. <label class="col-sm-2 x-required">企业名称:</label>
  10. <div class="col-sm-5">
  11. <input type="text" @change="nameCheck" :disabled="!loginData.isSelf" v-model="data.name" class="form-control" name="name" required="" placeholder="填写营业执照上的企业名称">
  12. </div>
  13. <div class="col-sm-5" v-show="!validName.isValidTypeName && !validName.init">
  14. <p>
  15. <i class="fa fa-info-circle"></i>请填写正确的企业名称,2~99个字符
  16. </p>
  17. </div>
  18. <div class="col-sm-5" v-show="!validName.isValidName && !validName.init">
  19. <p>
  20. <i class="fa fa-info-circle"></i>注册的企业名称已存在,请联系管理员
  21. </p>
  22. </div>
  23. </div>
  24. <div class="row">
  25. <label class="col-sm-2 x-required">企业简称:</label>
  26. <div class="col-sm-5">
  27. <input type="text" :disabled="!loginData.isSelf" @change="simpleNameCheck" v-model="data.simpleName" class="form-control" name="name" required="" placeholder="请填写正确的企业名称,2~40个字符">
  28. </div>
  29. <div class="col-sm-5" v-show="!validSimpleName.isValidSimpleName && !validSimpleName.init">
  30. <p>
  31. <i class="fa fa-info-circle"></i>请填写正确的企业名称,2~40个字符
  32. </p>
  33. </div>
  34. </div>
  35. <div class="row">
  36. <label class="col-sm-2 x-required">营业执照:</label>
  37. <div class="col-sm-5">
  38. <a class="x-btn-blank" v-if="loginData.isSelf">
  39. <i class="fa fa-picture-o"></i>
  40. 请上传营业执照扫描件(≤5M的图片或PDF)
  41. <input type="file" @change="upload" class="form-control file-input" name="name" required="" placeholder="请上传营业执照扫描件(≤5M的图片或PDF)" accept="image/jpeg,image/jpg,image/gif,image/bmp,image/png,.pdf">
  42. </a>
  43. <img class="previewImg" v-if="data.url != ''" :src="isPdf?'/images/all/timg.png':data.url" alt="">
  44. </div>
  45. <div class="col-sm-5" v-show="!validUpload.isValidUpload && !validUpload.init"><p><i class="fa fa-info-circle"></i>请上传营业执照扫描件(≤5M的图片或PDF)</p></div>
  46. </div>
  47. <div class="row">
  48. <label class="col-sm-2 x-required">营业执照号:</label>
  49. <div class="col-sm-5">
  50. <input type="text" :disabled="!loginData.isSelf" @change="licenceCheck" v-model="data.licenceId" class="form-control" name="name" required="" placeholder="请填写营业执照上的注册号">
  51. </div>
  52. <div class="col-sm-5" v-show="!validLicence.isValidLicence && !validLicence.init"><p><i class="fa fa-info-circle"></i>请填写营业执照上的注册号</p></div>
  53. </div>
  54. <div class="row">
  55. <label class="col-sm-2 x-required">企业地址:</label>
  56. <div class="col-sm-5">
  57. <input type="text" readonly aria-haspopup="true" aria-expanded="false" @focus="onShowAddress" :style="!loginData.isSelf?'background-color: #eee;':''" :disabled="!loginData.isSelf" v-model="data.address" class="form-control" name="name" required="" placeholder="填写总部所在地详细地址" style="padding-left:20px;background-color: transparent;">
  58. <span class="fa fa-map-marker"></span>
  59. <div v-show="showAddressBox"
  60. @mouseenter="isInAddressBox = true"
  61. @mouseleave="isInAddressBox = false"
  62. style="display: block; left: 14px;" class="dropdown-menu x-union-menu" aria-labelledby="address">
  63. <div class="x-union-header">
  64. <div>省份</div>
  65. <div>城市</div>
  66. <div>县区</div>
  67. <div class="x-item-ext">详细地址</div>
  68. </div>
  69. <div class="x-union-list">
  70. <ul class="list-unstyled">
  71. <li v-for="province in cityData.province"
  72. :class="province == address.currentProvince ? 'active' : ''"
  73. v-text="province"
  74. @click="getCity(province)"></li>
  75. </ul>
  76. <ul class="list-unstyled">
  77. <li v-for="city in cityData.city"
  78. :class="city == address.currentCity ? 'active' : ''"
  79. v-text="city"
  80. @click="getDistrict(city)"></li>
  81. </ul>
  82. <ul class="list-unstyled">
  83. <li v-for="district in cityData.district"
  84. v-text="district"
  85. :class="district == address.currentDistrict ? 'active' : ''"
  86. @click="chooseDistrict(district)"></li>
  87. </ul>
  88. <div class="x-item-ext">
  89. <div class="form-group">
  90. <div class="col-sm-12">
  91. <textarea id="street" name="street" rows="4" v-model="address.detail" class="form-control x-input" placeholder="xx路xx大厦xx栋xx楼xx室"></textarea>
  92. </div>
  93. </div>
  94. <div class="text-right">
  95. <a class="register-btn btn-submit" @click="submitAddress">确定</a> <a @click="showAddressBox = false" class="register-btn btn-console">取消</a>
  96. </div>
  97. </div>
  98. </div>
  99. </div>
  100. </div>
  101. <div class="col-sm-5" v-show="!validAddress.isValidAddress && !validAddress.init"><p><i class="fa fa-info-circle"></i>填写总部所在地详细地址</p></div>
  102. </div>
  103. <div class="row">
  104. <label class="col-sm-2">官网地址:</label>
  105. <div class="col-sm-5">
  106. <input type="url" :disabled="!loginData.isSelf" @change="websiteCheck" v-model="data.website" class="form-control" name="name" required="" placeholder="www.example.com" style="padding-left:55px;">
  107. <span class="web">http://</span>
  108. </div>
  109. <div class="col-sm-5"></div>
  110. </div>
  111. <div class="row next-btn"><button class="btn" :style="loginData.isSelf && !isValid ? 'opacity: .65;':''" @click="sectionChange(2)">下一步</button></div>
  112. </div>
  113. </div>
  114. </template>
  115. <script>
  116. export default {
  117. data () {
  118. return {
  119. data: {
  120. name: '',
  121. simpleName: '',
  122. url: '',
  123. licenceId: '',
  124. address: '',
  125. website: ''
  126. },
  127. validName: {
  128. isValidTypeName: true,
  129. isValidName: true,
  130. init: true
  131. },
  132. validUpload: {
  133. isValidUpload: true,
  134. init: true
  135. },
  136. validLicence: {
  137. isValidLicence: true,
  138. init: true
  139. },
  140. validSimpleName: {
  141. isValidSimpleName: true,
  142. init: true
  143. },
  144. validAddress: {
  145. isValidAddress: true,
  146. init: true
  147. },
  148. isValid: false,
  149. isPdf: false,
  150. showAddressBox: false,
  151. isInAddressBox: false,
  152. temCityData: {},
  153. cityData: {
  154. province: [],
  155. city: [],
  156. district: []
  157. },
  158. address: {
  159. currentProvince: '',
  160. currentCity: '',
  161. currentDistrict: '',
  162. detail: ''
  163. }
  164. }
  165. },
  166. props: ['loginData', 'enterpriseData', 'businessImgUrl'],
  167. watch: {
  168. enterpriseData: function (val, oldVal) {
  169. if (val !== {}) {
  170. this.data.name = val.enName || ''
  171. this.data.simpleName = val.enShortname || ''
  172. this.data.licenceId = val.enBussinessCode || ''
  173. this.data.address = val.enAddress || ''
  174. this.data.website = val.enUrl || ''
  175. this.data.url = val.enBussinessCodeImage || ''
  176. if (this.loginData.isSelf) {
  177. this.nameCheck()
  178. this.simpleNameCheck()
  179. this.licenceCheck()
  180. this.addressCheck()
  181. this.websiteCheck()
  182. this.imgUrlCheck()
  183. this.checkFullData()
  184. this.submitRegisterData()
  185. }
  186. }
  187. },
  188. businessImgUrl: function (val, oldVal) {
  189. this.data.url = val
  190. this.checkFullData()
  191. this.submitRegisterData()
  192. }
  193. },
  194. mounted () {
  195. this.$http.get('/data/city.json').then(response => {
  196. this.temCityData = response.data
  197. for (let province in response.data) {
  198. this.cityData.province.push(province)
  199. }
  200. })
  201. },
  202. methods: {
  203. sectionChange: function (type) {
  204. if (this.loginData.isSelf && !this.isValid) {
  205. this.$message.error('请填写正确的注册信息')
  206. } else {
  207. this.checkFullData()
  208. let enterprise = {
  209. enName: this.data.name,
  210. enShortName: this.data.simpleName,
  211. enBussinessCode: this.data.licenceId,
  212. enAddress: this.data.address,
  213. enUrl: this.data.website
  214. }
  215. let data = {}
  216. data.enterprise = enterprise
  217. data.isValidRegister = this.isValid
  218. data.url = this.data.url
  219. enterprise.enIsRead = false
  220. enterprise.enBussinessCodeImage = this.data.url
  221. if (this.loginData.isSelf) {
  222. this.$http.post('/basic/user/userCacheEnterprise', enterprise)
  223. this.$emit('isSelfCacheDataAction', enterprise)
  224. }
  225. this.$emit('registerAction', data)
  226. this.$emit('sectionEvent', type)
  227. }
  228. },
  229. upload: function (e) {
  230. let file = e.target.files[0]
  231. this.validUpload.init = false
  232. if (file.size > 5 * 1024 * 1024) {
  233. this.validUpload.isValidUpload = false
  234. } else {
  235. this.validUpload.isValidUpload = true
  236. if (file.type !== 'application/pdf') {
  237. this.isPdf = false
  238. let param = new FormData()
  239. param.append('file', file, file.name)
  240. param.append('chunk', '0')
  241. let config = {
  242. headers: {'Content-Type': 'multipart/form-data'}
  243. }
  244. this.$http.post('/api/images', param, config)
  245. .then(response => {
  246. this.data.url = response.data[0].path
  247. this.$emit('businessImgUrlAction', this.data.url)
  248. }, err => {
  249. console.log(err)
  250. this.validUpload.isValidUpload = false
  251. })
  252. } else {
  253. let param = new FormData()
  254. param.append('file', file, file.name)
  255. let config = {
  256. headers: {'Content-Type': file.type}
  257. }
  258. this.$http.post('/file', param, config)
  259. .then(response => {
  260. this.isPdf = true
  261. this.data.url = response.data[0].path
  262. this.$emit('businessImgUrlAction', this.data.url)
  263. }, err => {
  264. console.log(err)
  265. this.validUpload.isValidUpload = false
  266. })
  267. }
  268. }
  269. this.validCheck()
  270. },
  271. validCheck: function () {
  272. this.isValid =
  273. this.validUpload.isValidUpload && !this.validUpload.init &&
  274. this.validName.isValidTypeName && !this.validName.init && this.validName.isValidName &&
  275. this.validLicence.isValidLicence && !this.validLicence.init &&
  276. this.validSimpleName.isValidSimpleName && !this.validSimpleName.init &&
  277. this.validAddress.isValidAddress && !this.validAddress.init
  278. },
  279. checkFullData: function () {
  280. this.isValid =
  281. this.validUpload.isValidUpload &&
  282. this.validName.isValidTypeName && this.validName.isValidName &&
  283. this.validLicence.isValidLicence &&
  284. this.validSimpleName.isValidSimpleName &&
  285. this.validAddress.isValidAddress
  286. },
  287. nameCheck: function () {
  288. this.validName.init = false
  289. this.$http.post('/basic/enterprise/register/valid/name?name=' + this.data.name)
  290. .then(response => {
  291. this.validName.isValidName = response.data.success
  292. })
  293. this.validName.isValidTypeName = this.data.name !== '' && this.data.name.length >= 2 && this.data.name.length <= 99 && this.commonValid(this.data.name)
  294. this.validCheck()
  295. },
  296. simpleNameCheck: function () {
  297. this.validSimpleName.init = false
  298. this.validSimpleName.isValidSimpleName = this.data.simpleName !== '' && this.data.simpleName.length >= 2 && this.data.simpleName.length <= 40 && this.commonValid(this.data.simpleName)
  299. this.validCheck()
  300. },
  301. imgUrlCheck: function () {
  302. this.validUpload.init = false
  303. this.validUpload.isValidUpload = this.data.url !== ''
  304. },
  305. licenceCheck: function () {
  306. this.validLicence.init = false
  307. this.$http.post('/basic/enterprise/register/valid/businessCode?businessCode=' + this.data.licenceId)
  308. .then(response => {
  309. this.validLicence.isValidLicence = response.data.success && this.data.licenceId
  310. })
  311. this.validCheck()
  312. },
  313. addressCheck: function () {
  314. this.validAddress.init = false
  315. this.validAddress.isValidAddress = this.data.address !== ''
  316. this.validCheck()
  317. },
  318. websiteCheck: function () {
  319. // (/^([\w-]+\.)+[\w-]+(/[\w-./?%&=])?$/).test(this.messageBoard.userTel)
  320. },
  321. commonValid: function (str) {
  322. return str.indexOf(' ') === -1
  323. },
  324. submitRegisterData: function () {
  325. let enterprise = {
  326. enName: this.data.name,
  327. enShortName: this.data.simpleName,
  328. enBussinessCode: this.data.licenceId,
  329. enAddress: this.data.address,
  330. enUrl: this.data.website
  331. }
  332. let data = {}
  333. data.enterprise = enterprise
  334. data.isValidRegister = this.isValid
  335. data.url = this.data.url
  336. this.$emit('registerAction', data)
  337. },
  338. onShowAddress: function () {
  339. this.showAddressBox = true
  340. this.isClickInputAddress = true
  341. },
  342. onHideAddress: function () {
  343. if (!this.isInAddressBox && !this.isClickInputAddress) {
  344. this.showAddressBox = false
  345. }
  346. this.isClickInputAddress = false
  347. },
  348. getCity: function (province) {
  349. this.cityData.city = []
  350. this.address.currentProvince = province
  351. for (let item in this.temCityData[province]) {
  352. this.cityData.city.push(item)
  353. }
  354. },
  355. getDistrict: function (city) {
  356. this.address.currentCity = city
  357. this.cityData.district = this.temCityData[this.address.currentProvince][city]
  358. },
  359. chooseDistrict: function (district) {
  360. this.address.currentDistrict = district
  361. },
  362. submitAddress: function () {
  363. if (this.address.detail !== '') {
  364. this.data.address = this.address.currentProvince + this.address.currentCity + this.address.currentDistrict + this.address.detail
  365. this.showAddressBox = false
  366. this.addressCheck()
  367. } else {
  368. this.$message.error('请输入详细地址')
  369. }
  370. }
  371. }
  372. }
  373. </script>
  374. <style scoped>
  375. .register input[type="file"] {
  376. display: block;
  377. }
  378. .previewImg {
  379. max-height: 200px;
  380. max-width: 200px;
  381. margin-top: 5px;
  382. }
  383. .x-union-menu {
  384. width: 600px
  385. }
  386. .x-union-header>div{
  387. background: #f5f8fa;
  388. font-weight: 700;
  389. border-bottom: 1px solid #e4ecf3;
  390. }
  391. .x-union-header>div,.x-union-list>ul {
  392. float: left;
  393. width: 121px;
  394. border-right: 1px solid #e4ecf3;
  395. }
  396. .x-union-list>ul {
  397. height: 200px;
  398. margin: 0;
  399. overflow-y: auto;
  400. }
  401. .x-union-menu .x-item-ext {
  402. float: left;
  403. width: 235px;
  404. }
  405. .x-union-list .x-item-ext {
  406. padding: 10px
  407. }
  408. .x-union-header>div:last-child {
  409. border-right-width: 0
  410. }
  411. .x-union-header>div,.x-union-list>ul>li {
  412. padding: 2px 10px;
  413. cursor: pointer;
  414. }
  415. .x-union-list>ul>li:hover,.x-union-list>ul>li.active {
  416. background: #fee9c7;
  417. }
  418. .x-input {
  419. border-color: #ccc;
  420. border-radius: 0;
  421. box-shadow: none;
  422. }
  423. textarea.form-control {
  424. height: auto;
  425. }
  426. .text-right {
  427. text-align: right;
  428. }
  429. .register-btn {
  430. padding: 5px 10px;
  431. font-size: 12px;
  432. line-height: 1.5;
  433. }
  434. .btn-submit {
  435. background: #5078cb;
  436. color: #fff;
  437. }
  438. .btn-console {
  439. border: 1px solid #ccc;
  440. background: #fff;
  441. color: #888;
  442. margin-left: 5px;
  443. transition: all .2s ease-in-out;
  444. }
  445. .btn-console:hover {
  446. border: 1px solid #adadad;
  447. background: #e6e6e6;
  448. color: #333;
  449. }
  450. </style>