account-info.component.ts 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. import { Component, OnInit, ViewChild } from '@angular/core';
  2. import { ReactiveFormsModule } from '@angular/forms';
  3. import { HttpClient } from '@angular/common/http';
  4. import { Router } from '@angular/router';
  5. import { catchError } from 'rxjs/operators';
  6. import { NzUploadModule } from 'ng-zorro-antd/upload';
  7. import { NzModalModule, NzModalService } from 'ng-zorro-antd/modal';
  8. import {
  9. FormControl,
  10. FormGroup,
  11. NonNullableFormBuilder,
  12. Validators,
  13. } from '@angular/forms';
  14. import { CommonCompModule } from '../common.modules';
  15. import { textbookServer } from '../../../services/textbook';
  16. import { AuthServr } from '../../../services/auth.service';
  17. import { CaptchaComponent } from '../../../app/captcha/captcha.component';
  18. import { NzMessageService } from 'ng-zorro-antd/message';
  19. import { provinces } from '../../../services/provinces';
  20. import { CompUploadComponent } from '../../../app/comp-upload/comp-upload.component';
  21. import Parse from 'parse';
  22. import { NzGridModule } from 'ng-zorro-antd/grid';
  23. import { NzSpinModule } from 'ng-zorro-antd/spin';
  24. @Component({
  25. selector: 'app-account-info',
  26. standalone: true,
  27. imports: [
  28. ReactiveFormsModule,
  29. CommonCompModule,
  30. CaptchaComponent,
  31. NzUploadModule,
  32. NzModalModule,
  33. CompUploadComponent,
  34. NzGridModule,
  35. NzSpinModule
  36. ],
  37. templateUrl: './account-info.component.html',
  38. styleUrls: ['./account-info.component.scss'],
  39. })
  40. export class AccountInfoComponent implements OnInit {
  41. url: string = `"http://hep-textbook.oss-cn-beijing.aliyuncs.com/6687b9417f823ff53c74cfd6/2024-7-15/1721044465100-%E2%80%9C%E5%8D%81%E5%9B%9B%E4%BA%94%E2%80%9D%E6%99%AE%E9%80%9A%E9%AB%98%E7%AD%89%E6%95%99%E8%82%B2%E6%9C%AC%E7%A7%91%E5%9B%BD%E5%AE%B6%E7%BA%A7%E8%A7%84%E5%88%92%E6%95%99%E6%9D%90%E6%8E%A8%E8%8D%90%E9%81%B4%E9%80%89%E5%B7%A5%E4%BD%9C%E8%81%94%E7%B3%BB%E4%BA%BA%E4%BF%A1%E6%81%AF%E8%A1%A8.doc"`;
  42. user: Parse.Object | undefined;
  43. validateForm: FormGroup<{
  44. username: FormControl<string>;
  45. password: FormControl<string>;
  46. name: FormControl<string>; //姓名
  47. phone: FormControl<string>; //手机号
  48. email: FormControl<string>; //电子邮箱
  49. // identity: FormControl<string>; //人员类型
  50. // telephone: FormControl<string>; //办公电话
  51. // province: FormControl<string>; //省份
  52. // idcard: FormControl<string>; //身份证号
  53. // departmentName: FormControl<string>; //所在部门
  54. // postName: FormControl<string>; //职务
  55. }> = this.fb.group({
  56. username: ['', [Validators.required]],
  57. password: ['', [Validators.required]],
  58. name: ['', [Validators.required]],
  59. phone: [''],
  60. email: ['', [Validators.required]],
  61. // identity: ['工作联系人', [Validators.required]],
  62. // telephone: [''],
  63. // province: [''],
  64. // idcard: ['', [Validators.required]],
  65. // departmentName: [''],
  66. // postName: [''],
  67. });
  68. identity:string = '工作联系人' //人员类型
  69. companyType: string = ''; //单位类型
  70. identityFile: string = ''; //单位联系人认证文件
  71. companyId: string = ''; //单位名称
  72. provinces: Array<string> = provinces.options; //省份
  73. unitTypes: Array<any> = [];
  74. companys: Array<any> = [];
  75. userType: Array<string> = ['工作联系人'];
  76. constructor(
  77. public tbookSer: textbookServer,
  78. private fb: NonNullableFormBuilder,
  79. public router: Router,
  80. private authServr: AuthServr,
  81. private message: NzMessageService,
  82. private modal: NzModalService,
  83. private http: HttpClient
  84. ) {}
  85. async ngOnInit() {
  86. let user = Parse.User.current();
  87. if (user?.id) {
  88. this.message.success('请先退出登录');
  89. history.back();
  90. }
  91. // this.user = user;
  92. await this.getUnitTypes();
  93. // if (user?.get('accountState') == '已认证') {
  94. // this.message.success('账号已认证,无需重复认证');
  95. // this.authServr.profileVerify(this.modal);
  96. // return;
  97. // } else if (user?.get('accountState') == '已禁用') {
  98. // this.message.success('账号已禁用');
  99. // this.router.navigate(['/user/register'], { replaceUrl: true });
  100. // return;
  101. // }
  102. // let queryProfile = new Parse.Query('Profile');
  103. // queryProfile.equalTo('user', user?.id);
  104. // let profile = await queryProfile.first();
  105. // this.validateForm = this.fb.group({
  106. // username: [user?.get('username'), [Validators.required]],
  107. // password: ['', [Validators.required]],
  108. // name: [user?.get('name') || '', [Validators.required]],
  109. // phone: [user?.get('phone') || ''],
  110. // email: [user?.get('email') || '', [Validators.required]],
  111. // // telephone: [profile?.get('telephone') || ''],
  112. // // province: [user?.get('province') || ''],
  113. // identity: [profile?.get('identity') || '', [Validators.required]],
  114. // // departmentName: [user?.get('departmentName') || ''],
  115. // // postName: [profile?.get('postName') || ''],
  116. // });
  117. // this.identityFile = profile?.get('identityFile') || ''
  118. // this.companyId = user?.get('department')?.id || '';
  119. // this.companyType = profile?.get('companyType') || ''
  120. this.provinceChange();
  121. }
  122. async getUnitTypes() {
  123. let query = new Parse.Query('Department');
  124. query.equalTo('branch', undefined);
  125. query.equalTo('parent', undefined);
  126. query.notEqualTo('isDeleted', true);
  127. query.descending('createdAt')
  128. query.select('name');
  129. let r = await query.find();
  130. r.forEach((item) => {
  131. this.unitTypes.push({ id: item.id, name: item.get('name') });
  132. });
  133. }
  134. //根据所选单位类型获取对应单位
  135. async provinceChange(val?: string, isChange?: boolean) {
  136. // console.log(val);
  137. if (isChange) this.companyId = '';
  138. this.companys = [];
  139. let parent = this.unitTypes.find((item) => item.name == this.companyType);
  140. // console.log(parent);
  141. if (!parent?.id) return;
  142. let query = new Parse.Query('Department');
  143. query.equalTo('parent', parent?.id);
  144. query.select('name', 'branch');
  145. query.notEqualTo('isDeleted', true);
  146. query.limit(100);
  147. val && query.contains('name', val);
  148. let r = await query.find();
  149. if (r.length > 0) {
  150. this.companys = r.map((item: Parse.Object) => {
  151. return { id: item.id, name: item.get('name') };
  152. });
  153. }
  154. }
  155. submitForm(): void {
  156. console.log(this.validateForm.value);
  157. console.log(this.companyId);
  158. if (this.validateForm.valid) {
  159. if (!this.companyId) {
  160. this.message.error('单位名称未选择或与单位类型不匹配,请重新选择');
  161. return;
  162. }
  163. let a =
  164. /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
  165. if (!String(this.validateForm.value.email).match(a)) {
  166. this.message.error('邮箱格式不正确');
  167. return;
  168. }
  169. let m =
  170. /^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[1589]))\d{8}$/;
  171. if (!String(this.validateForm.value.phone).match(m)) {
  172. this.message.error('手机号格式不正确');
  173. return;
  174. }
  175. if (!this.identityFile) {
  176. this.message.error('请上传单位联系人认证文件');
  177. return;
  178. }
  179. let params = this.validateForm.value;
  180. this.profileSave(params);
  181. } else {
  182. this.message.warning('请填写完整的信息');
  183. Object.values(this.validateForm.controls).forEach((control) => {
  184. if (control.invalid) {
  185. control.markAsDirty();
  186. control.updateValueAndValidity({ onlySelf: true });
  187. }
  188. });
  189. }
  190. }
  191. loading:boolean = false
  192. async profileSave(params: any) {
  193. this.loading = true
  194. try {
  195. if(!await this.tbookSer.userFind(params.phone)){
  196. this.message.error('手机号已存在');
  197. this.loading = false
  198. return
  199. }
  200. let queryDepart = new Parse.Query('Department');
  201. queryDepart.equalTo('objectId', this.companyId);
  202. queryDepart.select('objectId');
  203. let depart = await queryDepart.first();
  204. if (!depart?.id) {
  205. this.message.error('单位名称未选择或与单位类型不匹配,请重新选择');
  206. this.loading = false
  207. return;
  208. }
  209. let u = Parse.Object.extend('_User');
  210. this.user = new u();
  211. this.user?.set('username', params.username);
  212. this.user?.set('password', params.password);
  213. this.user?.set('name', params.name);
  214. this.user?.set('email', params.email);
  215. this.user?.set('phone', params.phone);
  216. // this.user?.set('province', params.province);
  217. this.user?.set('companyName', depart?.get('name'));
  218. // if(this.validateForm.value.identity == '工作联系人'){
  219. this.user?.set('department', {
  220. __type: 'Pointer',
  221. className: 'Department',
  222. objectId: depart?.id,
  223. });
  224. // }
  225. !this.user?.get('accountState') &&
  226. this.user?.set('accountState', '待认证');
  227. // this.user?.set('departmentName', params.departmentName);
  228. let saveUser = await this.user?.save();
  229. let query = new Parse.Query('Profile');
  230. query.equalTo('user', Parse.User.current()?.id);
  231. query.notEqualTo('isDeleted', true);
  232. let profile = await query.first();
  233. if (!profile?.id) {
  234. let obj = Parse.Object.extend('Profile');
  235. profile = new obj();
  236. }
  237. profile?.set('user', saveUser?.toPointer());
  238. profile?.set('company', {
  239. __type: 'Pointer',
  240. className: 'Company',
  241. objectId: this.tbookSer.company,
  242. });
  243. // profile?.set('telephone', params.telephone);
  244. // if(this.validateForm.value.identity == '工作联系人'){
  245. profile?.set('companyType', this.companyType);
  246. profile?.set('identityFile', this.identityFile);
  247. // }
  248. profile?.set('email', params.email);
  249. // profile?.set('idcard', params.idcard);
  250. // profile?.set('postName', params.postName);
  251. profile?.set('identity', this.identity);
  252. let res = await profile?.save();
  253. this.loading = false
  254. this.modal.success({
  255. nzTitle: '提交成功',
  256. nzContent: `<p>请妥善保管您的用户名和密码,待审核认证通过后即可使用邮箱/手机号/用户名和密码登录</p>`,
  257. nzOnOk: () =>
  258. this.router.navigate(['/user/login'], { replaceUrl: true }),
  259. });
  260. Parse.Cloud.run('aliSmsSend',{
  261. "mobileList": [params.phone],"templateCode":"SMS_469060724","params":{},"signName":"普通高等教育教材网"
  262. })
  263. } catch (err: any) {
  264. this.loading = false
  265. console.log(err?.message);
  266. let msg = '注册失败';
  267. switch (err?.message) {
  268. case 'Account already exists for this email address.':
  269. msg = '注册失败,邮箱已存在';
  270. break;
  271. case 'Account already exists for this username.':
  272. msg = '注册失败,用户名已存在';
  273. break;
  274. }
  275. this.message.warning(msg);
  276. }
  277. }
  278. upload(e: any) {
  279. console.log(e);
  280. let file = e[0];
  281. this.identityFile = file?.url;
  282. }
  283. //验证手机号或邮箱是否注册
  284. async authUser(): Promise<boolean> {
  285. let query = new Parse.Query('_User');
  286. if (this.validateForm.value.phone) {
  287. query.equalTo('phone', this.validateForm.value.phone);
  288. let r = await query.first();
  289. if (r?.id) {
  290. this.message.warning('手机号已被注册');
  291. return false;
  292. }
  293. } else if (this.validateForm.value.email) {
  294. query.equalTo('email', this.validateForm.value.email);
  295. let r = await query.first();
  296. if (r?.id) {
  297. this.message.warning('邮箱已被注册');
  298. return false;
  299. }
  300. }
  301. return true;
  302. }
  303. back(){
  304. history.back()
  305. }
  306. }