先上流程图,还得27寸4K显示器,画图各种爽:

ReadMe:

  1. 运行程序前的提示:
  2. 1.抱歉,你得装prettytable模块......
  3. 2.还得抱歉,如果shell中运行,最好把字体调得小点,表格比较长......蛋疼
  4.  
  5. 为什么写两个版本:
  6. sir这期的作业不是很难,但有一个需求的逻辑个人感觉不是很合理:普通用户可以选择管理员操作的选项。
  7. 当然银角的目的是为了我们把装饰器运用到实际程序中。
  8. 一般页面展示中,管理员操作选项对于普通用户会做两种处理:
  9. 1、将选项灰色显示或者不能点击
  10. 2、普通用户登录后不显示管理员操作选项,如果管理员登录后则显示
  11. 出于以上原因,我写了两个版本。
  12. 所以写代码注释时,我只写了第一个版本的,即crm.py
  13.  
  14. 两个版本区别:
  15. 第一个版本crm.py 基本是按武sir的需求写的,略有不同的是,我把登陆和注册作为入口
  16. 第二个版本crm_v2.py 是在第一个版本基础上稍作修改,只是判断登录用户的是否为管理员,如果管理员登录则比普通用户多显示管理操作选项
  17.  
  18. 文件说明:
  19. crm.py:第一个版本,管理员以及普通用户操作均显示在主菜单
  20. crm_v2.py:第二个版本,主菜单根据登录用户的角色判断是否显示管理员操作的选项
  21. user_info:用户信息,以管道符隔开:账号|密码|邮箱|电话|用户角色
  22.  
  23. 测试账号:
  24. 可以自己注册,也可以使用现成的。
  25. 管理员:admin/admin alex/3714
  26. 普通用户:chengchen/123 cc/123
  27.  
  28. 操作流程:
  29. 登录/注册---->用户操作主菜单(普通用户操作【查看账户信息,修改帐户信息】,管理员操作【搜索,遍历用户,提升权限,重置密码】)
  30.  
  31. 功能:
  32. 1.程序入口为登录、注册页面,用户可选择对应操作
  33. 2.登录时添加了随机验证码的功能
  34. 3.登录后显示操作主菜单,普通用户可查看本帐户信息,也可修改帐户信息
  35. 4.管理员操作权限做了限制,如果普通用户选择会提示用户权限不足
  36. 5.管理员可对所有用户进行搜索、遍历所有用户、提升权限、重置所有用户密码、增加删除用户等操作
  37. 6.管理员提升用户权限时,会对账号角色进行判断,如果已为管理员,会提示
  38. 7.用户做修改操作时,避免了多个用户账号前几个字母相同时出现的用户越权现象:比如管理员为chengchen,普通用户为chengc
  39. 8.显示用户信息时,对密码加密显示,并且查找时,对密码字段不进行查找

user_info 文件:

  1. alex||alex@gmail.com||
  2. admin|admin|admin@admin.org||
  3. chengchen||chengchen@.com||
  4. chengc||chengc@oldboy.com||
  5. cc||niubi@niubi.com||
  6. ||@.com||
  7. ccccc||@ccccc.com||
  8. ccc|ccc|ccc@oldboy.org||

Code version1:

  1. #!/usr/bin/env python
  2. # -*-coding=utf-8-*-
  3. # Auther:ccorz Mail:ccniubi@163.com Blog:http://www.cnblogs.com/ccorz/
  4. # GitHub:https://github.com/ccorzorz
  5. import prettytable, time, random, os
  6.  
  7. USER_STATE = False
  8. LOGIN_STATE=False
  9. USER_NAME = None
  10.  
  11. def check_user_type(func):
  12. def inner(*args, **kwargs):
  13. if USER_STATE:
  14. r = func(*args, **kwargs)
  15. return r
  16. else:
  17. print('\033[31;1m用户%s权限不够,管理员才可使用此功能\033[0m' % USER_NAME)
  18. return inner
  19.  
  20. def check_user_state(USER_NAME):
  21. with open('user_info', 'r') as f:
  22. for line in f:
  23. line = line.strip()
  24. if line.startswith(USER_NAME) and USER_NAME == line.split('|')[0]:
  25. user_states = line.split('|')[4]
  26. if user_states == '':
  27. global USER_STATE
  28. USER_STATE = True
  29. else:
  30. pass
  31. return USER_STATE
  32.  
  33. def user_name_list():
  34. name_list = []
  35. with open('user_info', 'r') as f:
  36. for line in f:
  37. name_list.append(line.strip().split('|')[0])
  38. return name_list
  39.  
  40. def user_pwd_list():
  41. pwd_list = []
  42. with open('user_info', 'r') as f:
  43. for line in f:
  44. pwd_list.append(line.strip().split('|')[1])
  45. return pwd_list
  46.  
  47. def veri_code():
  48. li = []
  49. for i in range(6):
  50. r = random.randrange(0, 5)
  51. if r == 1 or r == 4:
  52. num = random.randrange(0, 9)
  53. li.append(str(num))
  54. else:
  55. temp = random.randrange(65, 91)
  56. char = chr(temp)
  57. li.append(char)
  58. r_code = ''.join(li)
  59. print('\033[31;1m%s\033[0m' % r_code)
  60. return r_code
  61.  
  62. def find_user_line_list(USER_NAME):
  63. with open('user_info','r') as f:
  64. for line in f:
  65. if line.strip().startswith(USER_NAME) and USER_NAME == line.strip().split('|')[0]:
  66. user_name=USER_NAME
  67. pwd=line.strip().split('|')[1]
  68. mail=line.strip().split('|')[2]
  69. tel=line.strip().split('|')[3]
  70. user_t=line.strip().split('|')[4]
  71. line_list=[user_name,pwd,mail,tel,user_t]
  72. else:
  73. pass
  74. return line_list
  75.  
  76. def change_pwd(USER_NAME):
  77. new_pwd=input('请输入新的密码:')
  78. with open('user_info','r') as f,open('user_info_new','w') as new_f:
  79. for line in f:
  80. if line.strip().startswith(USER_NAME) and USER_NAME == line.strip().split('|')[0]:
  81. line_list=find_user_line_list(USER_NAME)
  82. line_list[1]=new_pwd
  83. new_line='|'.join(line_list)
  84. new_f.write('%s\n'%new_line)
  85. else:
  86. new_f.write(line)
  87. os.rename('user_info','user_info.bak')
  88. os.rename('user_info_new','user_info')
  89. os.remove('user_info.bak')
  90. return True
  91.  
  92. def change_mail(USER_NAME):
  93. new_mail=input('请输入新邮箱:')
  94. with open('user_info','r') as f,open('user_info_new','w') as new_f:
  95. for line in f:
  96. if line.strip().startswith(USER_NAME) and USER_NAME == line.strip().split('|')[0]:
  97. line_list=find_user_line_list(USER_NAME)
  98. line_list[2]=new_mail
  99. new_line='|'.join(line_list)
  100. new_f.write('%s\n'%new_line)
  101. else:
  102. new_f.write(line)
  103. os.rename('user_info','user_info.bak')
  104. os.rename('user_info_new','user_info')
  105. os.remove('user_info.bak')
  106. return True
  107.  
  108. def change_tel(USER_NAME):
  109. new_tel=input('请输入新的电话号码:')
  110. with open('user_info','r') as f,open('user_info_new','w') as new_f:
  111. for line in f:
  112. if line.strip().startswith(USER_NAME) and USER_NAME == line.strip().split('|')[0]:
  113. line_list=find_user_line_list(USER_NAME)
  114. line_list[3]=new_tel
  115. new_line='|'.join(line_list)
  116. new_f.write('%s\n'%new_line)
  117. else:
  118. new_f.write(line)
  119. os.rename('user_info','user_info.bak')
  120. os.rename('user_info_new','user_info')
  121. os.remove('user_info.bak')
  122. return True
  123.  
  124. def modify_user_info(USER_NAME):
  125. row=prettytable.PrettyTable()
  126. row.field_names=['修改密码','修改邮箱','修改联系电话']
  127. row.add_row([1,2,3])
  128. print(row)
  129. while True:
  130. inp=input('请选择功能菜单,\033[32;1m返回主菜单请输入b或者back\033[0m:')
  131. if inp == '':
  132. res=change_pwd(USER_NAME)
  133. if res:
  134. print('密码修改成功')
  135. break
  136. elif inp == '':
  137. res=change_mail(USER_NAME)
  138. if res:
  139. print('邮箱修改成功')
  140. break
  141. elif inp == '':
  142. res=change_tel(USER_NAME)
  143. if res:
  144. print('电话修改成功')
  145. break
  146. elif inp == 'back' or inp == 'b':
  147. break
  148. else:
  149. print('输入有误,请重新输入!')
  150. return True
  151.  
  152. def no_pwd_file():
  153. with open('user_info', 'r') as f, open('no_pwd', 'w') as new_f:
  154. for line in f:
  155. line = line.strip().lower().split('|')
  156. del line[1]
  157. line = '|'.join(line)
  158. new_f.write('%s\n' % line)
  159.  
  160. @check_user_type
  161. def show_all_user():
  162. no_pwd_file()
  163. row = prettytable.PrettyTable()
  164. row.field_names = ['用户名', '密码', '邮箱', '电话', '账户类型']
  165. with open('no_pwd','r') as f:
  166. for line in f:
  167. line = line.strip()
  168. if line.split('|')[3]=='':
  169. user_type='管理员'
  170. elif line.split('|')[3]=='':
  171. user_type='普通用户'
  172. row.add_row([line.split('|')[0],'***',line.split('|')[1],
  173. line.split('|')[2],user_type])
  174. print(row)
  175. os.remove('no_pwd')
  176. return True
  177.  
  178. def show_user_info(USER_NAME):
  179. user_info_list = []
  180. with open('user_info', 'r') as f:
  181. for line in f:
  182. line = line.strip()
  183. if line.startswith(USER_NAME) and USER_NAME == line.split('|')[0]:
  184. user_info_list.extend(line.split('|'))
  185. if len(user_info_list) == 0:
  186. print('无此用户或者没有相关权限')
  187. else:
  188. user_type = None
  189. if user_info_list[4] == '':
  190. user_type = '管理员'
  191. elif user_info_list[4] == '':
  192. user_type = '普通用户'
  193. row = prettytable.PrettyTable()
  194. row.field_names = ['用户名', '密码', '邮箱', '电话', '账户类型']
  195. row.add_row([user_info_list[0], '****', user_info_list[2],
  196. user_info_list[3], user_type])
  197. print(row)
  198.  
  199. def regis():
  200. name_list = user_name_list()
  201. i = 0
  202. while i < 3:
  203. name = input('请输入用户名:')
  204. if name in name_list:
  205. print('用户名%s已被注册' % name)
  206. i += 1
  207. return False,name
  208. else:
  209. pwd = input('请输入密码:')
  210. mail = input('请输入邮箱:')
  211. tel = input('请输入电话:')
  212. info = [name, pwd, mail, tel, '']
  213. new_line = '|'.join(info)
  214. with open('user_info', 'a') as f:
  215. f.write('%s\n' % new_line)
  216. break
  217. return True,name
  218.  
  219. def login():
  220. name_list = user_name_list()
  221. pwd_list = user_pwd_list()
  222. exit_flag = 0
  223. i_a = 0
  224. i_b = 0
  225. i_c = 0
  226. while i_a < 3 and exit_flag == 0:
  227. USER_NAME= input('请输入用户名:')
  228. if USER_NAME in name_list:
  229. while i_b < 3 and exit_flag == 0:
  230. pwd = input('请输入%s的密码:' % USER_NAME)
  231. if pwd == pwd_list[name_list.index(USER_NAME)]:
  232. while i_c < 3 and exit_flag == 0:
  233. r_code = veri_code()
  234. c_cod = input('请输入红色字体显示的校验码:')
  235. if c_cod.lower() == r_code.lower():
  236. global LOGIN_STATE
  237. LOGIN_STATE = True
  238. print("登陆成功")
  239. exit_flag = 1
  240. elif i_c == 2:
  241. exit_flag = 1
  242. print('验证次数超过三次,登陆退出...')
  243. else:
  244. i_c += 1
  245. '校验码不正确,请重新验证'
  246. elif i_b == 2:
  247. exit_flag = 1
  248. print('尝试次数过多,退出登陆系统.')
  249. else:
  250. i_b += 1
  251. print('密码不正确,请重新输入..')
  252. else:
  253. i_a += 1
  254. print('无此账户,请确认用户名')
  255. return LOGIN_STATE, USER_NAME
  256.  
  257. @check_user_type
  258. def search(keywords):
  259. no_pwd_file()
  260. res = []
  261. search_res_list = []
  262. user_type = None
  263. with open('no_pwd', 'r') as f:
  264. for line in f:
  265. line = line.strip()
  266. if keywords in line:
  267. res.append(line)
  268. if len(res) == 0:
  269. print('通过关键字查询,无结果.')
  270. else:
  271. for line in res:
  272. if line.split('|')[3] == '':
  273. user_type = '普通用户'
  274. elif line.split('|')[3] == '':
  275. user_type = '管理员'
  276. li = [line.split('|')[0], line.split('|')[1],
  277. line.split('|')[2], user_type, ]
  278. search_res_list.append(li)
  279. row = prettytable.PrettyTable()
  280. row.field_names = ['用户名', '邮箱', '电话', '用户类型']
  281. for line in search_res_list:
  282. row.add_row([line[0], line[1], line[2], line[3], ])
  283. print(row)
  284. os.remove('no_pwd')
  285.  
  286. @check_user_type
  287. def update_user(account):
  288. with open('user_info','r') as f,open('user_info_new','w') as new_f:
  289. for line in f:
  290. if line.strip().startswith(account) and account == line.strip().split('|')[0]:
  291. new_line_list=line.strip().split('|')
  292. if new_line_list[4] == '':
  293. return False
  294. else:
  295. new_line_list[4]=''
  296. new_line='|'.join(new_line_list)
  297. new_f.write('%s\n'%new_line)
  298. else:
  299. new_f.write(line)
  300. os.rename('user_info','user_info.bak')
  301. os.rename('user_info_new','user_info')
  302. os.remove('user_info.bak')
  303. return True
  304.  
  305. @check_user_type
  306. def reset_pwd(account,new_pwd):
  307. with open('user_info','r') as f,open('user_info_new','w') as new_f:
  308. for line in f:
  309. if line.strip().startswith(account) and account == line.strip().split('|')[0]:
  310. new_line_list=line.strip().split('|')
  311. new_line_list[1]=new_pwd
  312. new_line='|'.join(new_line_list)
  313. new_f.write('%s\n'%new_line)
  314. else:
  315. new_f.write(line)
  316. os.rename('user_info','user_info.bak')
  317. os.rename('user_info_new','user_info')
  318. os.remove('user_info.bak')
  319. return True
  320.  
  321. @check_user_type
  322. def dele_user():
  323. show_all_user()
  324. name=input('输入您要删除的用户')
  325. name_list=user_name_list()
  326. if name in name_list:
  327. with open('user_info','r') as f,open('user_info_new','w') as new_f:
  328. for line in f:
  329. if line.strip().startswith(name) and name == line.strip().split('|')[0]:
  330. pass
  331. else:
  332. new_f.write(line)
  333. os.rename('user_info','user_info.bak')
  334. os.rename('user_info_new','user_info')
  335. os.remove('user_info.bak')
  336. print('账户%s删除完毕'%name)
  337. else:
  338. print('无%s的账户信息,请确认后再操作'%name)
  339.  
  340. @check_user_type
  341. def edit_user():
  342. row=prettytable.PrettyTable()
  343. row.field_names=['增加用户','删除用户']
  344. row.add_row([1,2])
  345. print(row)
  346. while True:
  347. inp=input('请选择功能\033[32;1m返回输入back或b\033[0m:')
  348. if inp == '':
  349. res,name=regis()
  350. if res:
  351. print('新增用户%s'%name)
  352. break
  353. elif inp == '':
  354. dele_user()
  355. break
  356. elif inp == 'b' or inp == 'back':
  357. break
  358. else:
  359. print('输入有误,请重新输入')
  360.  
  361. def logout():
  362. global USER_STATE,LOGIN_STATE,USER_NAME
  363. USER_STATE, LOGIN_STATE, USER_NAME=False,False,None
  364. exit('程序已退出!!')
  365.  
  366. def show_menu():
  367. row=prettytable.PrettyTable()
  368. row.field_names=['查看%s账户信息'%USER_NAME,'修改%s帐户信息'%USER_NAME,
  369. '\033[31;1m模糊查询\033[0m','\033[31;1m查看所有用户\033[0m',
  370. '\033[31;1m提升指定用户为管理员\033[0m',
  371. '\033[31;1m重置成员密码\033[0m',
  372. '\033[31;1m增删成员\033[0m','退出']
  373. row.add_row([1,2,3,4,5,6,7,'q&quit'])
  374. print('\033[32;1m欢迎来到大牛逼CRM系统\033[0m'.center(120))
  375. print(row)
  376.  
  377. def main():
  378. row = prettytable.PrettyTable()
  379. row.field_names = ['功能', '登录' , '注册用户']
  380. row.add_row(['快捷键','',''])
  381. print(row)
  382. inp = input('请输入菜单序列号:')
  383. if inp == '':
  384. global LOGIN_STATE, USER_NAME
  385. LOGIN_STATE, USER_NAME = login()
  386. global USER_STATE
  387. USER_STATE = check_user_state(USER_NAME)
  388. if LOGIN_STATE:
  389. while True:
  390. show_menu()
  391. inp=input('输入相应序列号,选择相应功能,'
  392. '\033[31;1m红色字体为管理员操作,请慎选\033[0m:')
  393. if inp == '':
  394. show_user_info(USER_NAME)
  395. time.sleep(1)
  396. elif inp == '':
  397. modify_user_info(USER_NAME)
  398. time.sleep(1)
  399. elif inp == '':
  400. show_all_user()
  401. time.sleep(1)
  402. elif inp == '':
  403. keywords = input('请输入您要查询的关键字')
  404. res = search(keywords)
  405. time.sleep(1)
  406. elif inp == '':
  407. res=show_all_user()
  408. if res:
  409. account=input('请输入您要提升的用户账号名称:')
  410. name_list=user_name_list()
  411. if account in name_list:
  412. res=update_user(account)
  413. if res:
  414. print('权限提升成功')
  415. else:
  416. print('\033[31;1m%s已经是管理员,'
  417. '无需提升权限!\033[0m'%account)
  418. time.sleep(1)
  419. else:
  420. print('\033[31;1m无此账户:%s信息\033[0m'%account)
  421. else:
  422. pass
  423. time.sleep(1)
  424. elif inp == '':
  425. res=show_all_user()
  426. if res:
  427. account=input('请输入您要修改用户账号名称:')
  428. name_list=user_name_list()
  429. if account in name_list:
  430. new_pwd=input('请输入账户的新密码:')
  431. res=reset_pwd(account,new_pwd)
  432. if res:
  433. print('密码已重置成功')
  434. else:
  435. print('\033[31;1m无此账户:%s信息\033[0m'%account)
  436. time.sleep(1)
  437. else:
  438. pass
  439. time.sleep(1)
  440. elif inp == '':
  441. edit_user()
  442. time.sleep(1)
  443. if inp == 'q' or inp == 'quit':
  444. logout()
  445. else:
  446. print('输入有误,请重新输入!')
  447. else:
  448. exit('登陆有误,程序退出')
  449. elif inp == '':
  450. res,name=regis()
  451. if res:
  452. print('用户%s注册成功' % name)
  453. else:
  454. pass
  455. else:
  456. exit('选择错误,程序退出')
  457.  
  458. main()

Code version2:

  1. #!/usr/bin/env python
  2. # -*-coding=utf-8-*-
  3. # Auther:ccorz Mail:ccniubi@163.com Blog:http://www.cnblogs.com/ccorz/
  4. # GitHub:https://github.com/ccorzorz
  5.  
  6. import prettytable, time, random, os
  7.  
  8. USER_STATE = False
  9. LOGIN_STATE=False
  10. USER_NAME = None
  11.  
  12. def check_user_type(func):
  13. def inner(*args, **kwargs):
  14. if USER_STATE:
  15. r = func(*args, **kwargs)
  16. return r
  17. else:
  18. print('\033[31;1m用户%s权限不够,管理员才可使用此功能\033[0m' % USER_NAME)
  19. return inner
  20.  
  21. def check_user_state(USER_NAME):
  22. with open('user_info', 'r') as f:
  23. for line in f:
  24. line = line.strip()
  25. if line.startswith(USER_NAME) and USER_NAME == line.split('|')[0]:
  26. user_states = line.split('|')[4]
  27. if user_states == '':
  28. global USER_STATE
  29. USER_STATE = True
  30. else:
  31. pass
  32. return USER_STATE
  33.  
  34. def user_name_list():
  35. name_list = []
  36. with open('user_info', 'r') as f:
  37. for line in f:
  38. name_list.append(line.strip().split('|')[0])
  39. return name_list
  40.  
  41. def user_pwd_list():
  42. pwd_list = []
  43. with open('user_info', 'r') as f:
  44. for line in f:
  45. pwd_list.append(line.strip().split('|')[1])
  46. # print(pwd_list)
  47. return pwd_list
  48.  
  49. def veri_code():
  50. li = []
  51. for i in range(6):
  52. r = random.randrange(0, 5)
  53. if r == 1 or r == 4:
  54. num = random.randrange(0, 9)
  55. li.append(str(num))
  56. else:
  57. temp = random.randrange(65, 91)
  58. char = chr(temp)
  59. li.append(char)
  60. r_code = ''.join(li)
  61. print('\033[31;1m%s\033[0m' % r_code)
  62. return r_code
  63.  
  64. def find_user_line_list(USER_NAME):
  65. with open('user_info','r') as f:
  66. for line in f:
  67. if line.strip().startswith(USER_NAME) and USER_NAME == line.strip().split('|')[0]:
  68. user_name=USER_NAME
  69. pwd=line.strip().split('|')[1]
  70. mail=line.strip().split('|')[2]
  71. tel=line.strip().split('|')[3]
  72. user_t=line.strip().split('|')[4]
  73. line_list=[user_name,pwd,mail,tel,user_t]
  74. else:
  75. pass
  76. return line_list
  77.  
  78. def change_pwd(USER_NAME):
  79. new_pwd=input('请输入新的密码:')
  80. with open('user_info','r') as f,open('user_info_new','w') as new_f:
  81. for line in f:
  82. if line.strip().startswith(USER_NAME) and USER_NAME == line.strip().split('|')[0]:
  83. line_list=find_user_line_list(USER_NAME)
  84. line_list[1]=new_pwd
  85. new_line='|'.join(line_list)
  86. new_f.write('%s\n'%new_line)
  87. else:
  88. new_f.write(line)
  89. os.rename('user_info','user_info.bak')
  90. os.rename('user_info_new','user_info')
  91. os.remove('user_info.bak')
  92. return True
  93.  
  94. def change_mail(USER_NAME):
  95. new_mail=input('请输入新邮箱:')
  96. with open('user_info','r') as f,open('user_info_new','w') as new_f:
  97. for line in f:
  98. if line.strip().startswith(USER_NAME) and USER_NAME == line.strip().split('|')[0]:
  99. line_list=find_user_line_list(USER_NAME)
  100. line_list[2]=new_mail
  101. new_line='|'.join(line_list)
  102. new_f.write('%s\n'%new_line)
  103. else:
  104. new_f.write(line)
  105. os.rename('user_info','user_info.bak')
  106. os.rename('user_info_new','user_info')
  107. os.remove('user_info.bak')
  108. return True
  109.  
  110. def change_tel(USER_NAME):
  111. new_tel=input('请输入新的电话号码:')
  112. with open('user_info','r') as f,open('user_info_new','w') as new_f:
  113. for line in f:
  114. if line.strip().startswith(USER_NAME) and USER_NAME == line.strip().split('|')[0]:
  115. line_list=find_user_line_list(USER_NAME)
  116. line_list[3]=new_tel
  117. new_line='|'.join(line_list)
  118. new_f.write('%s\n'%new_line)
  119. else:
  120. new_f.write(line)
  121. os.rename('user_info','user_info.bak')
  122. os.rename('user_info_new','user_info')
  123. os.remove('user_info.bak')
  124. return True
  125.  
  126. def modify_user_info(USER_NAME):
  127. row=prettytable.PrettyTable()
  128. row.field_names=['修改密码','修改邮箱','修改联系电话']
  129. row.add_row([1,2,3])
  130. print(row)
  131. while True:
  132. inp=input('请选择功能菜单,\033[32;1m返回主菜单请输入b或者back\033[0m:')
  133. if inp == '':
  134. res=change_pwd(USER_NAME)
  135. if res:
  136. print('密码修改成功')
  137. break
  138. elif inp == '':
  139. res=change_mail(USER_NAME)
  140. if res:
  141. print('邮箱修改成功')
  142. break
  143. elif inp == '':
  144. res=change_tel(USER_NAME)
  145. if res:
  146. print('电话修改成功')
  147. break
  148. elif inp == 'back' or inp == 'b':
  149. break
  150. else:
  151. print('输入有误,请重新输入!')
  152. return True
  153.  
  154. def no_pwd_file():
  155. with open('user_info', 'r') as f, open('no_pwd', 'w') as new_f:
  156. for line in f:
  157. line = line.strip().lower().split('|')
  158. del line[1]
  159. line = '|'.join(line)
  160. new_f.write('%s\n' % line)
  161.  
  162. @check_user_type
  163. def show_all_user():
  164. # print('USER_NAME:%s'%USER_NAME)
  165. # print('USER_STATE:%s'%USER_STATE)
  166. no_pwd_file()
  167. row = prettytable.PrettyTable()
  168. row.field_names = ['用户名', '密码', '邮箱', '电话', '账户类型']
  169. with open('no_pwd','r') as f:
  170. for line in f:
  171. line = line.strip()
  172. if line.split('|')[3]=='':
  173. user_type='管理员'
  174. elif line.split('|')[3]=='':
  175. user_type='普通用户'
  176. row.add_row([line.split('|')[0],'***',line.split('|')[1],
  177. line.split('|')[2],user_type])
  178. print(row)
  179. os.remove('no_pwd')
  180. return True
  181.  
  182. def show_user_info(USER_NAME):
  183. user_info_list = []
  184. with open('user_info', 'r') as f:
  185. for line in f:
  186. line = line.strip()
  187. if line.startswith(USER_NAME) and USER_NAME == line.split('|')[0]:
  188. user_info_list.extend(line.split('|'))
  189. if len(user_info_list) == 0:
  190. print('无此用户或者没有相关权限')
  191. else:
  192. user_type = None
  193. if user_info_list[4] == '':
  194. user_type = '管理员'
  195. elif user_info_list[4] == '':
  196. user_type = '普通用户'
  197. row = prettytable.PrettyTable()
  198. row.field_names = ['用户名', '密码', '邮箱', '电话', '账户类型']
  199. row.add_row([user_info_list[0], '****', user_info_list[2],
  200. user_info_list[3], user_type])
  201. print(row)
  202.  
  203. def regis():
  204. name_list = user_name_list()
  205. i = 0
  206. while i < 3:
  207. name = input('请输入用户名:')
  208. if name in name_list:
  209. print('用户名%s已被注册' % name)
  210. i += 1
  211. return False,name
  212. else:
  213. pwd = input('请输入密码:')
  214. mail = input('请输入邮箱:')
  215. tel = input('请输入电话:')
  216. info = [name, pwd, mail, tel, '']
  217. new_line = '|'.join(info)
  218. with open('user_info', 'a') as f:
  219. f.write('%s\n' % new_line)
  220. break
  221. return True,name
  222.  
  223. def login():
  224. name_list = user_name_list()
  225. pwd_list = user_pwd_list()
  226. exit_flag = 0
  227. i_a = 0
  228. i_b = 0
  229. i_c = 0
  230. while i_a < 3 and exit_flag == 0:
  231. USER_NAME= input('请输入用户名:')
  232. if USER_NAME in name_list:
  233. while i_b < 3 and exit_flag == 0:
  234. pwd = input('请输入%s的密码:' % USER_NAME)
  235. if pwd == pwd_list[name_list.index(USER_NAME)]:
  236. while i_c < 3 and exit_flag == 0:
  237. r_code = veri_code()
  238. c_cod = input('请输入红色字体显示的校验码:')
  239. if c_cod.lower() == r_code.lower():
  240. global LOGIN_STATE
  241. LOGIN_STATE = True
  242. print("登陆成功")
  243. exit_flag = 1
  244. elif i_c == 2:
  245. exit_flag = 1
  246. print('验证次数超过三次,登陆退出...')
  247. else:
  248. i_c += 1
  249. '校验码不正确,请重新验证'
  250. elif i_b == 2:
  251. exit_flag = 1
  252. print('尝试次数过多,退出登陆系统.')
  253. else:
  254. i_b += 1
  255. print('密码不正确,请重新输入..')
  256. else:
  257. i_a += 1
  258. print('无此账户,请确认用户名')
  259. return LOGIN_STATE, USER_NAME
  260.  
  261. @check_user_type
  262. def search(keywords):
  263. no_pwd_file()
  264. res = []
  265. search_res_list = []
  266. user_type = None
  267. with open('no_pwd', 'r') as f:
  268. for line in f:
  269. line = line.strip()
  270. if keywords in line:
  271. res.append(line)
  272. if len(res) == 0:
  273. print('通过关键字查询,无结果.')
  274. else:
  275. for line in res:
  276. if line.split('|')[3] == '':
  277. user_type = '普通用户'
  278. elif line.split('|')[3] == '':
  279. user_type = '管理员'
  280. li = [line.split('|')[0], line.split('|')[1],
  281. line.split('|')[2], user_type, ]
  282. search_res_list.append(li)
  283. row = prettytable.PrettyTable()
  284. row.field_names = ['用户名', '邮箱', '电话', '用户类型']
  285. for line in search_res_list:
  286. row.add_row([line[0], line[1], line[2], line[3], ])
  287. print(row)
  288. os.remove('no_pwd')
  289.  
  290. @check_user_type
  291. def update_user(account):
  292. with open('user_info','r') as f,open('user_info_new','w') as new_f:
  293. for line in f:
  294. if line.strip().startswith(account) and account == line.strip().split('|')[0]:
  295. new_line_list=line.strip().split('|')
  296. if new_line_list[4] == '':
  297. return False
  298. else:
  299. new_line_list[4]=''
  300. new_line='|'.join(new_line_list)
  301. new_f.write('%s\n'%new_line)
  302. else:
  303. new_f.write(line)
  304. os.rename('user_info','user_info.bak')
  305. os.rename('user_info_new','user_info')
  306. os.remove('user_info.bak')
  307. return True
  308.  
  309. @check_user_type
  310. def reset_pwd(account,new_pwd):
  311. with open('user_info','r') as f,open('user_info_new','w') as new_f:
  312. for line in f:
  313. if line.strip().startswith(account) and account == line.strip().split('|')[0]:
  314. new_line_list=line.strip().split('|')
  315. new_line_list[1]=new_pwd
  316. new_line='|'.join(new_line_list)
  317. new_f.write('%s\n'%new_line)
  318. else:
  319. new_f.write(line)
  320. os.rename('user_info','user_info.bak')
  321. os.rename('user_info_new','user_info')
  322. os.remove('user_info.bak')
  323. return True
  324.  
  325. @check_user_type
  326. def dele_user():
  327. show_all_user()
  328. name=input('输入您要删除的用户')
  329. name_list=user_name_list()
  330. if name in name_list:
  331. with open('user_info','r') as f,open('user_info_new','w') as new_f:
  332. for line in f:
  333. if line.strip().startswith(name) and name == line.strip().split('|')[0]:
  334. pass
  335. else:
  336. new_f.write(line)
  337. os.rename('user_info','user_info.bak')
  338. os.rename('user_info_new','user_info')
  339. os.remove('user_info.bak')
  340. print('账户%s删除完毕'%name)
  341. else:
  342. print('无%s的账户信息,请确认后再操作'%name)
  343.  
  344. @check_user_type
  345. def edit_user():
  346. row=prettytable.PrettyTable()
  347. row.field_names=['增加用户','删除用户']
  348. row.add_row([1,2])
  349. print(row)
  350. while True:
  351. inp=input('请选择功能\033[32;1m返回输入back或b\033[0m:')
  352. if inp == '':
  353. res,name=regis()
  354. if res:
  355. print('新增用户%s'%name)
  356. break
  357. elif inp == '':
  358. dele_user()
  359. break
  360. elif inp == 'b' or inp == 'back':
  361. break
  362. else:
  363. print('输入有误,请重新输入')
  364.  
  365. def logout():
  366. global USER_STATE,LOGIN_STATE,USER_NAME
  367. USER_STATE, LOGIN_STATE, USER_NAME=False,False,None
  368. exit('程序已退出!!')
  369.  
  370. def show_menu():
  371. row=prettytable.PrettyTable()
  372. row.field_names=['\033[31;1m模糊查询\033[0m','\033[31;1m查看所有用户\033[0m',
  373. '\033[31;1m提升指定用户为管理员\033[0m',
  374. '\033[31;1m重置成员密码\033[0m',
  375. '\033[31;1m增删成员\033[0m']
  376. row.add_row([3,4,5,6,7])
  377. # print('\033[32;1m欢迎来到大牛逼CRM系统\033[0m'.center(75))
  378. print(row)
  379.  
  380. def show_menu_2():
  381. row=prettytable.PrettyTable()
  382. row.field_names=['查看%s账户信息'%USER_NAME,'修改%s帐户信息'%USER_NAME,
  383. '\033[31;1m退出\033[0m']
  384. row.add_row([1,2,'q&quit'])
  385. print('\033[32;1m欢迎来到大牛逼CRM系统\033[0m'.center(50))
  386. print(row)
  387.  
  388. def main():
  389. row = prettytable.PrettyTable()
  390. row.field_names = ['功能', '登录' , '注册用户']
  391. row.add_row(['快捷键','',''])
  392. print(row)
  393. inp = input('请输入菜单序列号:')
  394. if inp == '':
  395. global LOGIN_STATE, USER_NAME
  396. LOGIN_STATE, USER_NAME = login()
  397. global USER_STATE
  398. USER_STATE = check_user_state(USER_NAME)
  399. print('USER_STATE:%s'%USER_STATE)
  400. if LOGIN_STATE:
  401. while True:
  402. show_menu_2()
  403. if USER_STATE:
  404. show_menu()
  405. else:pass
  406. inp=input('输入相应序列号,选择相应功能,'
  407. '\033[31;1m红色字体为管理员操作,请慎选\033[0m:')
  408. if inp == '':
  409. show_user_info(USER_NAME)
  410. time.sleep(1)
  411. elif inp == '':
  412. modify_user_info(USER_NAME)
  413. time.sleep(1)
  414. elif inp == '':
  415. show_all_user()
  416. time.sleep(1)
  417. elif inp == '':
  418. keywords = input('请输入您要查询的关键字')
  419. res = search(keywords)
  420. time.sleep(1)
  421. elif inp == '':
  422. res=show_all_user()
  423. if res:
  424. account=input('请输入您要提升的用户账号名称:')
  425. name_list=user_name_list()
  426. if account in name_list:
  427. res=update_user(account)
  428. if res:
  429. print('权限提升成功')
  430. else:
  431. print('\033[31;1m%s已经是管理员,'
  432. '无需提升权限!\033[0m'%account)
  433. time.sleep(1)
  434. else:
  435. print('\033[31;1m无此账户:%s信息\033[0m'%account)
  436. else:
  437. pass
  438. time.sleep(1)
  439. elif inp == '':
  440. res=show_all_user()
  441. if res:
  442. account=input('请输入您要修改用户账号名称:')
  443. name_list=user_name_list()
  444. if account in name_list:
  445. new_pwd=input('请输入账户的新密码:')
  446. res=reset_pwd(account,new_pwd)
  447. if res:
  448. print('密码已重置成功')
  449. else:
  450. print('\033[31;1m无此账户:%s信息\033[0m'%account)
  451. time.sleep(1)
  452. else:
  453. pass
  454. time.sleep(1)
  455. elif inp == '':
  456. edit_user()
  457. time.sleep(1)
  458. elif inp == 'q' or inp == 'quit':
  459. logout()
  460. else:
  461. print('输入有误,请重新输入!')
  462. else:
  463. exit('登陆有误,程序退出')
  464. elif inp == '':
  465. res,name=regis()
  466. if res:
  467. print('用户%s注册成功' % name)
  468. else:
  469. pass
  470. else:
  471. exit('选择错误,程序退出')
  472.  
  473. main()

Day4作业:蛋疼CRM系统的更多相关文章

  1. CRM系统(第一部分)

      阅读目录 1.需求分析 2.数据库表设计 3.起步 4.录入数据 5.知识点 1.需求分析 CRM客户关系管理软件---> 学员管理 用户:企业内部用户 用户量: 业务场景: 2.数据库表设 ...

  2. Django CRM系统

    本节内容 业务痛点分析 项目需求讨论 使用场景分析 表结构设计 业务痛点分析 我2013年刚加入老男孩教育的时候,学校就一间教室,2个招生老师,招了学生后,招生老师就在自己的excel表里记录一下,每 ...

  3. crm 系统项目(二) admin 后台操作表格

    crm 系统项目(二) admin 后台操作表格 1. app下创建 templates  运行的时候 先找全局的templates——> 按照app的注册顺序找templates中的文件 2. ...

  4. crm 系统项目(一) 登录,注册,校验

    crm 系统项目(一) 登录,注册,校验 首先创建一个Django项目,关于配置信息不多说,前面有~ models.py文件下创建需要的表格信息,之后导入数据库 from django.db impo ...

  5. Java高级项目实战之CRM系统01:CRM系统概念和分类、企业项目开发流程

    1. CRM系统介绍 CRM系统即客户关系管理系统, 顾名思义就是管理公司与客户之间的关系. 是一种以"客户关系一对一理论"为基础,旨在改善企业与客户之间关系的新型管理机制.客户关 ...

  6. 如何在CRM系统中集成ActiveReports最终报表设计器

    有时候,将ActiveReports设计器集成到业务系统中,为用户提供一些自定义的数据表,用户不需要了解如何底层的逻辑关系和后台代码,只需要选择几张关联的数据表,我们会根据用户的选择生成可供用户直接使 ...

  7. CRM系统简析

    寄语: 简单阐述一下对CRM系统应用的理解,此内容参考网上资料所整理. CRM是Customer Relationship Management的缩写,简称客户关系管理. CRM系统可以从三个方面来分 ...

  8. 面向企业客户的制造业CRM系统的不成熟思考

    CRM就是客户关系管理(Customer Relationship Management),一直一知半解,最近有涉及这方面的需求,所以稍作研究,并思考一些相关问题. CRM是什么? CRM具体如何定义 ...

  9. Java课程设计——博客作业教学数据分析系统(201521123084 林正晟)

    #课程设计--博客作业教学数据分析系统(201521123084 林正晟) 1.团队课程设计博客链接 博客作业教学数据分析系统 2.个人负责模块或任务说明 学生登陆界面的前端实现和与数据库的连接 学生 ...

随机推荐

  1. Unable to open debugger port (127.0.0.1:63959): java.net.SocketException "socket closed",编译过来就是无法打开调试器端口,套接字已关闭

    最开始的预测: 这台笔记本操作系统是win10专业工作站版,debug启动项目,provide项目完美启动成功,然后consumer项目报错:Unable to open debugger port ...

  2. go 变量的定义方式

    var a int a = 1 var a,b int a =1 b = 2 var a,b = 1,2 var s string = "hello world" a, b := ...

  3. jquery.lazyload(懒加载)的使用与配置

    jquery lazyload是一款基于jquery框架的图片延迟加载应用,它可以让用户访问页面的时候只显示当前屏幕所示的图片.原理为利用JS替换图片src为loading图片,新data-origi ...

  4. python func(*args, **kwargs)

    func(*args, **kwargs) *args, **kwargs表示函数的可变参数 *args 表示任何多个无名参数,它是一个tuple **kwargs 表示关键字参数,它是一个dict ...

  5. HDU-2082-找单词(母函数)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=2082 题意: 假设有x1个字母A, x2个字母B,..... x26个字母Z,同时假设字母A的价值为1, ...

  6. HDU-5446-UnknownTreasure(组合数,中国剩余定理)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=5446 题意: On the way to the next secret treasure hiding ...

  7. 51、[源码]-Spring容器创建-容器创建完成

    51.[源码]-Spring容器创建-容器创建完成 12.finishRefresh();完成BeanFactory的初始化创建工作:IOC容器就创建完成: 1).initLifecycleProce ...

  8. ssh 免密码登录 单机和集群配置

    1.在主机上(A)生成密钥对 ssh-keygen -t rsa -P '' #在A主机上执行,生成密钥对 直接按enter键 执行以下命令,会在  ~/.ssh/ 目录生成 id_rsa  id_r ...

  9. sql server 游标的基本用法

    DECLARE @Id NVARCHAR(MAX) DECLARE @UserName NVARCHAR(MAX) DECLARE @Password NVARCHAR(MAX) DECLARE @N ...

  10. spark常见错误【持续更新】

    错误1.错误: 找不到或无法加载主类 idea.scala代码 idea 导入的scala工程,编写代码后报该错误. 原因:\src\main\scala 包路径下没有将scala这个包设置成Sour ...