diff --git a/api/api_v1/endpoints/interview.py b/api/api_v1/endpoints/interview.py index 8e7409e..6f44a05 100644 --- a/api/api_v1/endpoints/interview.py +++ b/api/api_v1/endpoints/interview.py @@ -18,6 +18,7 @@ from core.security import get_password_hash from schemas import ExtendendOAuth from utils.dingding import * from utils.jianli import get_resume +from utils.re_to_jianli import fmt_txt, getText_pdf from utils.func import get_uid import crud, schemas from datetime import datetime @@ -377,7 +378,8 @@ async def interview_file_insert( try: res = obsClient.getObject('legu-cdn-source', data_in.filenames, path_data + '/' + filename) if res.status < 300: - data = get_resume(filename, path_data) + chk_txt = getText_pdf(filename) + data = fmt_txt(chk_txt) education = data['education'] # 学历int转化 education_int = { diff --git a/utils/re_to_jianli.py b/utils/re_to_jianli.py new file mode 100644 index 0000000..3636727 --- /dev/null +++ b/utils/re_to_jianli.py @@ -0,0 +1,1364 @@ +#!/usr/bin/python +# coding:utf-8 +from LAC import LAC +import re, os +import copy +import pdfplumber +from win32com import client as wc + +lac = LAC(mode='lac') + + +def Translate(input, output): + # 转换 + wordapp = wc.Dispatch('Word.Application') + doc = wordapp.Documents.Open(input) + # 为了让python可以在后续操作中r方式读取txt和不产生乱码,参数为4 + doc.SaveAs(output, 4) + doc.Close() + + +def getText_pdf(filename): + """将pdf读成text""" + with pdfplumber.open(filename) as pdf_file: + content = '' + for i in range(len(pdf_file.pages)): + page_text = pdf_file.pages[i] + page_content = page_text.extract_text() + if page_content: + content = content + page_content + "\n" + return content + + +def fmt_txt(chk_str): + true_chkStr = chk_str + regex = re.compile(r":\n*") + regex1 = re.compile(r":\n*") + true_chkStr = regex.sub(':', true_chkStr) + true_chkStr = regex1.sub(':', true_chkStr) + + dict_chk = { + "interview_name": "", + "interview_type": 1, + "interview_sign": 0, + "hope_money": "", + "feedback": 0, + "interview_round": 0, + "event_time": "", + "name": "", + "phone": "", + "job_name": "", + "hr_name": "", + "work_exp": 0, + "interview_stage": 1, + "owner_name": 2, + "education": 1, + "work_undergo": [], + "project_undergo": [], + "work_list": [], + "school": "", + "at_school": "", + "specialty": "", + "specialty_do": [], + "mmended_state": 0, + "mail": "", + "account": "", + "id_card": "", + "gender": "", + "age": 0, + "gam": "", + "interview_state": 1, + "counts": 1, + "nation": "汉", + "review": [], + "upgrade": [], + "come_time": "", + "now_money": "", + "men_state": 1, + "teacher_state": 1, + "teacher_back": 1, + "offer_state": 1, + "offer_exam_state": 1, + "notice_state": 1, + "pass_why": 0, + "pass_text": "", + "file_url": '', + "now_address": '', + "birthday": '', +} + # 姓名 + chk_name = r'[赵|钱|孙|李|周|吴|郑|王|冯|陈|褚|卫|蒋|沈|韩|杨|朱|秦|尤|许|何|吕|施|张|孔|曹|严|华|金|魏|陶|姜|戚|谢|邹|喻|柏|水|窦|章|云|苏|潘|葛|奚|范|彭|郎|鲁|韦|昌|马|苗|凤|花|方|俞|任|袁|柳|酆|鲍|史|唐|费|廉|岑|薛|雷|贺|倪|汤|滕|殷|罗|毕|郝|邬|安|常|乐|于|时|傅|皮|卞|齐|康|伍|余|元|卜|顾|孟|平|黄|和|穆|萧|尹|姚|邵|湛|汪|祁|毛|禹|狄|米|贝|明|臧|计|伏|成|戴|谈|宋|茅|庞|熊|纪|舒|屈|项|祝|董|梁|杜|阮|蓝|闵|席|季|麻|强|贾|路|娄|危|江|童|颜|郭|梅|盛|林|刁|锺|徐|邱|骆|高|夏|蔡|田|樊|胡|凌|霍|虞|万|支|柯|昝|管|卢|莫|经|房|裘|缪|干|解|应|宗|丁|宣|贲|邓|郁|单|杭|洪|包|诸|左|石|崔|吉|钮|龚|程|嵇|邢|滑|裴|陆|荣|翁|荀|羊|於|惠|甄|麴|家|封|芮|羿|储|靳|汲|邴|糜|松|井|段|富|巫|乌|焦|巴|弓|牧|隗|山|谷|车|侯|宓|蓬|全|郗|班|仰|秋|仲|伊|宫|宁|仇|栾|暴|甘|钭|历|戎|祖|武|符|刘|景|詹|束|龙|叶|幸|司|韶|郜|黎|溥|印|宿|白|怀|蒲|邰|从|鄂|索|咸|籍|卓|蔺|屠|蒙|池|乔|阳|郁|胥|能|苍|双|闻|莘|党|翟|谭|贡|劳|逄|姬|申|扶|堵|冉|宰|郦|雍|却|桑|桂|濮|牛|寿|通|边|扈|燕|冀|浦|尚|农|温|别|庄|晏|柴|瞿|充|慕|连|茹|习|宦|艾|鱼|容|向|古|易|慎|戈|廖|庾|终|暨|居|衡|步|都|耿|满|弘|匡|国|文|寇|广|禄|阙|东|欧|沃|利|蔚|越|夔|隆|师|巩|厍|聂|晁|勾|敖|融|冷|訾|辛|阚|那|简|饶|空|曾|毋|沙|乜|养|鞠|须|丰|巢|关|蒯|相|荆|红|游|竺|权|司马|上官|欧阳|夏侯|诸葛|闻人|东方|赫连|皇甫|尉迟|公羊|澹台|公冶宗政|濮阳|淳于|单于|太叔|申屠|公孙|仲孙|轩辕|令狐|钟离|宇文|长孙|慕容|司徒|司空|召|有|舜|岳|黄辰|寸|贰|皇|侨|彤|竭|端|赫|实|甫|集|象|翠|狂|辟|典|良|函|芒|苦|其|京|中|夕|乌孙|完颜|富察|费莫|蹇|称|诺|来|多|繁|戊|朴|回|毓|鉏|税|荤|靖|绪|愈|硕|牢|买|但|巧|枚|撒|泰|秘|亥|绍|以|壬|森|斋|释|奕|姒|朋|求|羽|用|占|真|穰|翦|闾|漆|贵|代|贯|旁|崇|栋|告|休|褒|谏|锐|皋|闳|在|歧|禾|示|是|委|钊|频|嬴|呼|大|威|昂|律|冒|保|系|抄|定|化|莱|校|么|抗|祢|綦|悟|宏|功|庚|务|敏|捷|拱|兆|丑|丙|畅|苟|随|类|卯|俟|友|答|乙|允|甲|留|尾|佼|玄|乘|裔|延|植|环|矫|赛|昔|侍|度|旷|遇|偶|前|由|咎|塞|敛|受|泷|袭|衅|叔|圣|御|夫|仆|镇|藩|邸|府|掌|首|员|焉|戏|可|智|尔|凭|悉|进|笃|厚|仁|业|肇|资|合|仍|九|衷|哀|刑|俎|仵|圭|夷|徭|蛮|汗|孛|乾|帖|罕|洛|淦|洋|邶|郸|郯|邗|邛|剑|虢|隋|蒿|茆|菅|苌|树|桐|锁|钟|机|盘|铎|斛|玉|线|针|箕|庹|绳|磨|蒉|瓮|弭|刀|疏|牵|浑|恽|势|世|仝|同|蚁|止|戢|睢|冼|种|涂|肖|己|泣|潜|卷|脱|谬|蹉|赧|浮|顿|说|次|错|念|夙|斯|完|丹|表|聊|源|姓|吾|寻|展|出|不|户|闭|才|无|书|学|愚|本|性|雪|霜|烟|寒|少|字|桥|板|斐|独|千|诗|嘉|扬|善|揭|祈|析|赤|紫|青|柔|刚|奇|拜|佛|陀|弥|阿|素|长|僧|隐|仙|隽|宇|祭|酒|淡|塔|琦|闪|始|星|南|天|接|波|碧|速|禚|腾|潮|镜|似|澄|潭|謇|纵|渠|奈|风|春|濯|沐|茂|英|兰|檀|藤|枝|检|生|折|登|驹|骑|貊|虎|肥|鹿|雀|野|禽|飞|节|宜|鲜|粟|栗|豆|帛|官|布|衣|藏|宝|钞|银|门|盈|庆|喜|及|普|建|营|巨|望|希|道|载|声|漫|犁|力|贸|勤|革|改|兴|亓|睦|修|信|闽|北|守|坚|勇|汉|练|尉|士|旅|五|令|将|旗|军|行|奉|敬|恭|仪|母|堂|丘|义|礼|慈|孝|理|伦|卿|问|永|辉|位|让|尧|依|犹|介|承|市|所|苑|杞|剧|第|零|谌|招|续|达|忻|六|鄞|战|迟|候|宛|励|粘|萨|邝|覃|辜|初|楼|城|区|局|台|原|考|妫|纳|泉|老|清|德|卑|过|麦|曲|竹|百|福|言|第五|佟|爱|年|笪|谯|哈|墨|连|南宫|赏|伯|佴|佘|牟|商|西门|东门|左丘|梁丘|琴|后|况|亢|缑|帅|微生|羊舌|海|归|呼延|南门|东郭|百里|钦|鄢|汝|法|闫|楚|晋|谷梁|宰父|夹谷|拓跋|壤驷|乐正|漆雕|公西|巫马|端木|颛孙|子车|督|仉|司寇|亓官|三小|鲜于|锺离|盖|逯|库|郏|逢|阴|薄|厉|稽|闾丘|公良|段干|开|光|操|瑞|眭|泥|运|摩|伟|铁|迮][\u4e00-\u9fa5]{1,2}' + name = re.findall(chk_name, true_chkStr, re.M) + if name: + name_txt = ','.join(name) + rank_result = lac.run(name_txt) + for index, i in enumerate(rank_result[1]): + if i == 'PER': + dict_chk['name'] = rank_result[0][index] + break + + # 性别 + gender = re.findall(r'男|女', true_chkStr, re.M) + if gender: + dict_chk['gender'] = gender[0] + + # 电话 + phone = re.findall(r"(?<=\D)1\d{10}", true_chkStr, re.M) + if phone: + dict_chk['phone'] = phone[0] + + # 邮箱 + email = re.findall(r'[0-9a-zA-Z.]+@[0-9a-zA-Z.]+?com', true_chkStr, re.M) + if email: + dict_chk['mail'] = email[0] + else: + email1 = re.findall(r'<[a-zA-Z]+\s[a-zA-Z]+>\s[0-9a-zA-Z.]+@[0-9a-zA-Z.]+?org', true_chkStr, re.M) # mail + if email1: + dict_chk['mail'] = email1[0] + + # 应聘职位 + job = re.findall(r'职位.*?\n', true_chkStr, re.M) + if job: + job_str = job[0] + if '/' in job_str: + job_list = job_str.split('/') + job_str = job_list[0] + job_name = job_str.split(':')[-1] + job_name = job_name.replace('\n', '') + job_name.strip() + dict_chk['job_name'] = job_name + + # 学历 + education_list = ['大专', '本科', '博士', '硕士'] + for education in education_list: + if education in true_chkStr: + dict_chk['education'] = education + break + + # 工作经历 + work_exp = re.findall(r'.*?工作经验.*?\n', true_chkStr, re.M) + if work_exp: + work_exp_str = work_exp[0].replace('\n', '') + if '|' in work_exp_str: + work_exp_list = work_exp_str.split('|') + else: + work_exp_list = work_exp_str.split(' ') + for i in work_exp_list: + if '工作经验' in i: + true_work_exp_str = i.strip().replace('?', '') + dict_chk['work_exp'] = int(true_work_exp_str.split('年工作经验')[0]) + break + else: + work_exp = re.findall(r'.*?工作年限.*?\n', true_chkStr, re.M) # 工作经验 + if work_exp: + work_exp_str = work_exp[0].replace('\n', '') + if ':' in work_exp_str: + dict_chk['work_exp'] = int(work_exp_str.split(':')[-1].strip().split('年')[0]) + else: + dict_chk['work_exp'] = 0 + + # 毕业学校, 专业, 毕业时间, 学历 + school = re.findall(r'.*?学院.*?\n', true_chkStr, re.M) + if school: + school_str = school[0].replace('\n', '').strip() + if ' ' in school_str: + school_list = school_str.split(' ') + else: + school_list = [school_str] + else: + school = re.findall(r'.*?大学.*?\n', true_chkStr, re.M) + if school: + school_str = school[0].replace('\n', '').strip() + if ':' in school_str: + school_list = school_str.split(':') + else: + school_list = [school_str] + else: + school_list = [] + + if len(school_list) <= 1: + new_chk_str = true_chkStr.split('教育经历')[-1] + if new_chk_str: + bold = re.compile(r'\n') + true_chk = bold.sub(' ', new_chk_str, count=3) + school_str1 = re.findall(r'.*?学院.*?\n', true_chk, re.M)[0].replace('\n', '') + school_list = school_str1.split(' ') + + if school_list: + time_index = -1 + for index, i in enumerate(school_list): + chk_i = i.strip() + if chk_i in ['/', '|']: + continue + if time_index != -1 and index <= time_index: + continue + if '学院' in chk_i or '大学' in chk_i: + dict_chk['school'] = chk_i.strip().replace('?', '') + continue + if chk_i.replace('?', '').strip() in education_list: + dict_chk['education'] = chk_i.replace('?', '').strip() + continue + # 包含数字 + if bool(re.search(r'\d', chk_i)): + if '-' in chk_i: + dict_chk['at_school'] = chk_i + time_index = index + continue + time_index = index + 2 + dict_chk['at_school'] = school_list[index] + school_list[index + 1] + school_list[index + 2] + continue + if chk_i: + dict_chk['specialty'] = chk_i.replace('?', '').strip() + continue + else: + dict_chk.update({ + 'school': '', + 'graduate_time': '', + 'at_school': '', + 'specialty': '', + }) + if dict_chk.get('at_school', ''): + dict_chk['graduate_time'] = dict_chk['at_school'].split('-')[-1].strip() + + # 期望薪资 + hope_money = re.findall(r'.*?薪资.*?\n', true_chkStr, re.M) + if hope_money: + hope_list = hope_money[0].split('薪资:') + dict_chk['hope_money'] = hope_list[-1].replace('\n', '').strip() + else: + dict_chk['hope_money'] = '' + + # 身份证号r"[1-9]\d{5}(?:18|19|(?:[23]\d))\d{2}(?:(?:0[1-9])|(?:10|11|12))(?:(?:[0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]" + # ^([1-6][1-9]|50)\d{4}(18|19|20)\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$ + # ^([1-6][1-9]|50)\d{4}(18|19|20)\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$ + id_card = re.findall( + r"[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]", true_chkStr, + re.M) + if id_card: + dict_chk['id_card'] = id_card[0] + else: + dict_chk['hope_money'] = '' + + # 所在地 + account = re.findall(r'.*?地:.*?\n', true_chkStr, re.M) + if account: + account_str = account[0] + if '|' in account_str: + account_list = account_str.split('|') + dict_chk['account'] = account_list[0].split(':')[-1].strip('\n') + dict_chk['accounts'] = account_list[1].split(':')[-1].strip('\n') + else: + dict_chk['account'] = account_str.split(':')[-1].strip('\n') + dict_chk['accounts'] = '' + else: + dict_chk.update({ + 'account': '', + 'accounts': '' + }) + + # 年龄 + age = re.findall(r'.*?龄:.*?\n', true_chkStr, re.M) + if age: + age_str = age[0].replace(' ', '').replace('\n', '') + dict_chk['age'] = int(age_str.split(':')[-1]) + else: + age1 = re.findall(r'[0-9]{2}.*?岁', true_chkStr, re.M) + if age1: + age1_s = age1[0].replace(' ', '') + dict_chk['age'] = int(age1_s.split('岁')[0]) + else: + dict_chk['age'] = 20 + + # 民族 + nation = re.findall(r'.*?族:.*?\n', true_chkStr, re.M) + if nation: + nation_str = nation[0].replace(' ', '').replace('\n', '') + dict_chk['nation'] = int(nation_str.split(':')[-1]) + else: + dict_chk['nation'] = '汉' + + if '工作经历' not in true_chkStr: + work_undergo_str = true_chkStr.split('工作经验')[-1] + else: + work_undergo_str = true_chkStr.split('工作经历')[-1] + work_undergo_str1 = work_undergo_str.split('教育经历')[0] + work_str2 = work_undergo_str1.strip().strip('\n') + project_undergo = '' + if '项目经历' in work_str2: + project_undergo = work_str2.split('项目经历')[1] + work_str2 = work_str2.split('项目经历')[0] + else: + if '项目名称' in work_str2: + project_undergo = ''.join(i for i in work_str2.split('项目名称')[1:]) + work_str2 = work_str2.split('项目名称')[0] + project_undergo2 = project_undergo.strip().strip('\n') + str_2 = re.split('([0-9]{4}[/|.][0-9]{1,2})', work_str2) + project_list = re.split('([0-9]{4}[/|.][0-9]{1,2})', project_undergo2) + work_list = [] + project_undergo_list = [] + if project_list[0] == '': + project_list = project_list[1:] + # 数字开头 + if project_list[0][0].isdigit(): + index2 = -1 + new_str_list1 = [] + for index, i in enumerate(project_list): + if index <= index2: + continue + if not i: + continue + if i.strip() == '-': + index2 = index + 2 + new_str = project_list[index - 1] + i + project_list[index + 1] + project_list[index + 2] + new_str_list1.append(new_str) + continue + if i.strip() != '-' and '-' in i: + index2 = index + new_str = project_list[index - 1] + i + new_str_list1.append(new_str) + continue + if new_str_list1: + for project_str in new_str_list1: + project_name_time_str = project_str.split('\n')[0] + dict_project = { + 'name': '', + 'time': '', + 'comment': '', + 'work': '', + 'duty': '', + } + project_name_time_str2 = re.split('([0-9]{4}[/|.][0-9]{1,2})', project_name_time_str) + if project_name_time_str2: + for index, p_str in enumerate(project_name_time_str2): + if not p_str: + continue + if p_str[0].isdigit(): + dict_project['time'] = p_str + project_name_time_str2[index + 1] + \ + project_name_time_str2[index + 2] + dict_project['name'] = project_name_time_str2[index + 3] + break + project_chk_str2 = project_str.split(project_name_time_str)[-1] + project_chk_str2_list = re.split('(:|:)', project_chk_str2) + if project_chk_str2_list: + index3 = -1 + start_name = '' + new_p_chk_list = [] + for index, p_str3 in enumerate(project_chk_str2_list): + if index <= index3: + continue + if p_str3 in [':', ':']: + if not re.split('[\n|\t]', project_chk_str2_list[index + 1])[0].strip() and len( + project_chk_str2_list[index + 1]) <= 5: + continue + start_name = project_chk_str2_list[index + 1].split('\n')[-1] + if start_name: + new_p_str = project_chk_str2_list[index - 1].split('\n')[-1] + p_str3 + \ + project_chk_str2_list[index + 1].split(start_name)[0] + else: + new_p_str = project_chk_str2_list[index - 1].split('\n')[-1] + p_str3 + \ + project_chk_str2_list[index + 1] + new_p_chk_list.append(new_p_str) + if new_p_chk_list: + for p_str_true in new_p_chk_list: + if '开发环境' in p_str_true or '开发工具' in p_str_true or '开发技术' in p_str_true or '模块' in p_str_true: + dict_project['work'] += re.split('[:|:]', p_str_true)[-1] + continue + if '项目描述' in p_str_true or '功能介绍' in p_str_true: + dict_project['comment'] += re.split('[:|:]', p_str_true)[-1] + continue + if '职责' in p_str_true: + dict_project['duty'] += re.split('[:|:]', p_str_true)[-1] + continue + project_undergo_list.append(str(dict_project)) + # 项目名开头 + else: + if project_undergo2.startswith(':') or project_undergo2.startswith(':'): + dict_project = { + 'name': '', + 'time': '', + 'comment': '', + 'work': '', + 'duty': '', + } + new_str_list1 = [] + index2 = -1 + for index, i in enumerate(project_list): + if not i[0].isdigit() and i != '-': + if index <= index2: + continue + index2 = index + 3 + if len(project_list) < index2 + 1: + break + else: + new_str = i + project_list[index + 1] + project_list[index + 2] + project_list[index + 3] + new_str_list1.append(new_str) + if new_str_list1: + for project_chk_str2 in new_str_list1: + project_chk_str2_list = re.split('(:|:)', project_chk_str2) + if project_chk_str2_list: + index3 = -1 + start_name = '' + new_p_chk_list = [] + for index, p_str3 in enumerate(project_chk_str2_list): + if index <= index3: + continue + if p_str3 in [':', ':']: + if not re.split('[\n|\t]', project_chk_str2_list[index + 1])[0].strip() and len( + project_chk_str2_list[index + 1]) <= 10: + continue + start_name = project_chk_str2_list[index + 1].split('\n')[-1] + if start_name: + new_p_str = project_chk_str2_list[index - 1].split('\n')[-1] + p_str3 + \ + project_chk_str2_list[index + 1].split(start_name)[0] + else: + new_p_str = project_chk_str2_list[index - 1].split('\n')[-1] + p_str3 + \ + project_chk_str2_list[index + 1] + new_p_chk_list.append(new_p_str) + if new_p_chk_list: + dict_project['name'] = re.split('[:|:]', new_p_chk_list[0])[-1] + for p_str_true in new_p_chk_list: + if '开发环境' in p_str_true or '开发工具' in p_str_true or '开发技术' in p_str_true or '模块' in p_str_true: + dict_project['work'] += re.split('[:|:]', p_str_true)[-1] + continue + if '项目描述' in p_str_true or '功能介绍' in p_str_true: + dict_project['comment'] += re.split('[:|:]', p_str_true)[-1] + continue + if '职责' in p_str_true: + dict_project['duty'] += re.split('[:|:]', p_str_true)[-1] + continue + project_undergo_list.append(str(dict_project)) + else: + index2 = -1 + name2 = '' + new_str_list1 = [] + for index, i in enumerate(project_list): + if index <= index2: + continue + if not i: + continue + if i.strip() == '-': + index2 = index + 2 + if not name2: + name3 = project_list[index + 2].split('\n')[-1] + new_str = project_list[index - 2] + project_list[index - 1] + i + project_list[index + 1] + \ + project_list[index + 2].split(name3)[0] + name2 = name3 + else: + name3 = project_list[index + 2].split('\n')[-1] + if name2: + new_str = name2 + project_list[index - 1] + i + project_list[index + 1] + \ + project_list[index + 2].split(name3)[0] + else: + new_str = name2 + project_list[index - 1] + i + project_list[index + 1] + \ + project_list[index + 2] + name2 = name3 + new_str_list1.append(new_str) + continue + if i.strip() != '-' and '-' in i: + index2 = index + if not name2: + name3 = i.split('\n')[-1] + new_str = str_2[index - 2] + str_2[index - 1] + i.split(name3)[0] + name2 = name3 + else: + name3 = i.split('\n')[-1] + new_str = str_2[index - 2] + str_2[index - 1] + i.split(name3)[0] + name2 = name3 + new_str_list1.append(new_str) + continue + if new_str_list1: + for project_str in new_str_list1: + project_name_time_str = project_str.split('\n')[0] + dict_project = { + 'name': '', + 'time': '', + 'comment': '', + 'work': '', + 'duty': '', + } + project_name_time_str2 = re.split('([0-9]{4}[/|.][0-9]{1,2})', project_name_time_str) + if project_name_time_str2: + for index, p_str in enumerate(project_name_time_str2): + if not p_str: + continue + if p_str[0].isdigit(): + dict_project['time'] = p_str + project_name_time_str2[index + 1] + \ + project_name_time_str2[index + 2] + dict_project['name'] = project_name_time_str2[index - 1] + break + project_chk_str2 = project_str.split(project_name_time_str)[-1] + project_chk_str2_list = re.split('(:|:)', project_chk_str2) + if project_chk_str2_list: + index3 = -1 + start_name = '' + new_p_chk_list = [] + for index, p_str3 in enumerate(project_chk_str2_list): + if index <= index3: + continue + if p_str3 in [':', ':']: + if not re.split('[\n|\t]', project_chk_str2_list[index + 1])[0].strip() and len( + project_chk_str2_list[index + 1]) <= 10: + continue + start_name = project_chk_str2_list[index + 1].split('\n')[-1] + if start_name: + new_p_str = project_chk_str2_list[index - 1].split('\n')[-1] + p_str3 + \ + project_chk_str2_list[index + 1].split(start_name)[0] + else: + new_p_str = project_chk_str2_list[index - 1].split('\n')[-1] + p_str3 + \ + project_chk_str2_list[index + 1] + new_p_chk_list.append(new_p_str) + if new_p_chk_list: + for p_str_true in new_p_chk_list: + if '开发环境' in p_str_true or '开发工具' in p_str_true or '开发技术' in p_str_true or '模块' in p_str_true: + dict_project['work'] += re.split('[:|:]', p_str_true)[-1] + continue + if '项目描述' in p_str_true or '功能介绍' in p_str_true: + dict_project['comment'] += re.split('[:|:]', p_str_true)[-1] + continue + if '职责' in p_str_true: + dict_project['duty'] += re.split('[:|:]', p_str_true)[-1] + continue + project_undergo_list.append(str(dict_project)) + dict_chk['project_undergo'] = project_undergo_list + + # 数字开头 + if work_str2[0].isdigit(): + index1 = -1 + new_str_list = [] + for index, i in enumerate(str_2): + if index <= index1: + continue + if not i: + continue + if i.strip() == '-': + index1 = index + 2 + new_str = str_2[index - 1] + i + str_2[index + 1] + str_2[index + 2] + new_str_list.append(new_str) + continue + if i.strip() != '-' and '-' in i: + index1 = index + new_str = str_2[index - 1] + i + new_str_list.append(new_str) + continue + if new_str_list: + dict_chk['work_undergo'] = new_str_list + for work_str in new_str_list: + new_str_list1 = work_str.split('工作描述') + work_dict = { + 'name': '', + 'time': '', + 'work_name': '', + 'duty': new_str_list1[-1], + } + new_str_list2 = new_str_list1[0].split('\n') + if '?' in new_str_list1[0]: + work_dict['time'] = new_str_list2[0].split('??')[0] + work_dict['name'] = new_str_list2[0].split('??')[1] + work_dict['work_name'] = new_str_list2[1].split('|')[0] + else: + work_dict['time'] = new_str_list2[0] + work_dict['name'] = new_str_list2[2] + work_dict['work_name'] = new_str_list2[1] + work_list.append(str(work_dict)) + # 公司名开头 + else: + index1 = -1 + name = '' + new_str_list = [] + for index, i in enumerate(str_2): + if index <= index1: + continue + if not i: + continue + if i.strip() == '-': + index1 = index + 2 + if not name: + name1 = str_2[index + 2].split('\n')[-1] + new_str = str_2[index - 2] + str_2[index - 1] + i + str_2[index + 1] + \ + str_2[index + 2].split(name1)[0] + name = name1 + else: + name1 = str_2[index + 2].split('\n')[-1] + if name1: + new_str = name + str_2[index - 1] + i + str_2[index + 1] + str_2[index + 2].split(name1)[0] + else: + new_str = name + str_2[index - 1] + i + str_2[index + 1] + str_2[index + 2] + name = name1 + new_str_list.append(new_str) + continue + if i.strip() != '-' and '-' in i: + index1 = index + if not name: + name1 = i.split('\n')[-1] + new_str = str_2[index - 2] + str_2[index - 1] + i.split(name1)[0] + name = name1 + else: + name1 = i.split('\n')[-1] + new_str = str_2[index - 2] + str_2[index - 1] + i.split(name1)[0] + name = name1 + new_str_list.append(new_str) + continue + if new_str_list: + dict_chk['work_undergo'] = new_str_list + for work_str in new_str_list: + new_str_list1 = work_str.split('\n') + work_dict = { + 'name': '', + 'time': '', + 'work_name': '', + 'duty': '', + } + new_str_list2 = new_str_list1[0].split(' ', 1) + work_dict['name'] = new_str_list2[0] + work_dict['time'] = new_str_list2[1] + + work_dict['work_name'] = new_str_list1[1].split(':')[-1] + work_duty = new_str_list1[3:] + duty1 = new_str_list1[2].split('职责')[-1] + duty = duty1.join((str(x) for x in work_duty)) + work_dict['duty'] = duty + work_list.append(str(work_dict)) + dict_chk['work_list'] = work_list + review = [] + upgrade = true_chkStr.split('教育经历')[-1] + if '自我评价' or '自我描述' in upgrade: + if '自我评价' in upgrade: + review = upgrade.split('自我评价')[-1].split('技能特长')[0] + else: + if '自我描述' in upgrade: + review = upgrade.split('自我描述')[-1].split('技能特长')[0] + else: + review_chk = true_chkStr.split('工作经历')[0] + if '自我评价' in review_chk: + review = review_chk.split('自我评价')[-1] + if '自我描述' in review_chk: + review = review_chk.split('自我描述')[-1] + dict_chk['review'] = review + upgrade = upgrade.strip().strip('\n') + upgrade_chk_list = upgrade.split('\n') + upgrade_list = [] + if upgrade_chk_list: + for index, i in enumerate(upgrade_chk_list): + if index == 0: + if sum([1 if u'\u4e00' <= x <= u'\u9fff' else 0 for x in i]) <= 0: + upgrade_list.append(i + upgrade_chk_list[index + 1] + upgrade_chk_list[index + 2]) + break + else: + upgrade_list.append(i) + break + dict_chk['upgrade'] = upgrade_list + specialty_do = [] + language = [] + remembrance = [] + if '证书' in upgrade: + chk_upgrade_str1 = upgrade.split('证书')[-1] + if '专业技能' in chk_upgrade_str1: + specialty_do = chk_upgrade_str1.split('专业技能')[-1].strip().strip('\n').split('\n') + remembrance_list_str = chk_upgrade_str1.split('专业技能')[0].strip().strip('\n') + for i in remembrance_list_str.split('\n'): + if '??' in i: + dict_rem = { + 'prize_name': i.split('??')[1], + 'prize_time': i.split('??')[0] + } + str_rem = str(copy.deepcopy(dict_rem)) + remembrance.append(str_rem) + elif '语言能力' in chk_upgrade_str1: + remembrance_list_str = chk_upgrade_str1.split('语言能力')[0].strip().strip('\n') + for i in remembrance_list_str.split('\n'): + if '??' in i: + dict_rem = { + 'prize_name': i.split('??')[1], + 'prize_time': i.split('??')[0] + } + str_rem = str(copy.deepcopy(dict_rem)) + remembrance.append(str_rem) + language_list = chk_upgrade_str1.split('语言能力')[-1].strip().strip('\n') + language_dict = { + 'language_name': '', + 'has_sleep': '', + 'reading': '', + 'writing': '' + } + for i in language_list.split('/n'): + language_dict1 = copy.deepcopy(language_dict) + language_dict1['language_name'] = i.split(':')[0] + for i1 in i.split(':')[1].split('|'): + if '听说' in i1: + language_dict1['reading'] = i1 + continue + if '读写' in i1: + language_dict1['writing'] = i1 + language.append(str(language_dict1)) + elif '培训经历' in chk_upgrade_str1: + remembrance_list_str = chk_upgrade_str1.split('培训经历')[0].strip().strip('\n') + remembrance_list_chk = remembrance_list_str.split('\n') + for index, i in enumerate(remembrance_list_chk): + if i[0].isdigit(): + time = i + name = remembrance_list_chk[index + 1] + if ',' in name: + for name1 in name.split(','): + dict_rem = { + 'prize_name': name1, + 'prize_time': time + } + str_rem = str(copy.deepcopy(dict_rem)) + remembrance.append(str_rem) + else: + remembrance.append(str({'prize_name': name, 'prize_time': time})) + dict_chk['remembrance'] = remembrance + dict_chk['specialty_do'] = specialty_do + dict_chk['language'] = language + return dict_chk + + +if __name__ == '__main__': + # 拉勾 + chk_str1 = """ + +方明洋 +5年工作经验 | 本科 | 27岁 | 男 +期望职位: Android / 期望薪资:17k-18k +联系电话: 13100622896 +电子邮箱: 727527762@qq.com + +自我描述 +综合能力: 责任心 +本人4年工作经验,意向智能物联网方向,喜欢钻研,热爱技术。 + + +工作经历 +武汉中软国际科技服务有限公司 2018.03 - 至今 +职位:Android中级开发工程师 +我任职于武汉中软国际华为业务线软件工具部。主要职责为开发华为相机自动化流水线测试防护系统。该系统 +基于Jenkins,结合Python,dos,shell脚本,自动化监控指定代码仓,自动集成测试插件至工程源码,自 +动编译,安装,静态代码检查,unit测试,Androidtest,monkey测试,内存检测,自动实时呈现版本测试 +结果。实现应用层全流程自动化,相较于人工测试效率提升300%,上线试运行四周,累计发现应用 +crash,oom,anr,内存泄漏(Java,native层)各类问题总计90多处。后期准备推广至全apk业务流水线使 +用。 + +武汉漫维智能科技有限公司 2017.09 - 2018.04 +职位:安卓研发工程师 +我任职于武汉漫维智能科技有限公司研发部,工作职责为开发Honeypad系统,该系统是面向家庭和商业级 +的智能物联网平台,分为餐桌系统,和茶几系统两大块。Honeypad系统本质是替换Android原生 +launcher,通过自定义基类view,并扩展出各个功能组件模块,在此基础上插件化添加私有模块或者有条件 +接入第三方平台来集成整合各种资源,其中智能茶几系统包括自己开发天气模块,新闻模块,亲自互动模块, +定制桌面小游戏 ,第三方影视,音乐,APP市场等。智能餐桌系统包括:第三方点餐,小游戏等。 通过后台 +socket主动推送配置文件控制两子种系统切功能切换。 + +1.负责项目基础框架搭建; 2.项目功能模块代码编辑; 3.代码粗测试; 4.版本维护迭代。 + +广州中道电子科技有限公司 2015.11 - 2017.09 +职位:android应用开发工程师 +我任职于广州中道电子科技有限公司。工作职责为,开发中道进销存系统Android客户端应用。该系统主要 +用于管理商户进货销售存储。 +工作描述: 1.开发中道批发APP各模块功能; 2.开发中道批发后台服务端功能模块; 3. Android客户端粗 +测。4.客户端功能迭代开发,5,开发蓝牙打印插件。 + + +项目经历 +漫维智能餐桌 2017.10 - 2018.03 +项目描述: +开发环境:Windows +开发工具:Androidstudio,MySQL,Androidtools ,固件工厂, +项目名称:Honeylauncher +项目描述:漫维智能餐桌/茶几,HoneyPAD致力于打造基于互联网技术的高端智能平台, 提供以智能餐桌, +智能茶几,广告交互机为主体的一站式商业解决方案。 +1.漫维智能餐桌/茶几系统是基于honeylauncher平台,honeylauncher实质为Android launcher替换系统 +开机launcher,该框架采用HTTP2.0通信协议,保证通信安全,同时也可以在服务端主动像客户端推送信息 +或者跟新版本。 +2.项目主页分为三四大区域,天气新闻插件区,主功能区,我的功能,快捷管理, +你的成就: +项目框架开发功能代码实现 + +中道打印插件(蓝牙打印机) 2017.05 - 2017.07 +项目描述: +软件环境:Windows + +开发工具:Eclipse + +责任描述: +1.项目基础框架,实现功能流程图; +2.功能模块编码,UI界面; +3.测试项目代码,兼容测试; + +项目简介:中道打印插件,手机app蓝牙连接打印机基础插件服务,在手机app需要打印功能时候,调用该 +插件服务,搜寻范围内可用的蓝牙设备,标识当前所有已搜寻到的蓝牙设备状态并分类显示;点击设备列表弹 +框提示绑定设备连接设备成功后,调用系统打印api 插件置打印中设置默认打印属性以及预设打印属性;连 +接打印设备后预览打印页面生成pdf文件,传送至打印设备,并设置打印命令更改打印动作; + +1.该插件可以匹配所有可搜索的蓝牙设备; +2.该插件适配所有支持蓝牙功能的打印机(无需下载官方打印插件); +3.该打印插件实质上实现系统的打印接口,重写自己需要的方法; + +你的成就: +app开发 + +中道批发 2016.11 - 2017.04 +项目描述: +项目简介:软件环境:windows +开发工具:Eclipse NetBeans MySql 5.0,NavicatForMySQl +项目简介: + 中道批发是一款适用于中小企业商铺的进销存管理软件,该系统拥有完整的店铺销售管理权限体系,订单 +流程控制跟踪体系,商品进货,销售,存储管理信息体系;从客户下单到产品生产完毕交货整个流程的控制, +管理,并兼容各种不同终端(平板,手机);该项目通信基于PPP+TLV报文协议,8组RESKey加密报文传 +输。同时对于服务端拓展性更强,适用于多种数据库; +责任描述: +1.1.客户端编写项目下单模块,款式生产计划,工厂订单,工厂订单跟踪,我的模块中APP更新,切换云主 +机与指定i地址模块; +2.服务端 编写各个项目功能模块中Action类解析通信报文以及操作数据库,生成响应数据到客户端; +3.服务端代码测试,客户模块化各个功能,作为lib库加入到主项目中去,解耦项目各个模块,便于后期维 +护; +4.客户端功能代码压力测试,逻辑测试,UI测试,IO测试;1.店铺下单模块功能; +5.总部款式生产计划模块,工厂计划模块,采购任务指派,采购过程记录,裁床跟踪模块; +6.fragment中模块功能分类(类似支付包分组功能界面) +2.项目描述: +1.使用第三方stickyheaderlistview分类各fragment中功能模块。 +2. 使用第三方ObservablescrollowView实现下拉弹性空间文字渐变。 +3.使用XListview实现下拉刷新列表上拉加载更多。 +4.自定义控件MyHorizontalScrollowView实现复杂表格横向,纵向滑动(解决小屏幕表格显示不全问题) +5合并表格行; +6.模块化项目功能; +7.自定义输入框InputDialog; +8.服务端定义Action类处理客户端不同界面的不同数据库操作请求; +9服务端service类定义各个对应模块中CRUD操作数据库方法; + +你的成就: +客户端app开发 + +焦点新闻 2016.08 - 2016.08 +项目描述: +● 项目名称:焦点新闻 +● 开发周期:2015.04—2015.07 +● 开发工具:AndroidStudio2.0+SVN +● 项目描述:此项目为一个新闻资讯类手机客户端,主要包括以下几个模块首页、新闻,创意、家居、军 事、 +娱乐等功能模块,用户可以自由订阅添加自己喜欢和关系的内容,使用起来非常方便。 +● 1.项目基本框架 应用结构采用的是SlidingMenu开源框架,整体分为侧滑菜单界面和内容界面两个部分。 +内容界面采用ViewPager加上ViewPagerIndicator的设计模式。为了实现各个界面的统一管理,抽取出一 +个基类BasePager,对外暴露initView()和initData()两个方法,供每个模块使用。这样每个模块只需要实现 +这两个方法就可以了,从而达到代码的复用。 +● 2.头条热点,读图的开发 ListView用于展示从网络上获取的数据,并在ListView的头部添加一个可以轮播 +的ViewPager热点新闻图片,在ListView的尾部添加一个加载更多的布局。 界面采用 +Fragment+ViewPager的框架模式,自定义ViewPager的懒加载(去除预加载),当用 户切换ViewPager是 +才进行数据请求,节约用户流量. +你的成就: +安卓端app开发 + +一元秒杀 2016.07 - 2016.07 +项目描述: +● 项目描述: + 天猫百里挑一,特惠商品折上折,每日精选最划算的天猫商品,正 品 给力不加价,选择我 们不 +需要理由!!!分类齐全,数码, 女装,男 装,家居,母婴,鞋包,配饰等栏目,淘宝独家 商 +品 优惠选择。 + 1.对项目进行分析,对视图层框架搭建,界面统一。主界面采用RadioGroup+ViewPager的设 +计模式,并且要自定义一个ViewPager重写ViewPager的事件处理机制,让ViewPager不 +能处理滑动事件,通过点击RadioGroup来实现页面的切换。为了实现界面的统一管理,抽 +取一个基类BasePager,对外暴露initView()和initData()两个方法,共每个模板使用。这样 +每个模块只需要实现这两个方法就可以了,从而达到代码的复用。 + 2.主页、逛街、主题的开发 ListView用于展示从网络上获取的数据,并在ListView的头部添 +加一个布局文件,这个布局文件包括了信息显示的轮播图,分类信息男装、数码、创意等,这 +样就可以达到让头布局和ListView进行联动的效果。在主页使用一个帧布局,点击可以实现 +ListView和GridView视图切换的效果。 3.在分类信息中,每个分类信息布局基本相同,通过 +抽取一个布局文件,通过include进入布局文 件的复用。 +你的成就: +负责安卓端app开发任务 + +美食天下 2015.04 - 2015.07 +项目描述: +● 软件环境:windows + +● 开发工具:Androidstudio +svn + +● 责任描述:首页Tween Animation, +登录界面通过Json解析Xml实现登录服务器交互 +我的个人界面 + +● 项目简介:全球美食精品荟萃,发掘各类美食菜谱,蒸煮焖烩炒煎炸,从家常菜到人气料 +理,从正餐到甜点,从养生汤到减肥餐,搜集美食智慧,品评美食文化,体会美食乐趣。美食 +菜谱,简单的名字,幸福的滋味!海量不同菜系菜谱,满足您的个性化需求! + +你的成就: +通信模块编码 + + +教育经历 +汉口学院 本科 / 电子信息工程 2011 - 2015 + + + """ + # 前程无忧 + chk_str2 = """ + 基本信息 +李立宏 +男 | 30 岁 (1990/01/12) | 174cm +未婚 | 9年工作经验 +手机号码:15827401448 +QQ号:761193190 +求职状态:目前正在找工作 +邮箱:hong199012@qq.com +居住地:武汉-洪山区 +工作经验 +2017/3―至今 [3年6个月] +C++服务器主程 | 研发 +武汉多游科技有限公司 +网络游戏 | 民营公司 | 50-150人 +工作描述: +1.独立负责棋牌游戏 “黔友贵州麻将”的研发,上线及运营,更新 +2.帮助客户端搭建底层跨平台通讯库 +3.配合管理后台开发人员建表并生成数据,提升运营能力 +4.服务器采用windows下c++开发,使用mssql Server 数据库,客户端采用cocos lua +5.游戏每日最大3千多人同时在线,在线运营时间两年多,非常稳定! +6.移植服务器到linux下稳定运营,数据库用mysql, linux下使用qt! +7.精通cocos2dx c++开发,完整的cocos开发上线经验。 +熟练掌握: +1.熟悉mysql,redis和cocos c++ +2.熟悉游戏服务器大用户量同时在线的架构设计 +3.熟悉格斗,捕鱼,手游类游戏的帧同步设计 +2016/6―2017/3 [9个月] +C++服务器主程 | 技术 +武汉百达富嘉网络科技有限公司 +网络游戏 | 民营公司 | 少于50人 +工作描述: +1.独立负责德州游戏"人人德州”服务器的网络,数据库,业务等模块的开发以及整体框架的搭建,“人人德州” +这款游戏已在苹果商店上线。 +2.完成癞子麻将创建房间,加入房间,准备游戏,听牌,胡牌,正常的玩多盘麻将,每盘的战绩统计,房间结束,房间战绩统计等主要功 +能。 +3.实现斗地主的AI算法,可以进行一般水平的打扑克。 +熟练掌握: +1.精通linux c++ qt开发,开发了一个linux版本的麻将服务器 +2.熟悉Cocos2d-X C++开发 +来自前程无忧简历 +2014/5―2016/5 [2年] +手游GM工具开发工程师,APP服务器开发工程师 | 研发 +上海晟旗网络科技有限公司 +网络游戏 | 民营公司 | 少于50人 +工作描述: +这是一家手游公司,公司推出的手游有"来自仙剑的你"和"死神"(Q版来自仙剑的你),我负责公司手游GM +运营工具的开发和游戏服务器的功能开发。 +项目经验: +1.QT版游戏GM工具 +项目模块: +a,玩家log, +b,玩家数据, +c,gm log, +d,玩家投诉, +e,发布公告(全服公告), +f,充值补偿, +g,奖励补偿(全服奖励), +h,cdkey查询,玩家禁言等 +项目基于C/S架构,采用C++语言开发,使用windows api和QT界面库,stl,boost标准库,mongodb数据库。 +2.Web版游戏GM工具, +项目基于B/S架构,使用C#语言, asp.net mvc框架, mongodb数据库。 +3.大厅服务器业务功能的开发。 +4.游戏的第三方登录模块和第三方支付模块。 +熟练掌握: +1, 用C++ boost开发Tcp server和Http Server,以及linux下的Epoll Server。 +2, 了解负载均衡和分布式, +a,负载均衡使用虚拟ip技术实现.即链路层的负载。 +b,难点在于数据库的扩展,玩家数据一直增加,io查询所花的时间就越长.数据库的优化在于1,页面缓存 2,表的分割 +3,索引等。页面缓存就是操作系统的缓存机制,对于单台数据库而言,增加内存即可.表的分割我个人觉得只能适当分割,分割太 +细维护难度太大.索引很好,通过B+树数据结构,就像字典的目录那样,大大的加快了的数据的查询速度.搜索引擎的索引就是 +key和postion的结构. +c,公司的服务器结构就是一个区一台服务器,每个服务器对应的有两台数据库服务器,一个master,一个slave +3, DirectX C++音乐播放器,视频播放及vmr9视频播放,mongodb下载服务,Lucene .net(C#开源搜素引擎),ActiveMQ等。 +2013/3―2014/5 [1年2个月] +C# ArcGIS研发工程师 | 软件研发 +武汉聪源科技有限责任公司 +计算机软件 | 民营公司 | 少于50人 +工作描述: +这是一家地球空间信息相关行业的软件公司。我负责广东省电力设计研究院前期选址选线系统的开发。 +来自前程无忧简历 +项目名称: 广东省电力设计研究院前期选址选线系统 +项目职责: +1, 负责广东省电力设计研究院前期选址选线系统的选线部分。 +2, 选线部分最难的:最优路径算法的实现。 +(这个系统主要由两个部分组成,即选址和选线。选址就是选择变电站的站址,共有起点和终点两个站址。选线就是在这两 +个站址之间规划出一条线路,用于布置电缆和电线。 选线线路要符合:(1) +路径最短,在要避让障碍物的前提下,生成出一条距离最短的线路。 (2) +经济最优化,也即线路的转角塔数量要最少,线路所跨越区域天气情况要好,以及线路与障碍物之间的距离要最短,大于 +避让范围 等。(3) +线路精度最精确,客户方要求的精度是100米,而一开始生成的线路精度只有500米,为了优化这个算法花了很长时间。(4) +指定线路必过点和线,在线路生成模块里,指定必过点和线,那么生成的线路就必须要经过这些点和线。) +3, +完成模块:a.系统配置模块,b.线路配置模块,c.线路导入模块,d.线路生成模块,e.线路编辑模块,f.数据上传模块,g +.选线工程结构树状图模块,h.线路分段模块,i.协议配置模块 等。 +(选线工程结构图的结构是:项目下有起点,终点和多个方案,每个方案下有多个线路版本和多个线路分段,每个分段对应一 +个分段协议,这些协议是客户方与线路所经过的每个地方政府所签订的,每个线路版本包含这些分段。) +4, 选线部分涉及很多的算法,在线路导入,线路生成,线路优化,线路分段等模块中都有体现。算法是选线部分最难的点。 +5, 编写选线工程结构管理设计文档和测试用例。 +熟练掌握: +1, 对游戏比较感兴趣, 实现一个有客户端和服务器的五子棋。五子棋的算法是自己实现的。 +2, 精通C++ MFC开发。 +2011/4―2013/3 [1年11个月] +软件工程师 | 技术研发 +武汉家事易农业科技有限公司 +互联网/电子商务 | 民营公司 | 150-500人 +工作描述: +这是一家日用品电商公司。我负责流水线PDA系统及其他管理系统的开发。 +工作职责: +1,一期PDA服务器端的流水的记录以及客户端的修改。 +2,二期PDA项目整个PDA客户端的开发以及PDA服务器端的修改和并发的处理。 +(客户端加入了自己很多的想法,比如和服务器中断连接后能够自动连接服务器,当连接上服务器之后会有相应的提示, +让工作人员继续做集货,验货等任务) +3,用WCF搭建公司整个系统的框架(WCF端提供三个服务,分别服务于公司的三个系统)。 +4,,会员注册模块的开发。 +5,质量追溯系统的开发。 +熟练掌握: +1, 熟悉MFC开发,Windows消息机制, QT 开发。 +来自前程无忧简历 +2, 熟悉XNA,Cocos2d-X引擎,用XNA做过一个类似于捕鱼达人的2D游戏和一个3D模型。 +教育经历 +2008/9-2011/7 +武汉工业职业学院 +大专 | 设计 +求职意向 +职能:后端开发 +职位:服务器工程师 +工作地点:武汉, 上海 +行业: 计算机软件,互联网/电子商务,计算机硬件,网络游戏,通信/电信/网络设备 +期望薪资:20000-40000元/月 +到岗时间:随时 +工作类型:全职 +自我评价: 1.我是一个非常专注的人,对于我要做的事情我会做的很深,花大部分时间去钻研。专业化 +能使你获得很大的财富,这是美国的一位 牛逼的期货交易员说的话。 +2.熟练掌握C++,C#语言 +3.精通服务器程序开发,熟悉pc端,cocos c++程序开发 +技能特长 +证书/成绩 +2009/4 +c1驾驶执照 , 英语三级 +培训经历 +2010/8-2011/4 +.Net +培训机构: +北大青鸟 +来自前程无忧简历 + + """ + # 智联1 + chk_str3 = """ +应聘职位: Web开发工程师 +应聘机构: 武汉乐谷在线科技有限公司 +工作地点: 武汉 +ID:dKwLUJmFEUKjMy4LHsfzudiXdMlnCO9K 最近活跃时间:6月8日 +张双琪     +   +女 ????22岁 (1998年1月) ????大专 ????考虑机会 +现居住地:武汉 | 户口:孝感 +手机:18727456476 +E-mail:2576444306@qq.com +求职意向 +web前端??武汉 +4001-6000元/月?| 互联网、IT服务、计算机软件?| 全职 +自我评价 +1.对于研究新技术有浓厚的兴趣,善于分析总结 +2.自学能力强,在疫情期间自学了node.js和vue.js +3.对工作认真负责,有较强的责任心,性格开朗,有较强的心3.理素质和抗压能力,在逆境时会对自身负情绪进行自我调节 +4.有上进心,对团队协调能力强,有较强的团队意识 +工作经历 +2019.07 - 2020.01 ??武汉筑梦科技有限公司?? (7个月) +web前端 | 2001-4000元/月 +计算机软件 +工作描述: 主要从事自己负责Web前端开发。根据需求说明和设计文档,完成所分模块的开发及负责模块的单元测试工作。协助UI设计师完成也是设计工作,提出技术实现条件。负责前端页面的开发和前端交互的设计,以及网站前端性能的优化和提升 +项目经历 +2019.11 - 2020.01 仿小米商城 +项目描述: 项目描述:该项目包括首页,商品列表页,商品详情页,购物车页,注册页,登录页 +开发技术:HTML+CSS,JavaScript,HTML5+CSS3,Vue.js +具体模块 : 包括注册页、登录页、首页、商品展示页、购物车页 +功能介绍:1. 主要运用HTML5+CSS3来布局页面,用JavaScript使得页面更加生动灵活 +2. 分别运用了路由的调转来进行页面的切换调转的功能 +3. 在首页的购买操作会记录在购物车的信息 +岗位职责: +注册页:对用户输入的内容进行正则验证,随机验证码的验证 +登录页:对用户提交的数据进行后台请求返回不同的页面,登陆成功改变登录状态 +购物车:ajax请求用户的数据,并同步页面与数据库中的数据首页:采用vue.js通过数据来驱动视图,实现首页的完美布局。 +项目心得: +1.对vue.js用数据驱动试图更加的深刻,对页面的整体布局有较深的理解 +2.更加了解结构逻辑,更加提升了自己的编程能力 +2019.10 - 2019.11 家装无忧 +项目描述: 开发技术:HTML+CSS,JavaScript,HTML5+CSS3,Bootstrap +项目描述:这是一个具特色的装饰公司的线上宣传网站,利用当下比较流行的 +HTML5+CSS3对网页元素的渲染有着耳目一新的特点,利用Bootstrap框架JavaScript使得网页的展示效果更具潮流且生动,使得网页具有响应式布局的特点,用户在浏览时更能清楚快速的理解设计理念。 +具体模块:包括首页、装修案例展示、设计师团队页、在线咨询、装修选材页面、招聘六大模块。 +责任描述: +装修案例展示页面的开发:将具有优秀代表的装修案例工程项目展示。 +装修知识的分类展示的开发:利用特色吸引用户的关注。 +家装案例中部分家装风格模块的开发:把案例具体化。 +了解家装无忧部分模块的开发:将企业风格,企业宗旨,企业理念以及业务具体展现。 +项目心得: +1.在完成项目的过程中,让我更加熟练的掌握了JavaScript的知识,锻炼了自己的编程能力 +2.让我对网页的布局动画等有了更深的理解,能够轻松简单的操作HTML5+CSS3渲染动态网页效果 +3.运用Bootstrap实现网页的响应式布局,适用不同的窗口展示区域的页面展示。 + +教育经历 +2018.09 - 2020.06 ??湖北科技职业学院 ??移动应用开发 ??大专 +培训经历 +2019.10 - 2020.01 ??ajax,bootstrap,php,vue.js +培训机构: 百里半 +证书 +2019.12 ??1+x中级证书 +2018.03 ??学院二等奖学金 +专业技能 +html+css:熟练 +php和nodejs:一般 +bootstrap:熟练 +HTML5+CSS3:熟练 +JavaScript:熟练 +jquery:熟练 +ajax:一般 +vue.js:良好 + + """ + # 智联2 + chk_str4 = """ +应聘职位: Web开发工程师 +应聘机构: 武汉乐谷在线科技有限公司 +工作地点: 武汉 +ID:dKwLUJmFEUKjMy4LHsfzueVqNyJnCO9K 最近活跃时间:6月10日 +聂礼旺     +   +男 ????23岁 (1997年2月) ????3年工作经验 ????大专 ????离职,随时到岗 +现居住地:黄冈 红安县 | 户口:黄冈 +手机:15771198025 +E-mail:nie_fairy@163.com +求职意向 +web前端??武汉 +4001-6000元/月?| 计算机软件?| 全职 +工作经历 +2018.04 - 2019.10 ??湖北国网华中科技开发有限责任公司?? (1年 7个月) +web前端开发 | 4001-6000元/月 +计算机软件 +工作描述: 1、百分百还原UI设计页面 +2、与后端沟通交流完成页面的交互作用 +3、用vue,原生JS,bootstrap,mui等框架完成项目 +4、有独立项目开发经验,会APP开发、能熟练处理兼容问题 +项目经历 +2019.09 - 2019.10 武汉市配网规划资料管理系统(移动端) +项目描述: 项目是一公司为国网武汉供电公司设计的一款用于各个区之间文件管理的app,采用vue和mui框架构建。 +2019.08 - 2019.09 湖北省汉江崔家营航电枢纽管理系统(已上线) +项目描述: 该项目是为湖北省汉江崔家营航电枢纽管理处设计的官网,项目整体采用原生JS,是崔家营航电管理处和湖北省运输交通厅连接的公众平台 +2018.08 - 2019.10 浙江浙能集团能源综合系统 +项目描述: 主要功能是入设计领导首页和数据展示页面,通过canvas和echarts实现数据可视化操作,更加生动形象的来展示数据。 +2018.01 - 2018.05 医疗器械销售平台开发(移动端) +项目描述: 项目是一款医院和医疗器械公司内部使用的手机端APP,采用vue框架构建,其 中涉及mui触控滑动模块,slide子页之间采用了懒加载技术保证用户体验。 + +教育经历 +2016.09 - 2019.07 ??武汉软件工程职业学院 ??软件工程 ??大专 +证书 +2018.06 ??大学英语四级 +语言能力 +英语: 读写能力良好 | 听说能力熟练 + + """ + # 自制简历 + chk_str5 = """ + 简历 + + + + + + + + Android项目经验 + 项目名称:LAEX交易平台 + 项目描述:LAEX是一个数字资产交易所官方软件,大家在手机上,就可以实现数字货币交易和查询,非常方便。 + + 技术要点: + 1. 使用最新的databing框架取代繁琐的findviewbyId操作 + 2. 使用沉浸式状态栏,同时兼容各个版本 + 3. 整个项目使用的MVP模式,提高代码的可读性 + 4. 行情页面使用flyco的CommonTabLayout搭配viewpager实现切换功能 + + + 项目名称:超级车赢家app + 开发周期: 3个月 + 项目描述:超级车赢家app是一款专为汽车美容点提供的维修保养、车辆信息、消费记录等接单和管理app,让店主们可以快速获取维修订单,更好的为客户服务。 + + + 个人资料 + 个人资料 + 个人资料 + 个人资料 + 姓 名: + 陈亚雄 + 性 别: + 男 + 年 龄: + 29 + 学 历: + 本科 + 毕业院校: + 武汉纺织大学 + 工作年限: + 6年 + E-mail: + 50632775@qq.com + 联系电话: + 15902799433 + 应聘方向 + 应聘方向 + 求职行业: + 计算机软件 + 应聘职位: + Android软件工程师 + 发展意向: + 长期,全职 + 求职地点: + 武汉 + 期望薪资: + 面议 + 目前状况: + 一周内可就职 + 工作经历 + 工作经历 + 公司名称: + 中软国际科技服务有限公司 + 工作时间: + 2016.08-2017.6 + 公司性质: + 民营公司 + 责任部门: + 安卓开发项目组 + 工作描述: + 负责Android开发工作,参与产品的设计实现测试和维护 + 按照项目计划及时完成任务 + 工作经历 + 工作经历 + 公司名称: + 重庆车杰盟科技有限公司 + 工作时间: + 2017.07-2019.03 + 公司性质: + 民营公司 + 责任部门: + 安卓开发项目组 + 工作描述: + 1、负责开发基于Android平台的软件规划设计与开发及后期的维护 + 2、负责Android平台上的技术攻关,确保开发质量 + 工作经历 + 工作经历 + 公司名称: + 武汉随链科技服务有限公司 + 工作时间: + 2019.04-2020.01 + 公司性质: + 民营公司 + 责任部门: + 安卓开发项目组 + 工作描述: + 1、负责Android开发工作,参与产品的设计实现测试和维护 + 2、按照项目计划及时完成任务 + 专业技能 + 熟练掌握Android四大组件,熟练掌握UI设计、常用布局、动画特效 , 熟练掌握Android平台上嵌入式数据库SQLite编程技术 + 熟练掌握Android下的Handler异步线程机制 + 熟练掌握面向接口编程 + 掌握LruCache来处理安卓下图片的缓存 + 掌握ImageLoader,glide,gson,eventbus,Volley,OkHttp等第三方Android框架 + 掌握 事件分发机制,解决了许多同一页面滑动冲突问题 + 掌握MVC,MVP,MVVM开发模式 + 掌握JetPack中DataBinding的使用 + 熟悉java设计模式及六大设计原则 + 熟悉Android自定义控件 + 熟悉使用Android下语音识别、定位导航、消息推送以及分享内容至第三方平台 + 了解Rxjava,Retrofit,热修复等 + + 项目名称:LAEX交易平台 + 项目描述:LAEX是一个数字资产交易所官方软件,大家在手机上,就可以实现数字货币交易和查询,非常方便。 + + 技术要点: + 1. 使用最新的databing框架取代繁琐的findviewbyId操作 + 2. 使用沉浸式状态栏,同时兼容各个版本 + 3. 整个项目使用的MVP模式,提高代码的可读性 + 4. 行情页面使用flyco的CommonTabLayout搭配viewpager实现切换功能 + + + 项目名称:超级车赢家app + 开发周期: 3个月 + 项目描述:超级车赢家app是一款专为汽车美容点提供的维修保养、车辆信息、消费记录等接单和管理app,让店主们可以快速获取维修订单,更好的为客户服务。 + + 技术要点: + 1.首页使用ScrollView进行嵌套。 + 2.首页使用第三方控件MPAndroidChart实现饼状图柱状图 + 3.使用LineGraphicView实现点状曲线图 + 4.android与js进行交互 + 5.使用zxing框架进行二维码扫描,使用wintone框架对车牌进行扫描 + 6.车牌录入信息使用自定义键盘 + + + + 项目名称:小二开单 + 开发周期: 3个月 + 项目描述:小二开单是一款针对销售一线的个人或团队建设以满足销售和微信职能为基础,将数据资源引入app,为用户创造智能型销售。 + + 技术要点: + 1.使用微信登录,手机登录以及token登录3种形式。 + 2.首页使用webView进行展示。 + 3.自定义fastIndexBar进行同事搜索 + 4.根据网址利用图像数据转换,使用矩阵转换生成二维码 + 5.配合后台对接口,完成删除成员,添加成员等功能 + + + + 项目名称:卡侎养车 + 开发周期: 3个月 + 项目描述:卡侎养车是一家拥有实体油品生产工厂,拥有专业的换油保养连锁店面,现打造B2C模式,给予车主性价比高的产品,质量好的服务。 + + 技术要点: + 1.配置Android annotations框架进行便捷开发。 + 2.每个页面都是一个自定义的ListView条目,上拉和下拉都可以刷新,使用PullToRefreshListView来实现。 + 3.使用百度地图完成定位,绘制Marker标志点以及路线导航等功能。 + 4.自定义一个ObservableScrollView可以监听onscroll事件的scrollView + 5.利用广播实时监听订单状态的改变更新界面 + + + + 项目名称:宁夏eshop + 开发周期: 3个月 + 项目描述:宁夏eshop是一款网上办理移动话费业务的app,让客户在家就能轻松办理业务。 + + 技术要点: + 1.首页使用的是第三方库MPAndroidChart框架。 + 2.用第三方框架PullToRefreshListView实现数据加载,图片处理,下拉刷新和上拉加载。 + 3.对PullToRefreshListView设置条目点击事件,跳转到集团详情界面,设置集团详情界面,包括字体调整,整体布局的实现。 + 4.使用自定义控件EdiTableTextView,利用LinearLayout的addView去活动的添加EdiTableTextView。 + + + 项目名称:好享购物 + 开发周期:3个月 + 开发环境:Android studio + 项目描述:好享购物定位于新媒体购物,整合电视、互联网、型录、手机等无店铺虚拟通路,为顾客提供多元化的优质商品与服务。好享购物致力于成为全新品质生活理念与健康生活方式的引领者、传播者,做消费者的购物专家,将目标顾客定位为“有标准、具备消费力、关注生活质量的精明买家”。 + 功能模块:搜索,分类,订单,购物车,地址管理,帮助中心,登录注册等模块。 + + 技术要点: + 轮播图功能的实现以及主界面各个模块入口的完成。 + 首页使用GridView进行热门商品的图片展示和文字描述 + 登录注册模块主要涉及UI的实现,联网的操作,数据的传递,服务端Servlet注册,登录逻辑的实现,对数据库进行的操作。 + 每个页面都是一个自定义的ListView条目,上拉和下拉都可以刷新,使用PullToRefreshListView来实现。 + 对于用户一些配置信息:比如用户名和密码,我们使用SharedPreference将这些信息保存起来 + 使用线程池管理下载任务,先去LruCache查看Image,没有再去手机缓存中查看,再没有则开启线程下载,列表在滑动的过程中取消下载任务,闲置状态下再去下载当前显示条目的图片。 + + + 项目名称:新华炫闻 + 开发周期: 3个月 + 开发环境:Android Studio + 项目描述:新华炫闻是为用户打造的新闻类App,及时推送新闻资讯,用户可以根据个人喜好选择不同的新闻类型的新闻模块。 + 技术要点: + 1.新闻中心利用ViewPagerIndicator开源框架结合Fragement实现不同类型新闻的显示; + 2.AysncTask异步框架获取数据显示新闻资讯信息,利用第三方框架完成下拉刷新和加载更多功能; + 3. ListView抽取,convertView复用和利用ViewHolder缓存优化程序; + 4.ListView不同Item信息类型的过滤显示,防止复用过程中条目出错,不能正确显示; + 5.网络获取图片按比例机型缩放; + 6.我们使用WebView控件加载从服务器中获得的新闻数据,并对新闻详情进行展示; + 7.采用ShareSDK可对新闻详情进行分享和集成极光推送功能。 + + + + + + 自我评价 + 有不断学习的良好习惯,能承受高强度的工作压力.热爱技术,喜欢钻研,有志于在手机平台方向长期发展,并能主动承担开发任务,承受工作压力.对移动领域新技术有强烈的兴趣和独立解决问题的能力.有较强的团队合作精神,积极主动,责任心强,能与团队成员进行有效地沟通,及时高效完成任务。 + + """ + fmt_txt(chk_str5)