分类

课内:
不限
类型:
不限 游戏 项目 竞赛 个人研究 其他
评分:
不限 10 9 8 7 6 5 4 3 2 1
年份:
不限 2018 2019 2020 2021

资源列表

  • 基于springboot的自动化办公系统(企业人事管理系统)

    面向组织的日常运作和管理,员工及管理者使用频率最高的应用系统,极大提高公司的办公效率。oasys是一个OA办公自动化系统,使用Maven进行项目管理,基于springboot框架开发的项目,mysql底层数据库,前端采用freemarker模板引擎,Bootstrap作为前端UI框架,集成了jpa、mybatis等框架。
    1.项目介绍oasys是一个OA办公自动化系统,使用Maven进行项目管理,基于springboot框架开发的项目,mysql底层数据库,前端采用freemarker模板引擎,Bootstrap作为前端UI框架,集成了jpa、mybatis等框架。作为初学springboot的同学是一个很不错的项目,如果想在此基础上面进行OA的增强,也是一个不错的方案。
    2.框架介绍项目结构

    前端



    技术
    名称
    版本
    官网




    freemarker
    模板引擎springboot
    1.5.6.RELEASE集成版本
    https://freemarker.apache.org/


    Bootstrap
    前端UI框架
    3.3.7
    http://www.bootcss.com/


    Jquery
    快速的JavaScript框架
    1.11.3
    https://jquery.com/


    kindeditor
    HTML可视化编辑器
    4.1.10
    http://kindeditor.net


    My97 DatePicker
    时间选择器
    4.8 Beta4
    http://www.my97.net/




    后端



    技术
    名称
    版本
    官网




    SpringBoot
    SpringBoot框架
    1.5.6.RELEASE
    https://spring.io/projects/spring-boot


    JPA
    spring-data-jpa
    1.5.6.RELEASE
    https://projects.spring.io/spring-data-jpa


    Mybatis
    Mybatis框架
    1.3.0
    http://www.mybatis.org/mybatis-3


    fastjson
    json解析包
    1.2.36
    https://github.com/alibaba/fastjson


    pagehelper
    Mybatis分页插件
    1.0.0
    https://pagehelper.github.io



    3.部署流程
    把oasys.sql导入本地数据库
    修改application.properties,
    修改数据源,oasys——>自己本地的库名,用户名和密码修改成自己的
    修改相关路径,配置图片路径、文件路径、附件路径
    OasysApplication.java中的main方法运行,控制台没有报错信息,数据启动时间多久即运行成功
    在浏览器中输入localhost:8088/logins

    账号:test 密码:test账号:soli 密码:123456

    4.项目截图




    6 评论 85 下载 2019-04-03 19:56:24 下载需要15点积分
  • 基于QT的考试管理系统设计与实现

    一、项目概要1.1 项目名称
    考试管理系统
    1.2 项目目标
    培养快速学习新的知识,解决问题的能力规划项目的整体功能以及相关需求分析,并设计出合理的数据库,并熟悉整个试题系统的开发流程。
    1.3 软件概要开发一个考试管理系统,考生可以进行练习,和在线考试,管理员负责管理题库以及生成试卷,登陆主界面如图1.3所示。

    1.4 功能描述
    涉及到两个模块:学生登录和管理员登陆。
    基于学生的功能有:
    练习试题(此试题为题库中所有试题类型的所有题,考生可以任意答题且参考标准答案)
    在线考试(试卷从后台试卷库里面随机挑选,考生必须在指定时间内答完试题,交卷后显示考生成绩以及所用时间等信息)
    基于管理员的功能有:
    试题管理(管理题库中所有题,可以进行增删改查,支持关键字、难度等级查询)
    试卷管理(按照要求从题库随机挑选试题生成试卷,对已生成的试卷进行增删改查,支持成批生成试卷,成批删除试卷,根据试卷名,试卷内容,难度等级查询试卷,以及查看试卷内容)

    1.5 开发环境
    操作系统:Microsoft Windows 10开发环境:Qt Creator 8.1数据库:MySql Server 5.5
    1.6 关键技术
    面向对象设计与分析C++Qt数据库编程Qt信号槽
    二、软件详细需求2.1 学生功能主界面学生登录后进入如图2.1所示的界面,进行考试考试或者练习。

    2.2 管理员功能主界面管理员登陆后进入如图2-2所示界面,管理员可以对题库里的题增删改查,也可为学生在线考试随机组卷。

    2.3 学生在线考试系统实现学生进入考试系统,从已生成的试卷随机抽取答题,进入如图2-3-1所示界面,要求学生在规定的时间内答完试卷,可随机跳转试题,且将已做过或即时更新的的答案保存到数组。点击交卷或者退出考试将显示如图2-3-2所示界面,显示考试用时和考试成绩等信息。


    2.4 学生练习系统实现该考试练习从题库按照各种类型题抽取,考生可以切换题型,答完题也可查看正确答案。

    2.5 试题管理系统实现该试题管理系统将对题库类型题分类管理,每个类型题对应一个增删改查界面,如图2-5-2所示。



    题型
    添加题目
    修改题目
    删除题目
    查询题目




    选择题
    题目id自动增加,填写相关题干,abcd选项内容,答案,设置分数,等级难度等信息,点提交即可写入数据库
    页面显示题库该类型题所有信息,点击修改
    页面显示题目该类型题所有信息,选中行点击删除弹出是否删除页面,若确定则删除该题,可刷新页面
    支持难度和关键字以与关系的四种查询方式


    判断题
    题目id自动增加,填写内容题干,答案,设置分数,等级难度等信息,点击提交即可
    页面显示题库该类型题所有信息,点击修改
    页面显示题目该类型题所有信息,选中行点击删除弹出是否删除页面,若确定则删除该题,可刷新页面
    支持难度和关键字以与关系的四种查询方式


    填空题
    题目id自动增加,填写内容题干,输入空格数量,在下面随机生成,填写入对应空格即可设置分数,等级难度等信息,点击提交即可
    页面显示题库该类型题所有信息,点击修改,其中空格数量不可修改
    页面显示题目该类型题所有信息,选中行点击删除弹出是否删除页面,若确定则删除该题,可刷新页面
    支持难度和关键字以与关系的四种查询方式







    2.6 组卷系统主界面
    2.7 试卷生成实现可按照要求从题库随机抽选题型组成填写的试卷数量,要求所选题型与对应个数成绩相加等于总分,且题库里有该填写内容的要求的试题,否则弹出相关不满足要求的题型表,如图2-7-2所示,若不填知识点描述默认为综合,不选择难度等级则是随机。


    2.8 查看已生成试卷信息


    试卷查询
    支持试卷名,难度等级,知识点查询的三种方式随机组合查询




    现有试卷数
    始终随着查询,删除的更新变化,显示当前试卷数


    删除试卷
    选中行点击删除弹出是否删除试卷,若确定则删除该试卷,可刷新页面,支持成批删除(选中多行删除)


    查看试卷
    对选中试卷查看具体信息,显示试卷名,以及改试卷所有题型(使用QScrollArea控件显示)





    三、系统整体设计3.1 系统结构图
    3.2 模块要求
    功能界面层
    Qt主界面
    学生功能界面
    管理员功能界面
    DataBase MySql
    提供给上层的数据库访问,完成指定试卷试题学生管理员等数据信息的取得
    各种类型题已保存在数据库中
    对数据的添加、修改、删除,查询提供指定数据表

    四、登陆测试



    Accou:wrong Answ:wrong
    Accou:wrong Answer:right
    Account:right Answ:wrong
    Account:right Answer:right





    请选择身份
    请选择身份
    请选择身份
    请选择身份


    学生
    用户名或密码错误
    用户名或密码错误
    用户名或密码错误
    进入学生功能界面


    管理员
    用户名或密码错误
    用户名或密码错误
    用户名或密码错误
    进入管理员功能界面





    五、数据库设计(试卷管理系统)
    11 评论 264 下载 2018-10-05 22:46:51 下载需要15点积分
  • 基于JSP和SQL SERVER实现的B/S架构的超市管理系统

    1 引言社会生活的现代化,使得市场的走向发生巨大变化,由于经济的发展,人们对生活的需求已经不再满足于丰衣足食的低度要求,许多人们往往不是单纯为满足生活必需去购买,而是凭着喜欢、意欲和感观去购买。如果一个商店能够打动顾客、吸引顾客,自然会顾客盈门,而近几年新兴产业中超级市场ERMARKET)的现代化管理方式和便捷的购物方式,尤其是它轻松的购物环境。往往是打动顾客,吸引顾客的最主要的原因,且良好的周密的销售服务更是赢得信誉、吸引顾客的优势所 在。商品经济的高速现代化发展也促进了竞争,使一切不甘落后的商家都争先恐后地采用最新的管理方法来加强自己的竞争地位。因此,超市经营者如果不掌握当今市场发展的这一走向,不能将超市现代化经营作为努力开拓的目标,就无法使经营活络、财源茂盛。
    随着计算机网络技术以及数据库技术的迅速发展,管理信息系统得到了广泛应用。对于一个超市来讲:货品数量少则数以百计,多则数以万计;另外,不同超市的实际情况也有所不同。要对这些货品进行统一、高效的管理,靠人工完成工作量庞大、难免有错漏之处。为此,一个自动化的超市货品管理系统的开发非常必要。
    1.1 背景最初的超市资料管理,都是靠人力来完成的。但近几年我国超市经营规模日趋扩大,销售额和门店数量大幅度增加,而且许多超市正在突破以食品为主的传统格局,向品种多样化发展。小型超市在业务上需要处理大量的库存信息,还要时刻更新产品的销售信息,不断添加商品信息,并对商品各种信息进行统计分析。因此,在超市管理中引进现代化的办公软件,实现超市庞大商品的控制和传输,从而方便销售行业的管理和决策,为超市和超市管理人员解除后顾之忧。
    1.2 技术方案开发和管理一个基于B/S模式的管理信息系统需要开发和利用高效率的网络资源,并且应该充分利用高技术含量的技术。本系统开发中使用了Java Server Pages和Java Bean。为了能将Java Server Pages、Java Bean以及Java Servlets三种技术有机结合起来,本系统的总体架构采用了MVC模式。

    我们可以只使用JSP构建电子商务系统,但如果想完成一个有效的应用程序并用于商业上,则需要综合Java Server Pages,Java Bean,以及Java Servlets三种技术相互补充的力量。这种情况下就必然要使用MVC模式,它把应用程序划分为独立的数据管理Model,表现形式View,和控制组件Controller,成为最先进的图形用户接口的基础。这些划分模块支持独立开发并且以重复使用组件。
    2 系统所有功能模块详细介绍根据实际购物流程,绘制系统流程图,是编写程序代码的逻辑依据。在系统的开发之初,作为开发者,我们查阅了很多资料,并参考现有电子商务模式,从顾客网上购物真实流程及需求考虑,最终找到了购物的基本流程作为程序编写的结构框架。始终模拟实际购物,摆明线索,划清模块做到了有路可循。
    系统处理流程图如下所示:

    2.1 人力资源信息管理
    2.1.1 人事部门信息管理部门信息添加:作为一个中型超市管理信息系统,其中会存在多个部门,部门信息有时会需要添加,部门信息添加模块可以方便快捷的实现部门添加。

    界面描述:部门管理员输入部门编号和部门名称,点击提交后将数据保存到Departments表中。
    部门信息修改:超市管理信息系统,其中存在多个部门,部门信息有时因为各种原因需要修改,部门信息修改模块可以方便快捷的实现部门修改。

    界面描述:部门编号从数据库中的表Departments中读出,部门名称由部门管理员修改。提交后更新表Departments。
    部门信息删除:中型超市管理信息系统中,可能因为企业改革等,现有的部门已经不在适合企业的管理,部门信息需要删除,部门信息删除模块可以灵活的实现部门删除。

    界面描述:部门管理员输入部门编号查询部门,点击删除链接后将删除所选部门,并更新Departments表中的数据。
    2.1.2 员工详细信息管理员工信息添加:任何一个企业都是由各种各样的人才组成的,一个中型超市管理信息系统对员工的信息管理是必不可少的,员工信息添加模块可以方便快捷的实现员工详细信息的添加。

    界面描述:系统从数据库的Employees表中读取数据,并显示在页面上。
    员工信息修改:企业中员工信息的变化是时常发生的,这就需要对员工的信息实时的做出改变,员工信息修改模块可以快捷实时的实现员工信息的修改。

    界面描述:部门管理员输入员工编号查询表Employees中的员工,员工编号从表Employees中读取,其他可以修改的信息也从表Employees中读取,点击修改后更新此表。
    员工信息删除:企业中员工信息的变化是时常发生的,有时因为员工的离职,或者各种其它原因,员工已经离开了该企业,这就需要对员工的信息相应的改变,员工信息删除模块可以快捷实时的实现员工信息的删除。

    界面描述:部门管理员输入员工编号从表Employees中查询员工信息并显示到页面上,点击修改按钮后将Employees表中的数据删除。
    员工批量删除:企业中多个员工信息需要删除时,逐一手工删除是一件很麻烦的事情,员工批量删除正是考虑以上原因而设计的,员工批量删除模块可以快捷,大量的实现多个员工信息的删除。

    界面描述:系统从Employees表中读取数据并显示到页面上,部门管理员点击删除链接删除一条相应的信息。
    员工信息查询:一个大型企业可能有成千上万的员工,当管理人员需要找某一个特定员工时,如果逐一用人眼查询,这几乎是不可能的,员工信息查询模块可以准确的查找特定的员工。

    界面描述:部门管理员输入员工编号并点击查询按钮,系统会查询Employees表中是否有该信息。
    2.1.3 员工考勤信息管理员工考勤信息添加:一个企业为了使员工高效,积极的实现企业下达的各种任务,这就需要各种监督措施,其中员工考勤信息管理正可以实现对员工的督促和鼓励作用,其次,也可以作为各项奖励的标准,员工考勤添加模块可以实现对每一个员工各个方面的考察。

    界面描述:部门管理员输入相应的信息,点击添加按钮后将数据保存到Evaluation表中。
    员工考勤信息修改:企业中员工考勤信息的有时会因为人为主观原因造成各种错误,这就需要对员工的考勤信息快速的做出修改,员工考勤信息修改模块可以及时的实现员工考勤信息的修改。

    界面描述:部门管理员输入考勤编号查询,系统读取Evaluation表中的数据并显示到页面上,管理员修改相应的数据,点击修改后更新表中的数据。
    员工考勤信息删除:企业中员工考勤信息的删除是时常发生的,有时因为员工的离职,或者各种过期考勤信息,以及各种冗余信息等,这就需要对员工的考勤信息及时的删除,员工考勤信息删除模块可以快捷实时的实现员工考勤信息的删除。

    界面描述:系统读取Evaluation表中的数据,显示到页面上,管理员点击删除后删除表中的数据。
    员工考勤信息查询:一个大型企业可能有成千上万的员工的考勤信息,每一个员工也可能有多个不同方面的考勤信息,当管理人员或者员工个人需要找某一个特定员工考勤信息时,如果逐一查询,这可定是不可能的,也是很不合理的,员工考勤信息查询模块可以准确的查找特定员工的考勤信息,或者特定员工的某一方面的考勤信息。

    界面描述:部门管理员输入考勤编号或者用户编号,点击查询后系统将查询Evaluation表中的数据并显示到页面上。
    2.2 公司财务信息管理
    2.2.1 员工工资信息管理员工工资信息添加:作为企业的一员,当付出劳动时,企业也一定要对他们做出回报,工资管理,就是企业对员工物质奖励的最好表示,员工工资添加模块可以快速的对企业所有员工的工资做出具体详细的管理。

    界面描述:部门管理员输入相应的信息,点击添加后将数据保存到Salary表中。
    员工工资信息修改:企业中工资管理偶尔也会发生各种错误,这就需要管理人员能及时的做出修改,员工工资修改模块可以准确的修改某一个具体员工的工资信息。

    界面描述:部门管理员输入员工工资编号查询Salary表,系统将查询的数据显示到页面上,管理员修改数据后更新Salary表中的数据。
    员工工资信息删除:当企业员工离职时,或者经过一段时间后,会发现员工工资表中一些信息时无用的,员工工资删除模块可以解决这样的问题。

    界面描述:部门管理员输入员工工资编号查询Salary表,系统将查询的结果显示到页面上,管理员点击删除删除表中的相应数据。
    员工工资信息的查询:当企业管理人员要准确的知道某一个员工,某一具体时间的工资是,就会发现工资查询时很必要的,工资查询正是针对这一问题提出的。

    界面描述:部门管理员输入员工工资编号查询Salary表,系统将查询的结果显示到页面上。
    2.2.2 商品销售业绩信息管理商品销售业绩显示:商品业绩显示可以很好的反应公司的运营情况。使得决策人员可以准确的做出相应的决策。

    界面描述:系统读取Checkout表中的数据并显示到页面上。
    商品销售业绩删除:随着时间的推移有很多的商品销售信息时冗余的,这就需要管理人员对各种信息经过判断之后做出删除。商品销售业绩删除功能能尽最大可能满足管理人员的需要。

    界面描述:系统读取Checkout表中的数据并显示到页面上,管理员点击删除后系统将Checkout表中的相应数据删除。
    2.2.3 商品采购费用信息管理商品采购费用显示:当公司采购部每采购一批商品是,都要将信息及时的反应到企业财务部,使得企业财务管理人员对企业帐目有章可循。一个企业为了使员工高效,积极的实现企业下达的各种任务,这就需要各种监督措施,其中员工考勤信息管理正可以实现对员工的督促和鼓励作用,其次,也可以作为各项奖励的标准,员工考勤添加模块可以实现对每一个员工各个方面的考察。

    界面描述:系统从Purchase表中读取所有数据并显示到页面上。
    2.3 商品采购部信息管理
    2.3.1 商品类型信息管理商品类型信息添加:为了对商品做出合理的管理商品类型信息的添加是很必要的。

    界面描述:部门管理员输入相应的信息,点击提交后系统将数据保存到ProType表中。
    商品类型信息修改:根据商品编号可以查询商品详细信息,然后修改商品的所有信息。

    界面描述:系统从ProType表中读取数据并显示到页面上,部门管理员修改数据后,点击修改按钮,系统将更新表中的数据。
    商品类型信息删除:根据商品类型编号可以删除该商品的类型信息。

    界面描述:部门管理员输入商品编号并点击查询按钮,系统将从ProType表中查询相应的数据并显示到页面上,管理员点击删除后将删除ProType表中的相应数据。
    2.3.2 商品详细信息管理商品信息添加:作为超市综合管理系统,商品信息的管理是很重要的每当采购部门采购到新的商品是商品信息就要增加。超市也可能因为其它原因增加商品信息,商品添加模块都可以做出快捷的解决方案。

    界面描述:部门管理员输入相应的信息,点击添加后将数据保存到Product表中。
    商品信息删除:当企业经营策略发生改变时,商品信息也会相应的发生改变,商品信息删除模块可以使商品信息跟随经营而改变。

    界面描述:系统将Product表中所有的商品信息显示到页面上,管理员点击删除后系统删除Product表中相应的数据。
    商品信息修改:商品信息的变化是瞬间千变万化的,同一个商品随时间的不同,它的具体信息也是不同的,只有实时的调整才能适应市场的变化,商品信息修改使该变化的最佳方案。

    界面描述:部门管理员输入商品编号查询Product表中相应的商品,系统将查询结果显示到页面上,管理员修改数据后点击修改按钮,系统将数据保存到Product表中。
    商品信息查询:在成千上万种商品种,如果人为寻找某一个商品肯定是不可能的,只有通过商品信息查询模块才能为用户或管理人员解决这个难题。

    界面描述:部门管理员输入商品编号查询Product表中相应的商品,系统将查询结果显示到页面上。
    2.3.3 商品供应商厂家信息管理商品供应商厂家信息添加:“诚信“是当前企业管理的管理,以诚信建立的企业与企业之间的关系是种巨大的财富,如何保留这种财富,创造这种财富,商品供应商厂家信息可以大量的存储这种信息。

    界面描述:部门管理员输入相应的数据,点击添加后将数据保存到Supplyer表中。
    商品供应商厂家信息修改:每一个企业的信息随时间都会有或多或少的改变,商品供应商厂家信息修改可以适应这种变化。

    界面描述:部门管理员输入供应商编号查询Supplyer表中的数据并显示到页面上,修改相应的数据,点击修改后将数据保存到Supplyer表中。
    商品供应商厂家信息删除:企业倒闭或者经营策略的改变,当它对超市商品的供应没有作用时,商品供应商厂家信息的删除是正常的。

    界面描述:部门管理员输入供应商编号查询Supplyer表中的数据并显示到页面上,点击删除后系统将Supplyer表中的相应数据删除。
    商品供应商厂家信息查询:

    界面描述:部门管理员输入供应商编号,点击查询后系统将查询Supplyer表中的数据,并将结果显示到页面上。
    2.3.4 商品供应商联系人信息管理商品供应商毕竟是一种抽象的信息,只有通过商品供应商联系人这种载体,才能充分的利用,商品供应商联系人管理可以完成如下任务:
    商品供应商联系人信息添加;

    界面描述:部门管理员输入相应的信息,点击添加后将数据保存到Saler表中。
    商品供应商联系人信息修改:

    界面描述:部门管理员输入联系人编号,点击查询按钮,系统查询Saler表中的数据,并将结果显示到页面上,管理员修改相应的数据,点击更新后将数据保存到Saler表中。
    商品供应商联系人信息删除:

    界面描述:部门管理员输入联系人编号,点击查询按钮,系统查询Saler表中的数据,并将结果显示到页面上,管理员点击删除后,系统将Saler表中的相应数据删除。
    2.3.5 商品采购信息管理商品是维系超市正常运行的必要条件,商品采购是维持这一活动必不可少的条件,商品采购信息管理可以高效的实现它,包含的功能如下:
    商品采购信息添加:

    界面描述:部门管理员输入相应的数据,点击添加后将数据保存到Purchase表中。
    商品采购信息修改:

    界面描述:系统读取Purchase表中的数据并显示到页面上,管理员修改数据后点击修改按钮,系统更新Purchase表中的相应数据。
    商品采购信息删除:

    界面描述:系统从Purchase表中读取数据并显示到页面上,部门管理员点击删除后,系统将删除Purchase表中的相应数据。
    2.4 商品销售部信息管理
    商品销售信息管理:作为一个超市正是为出售商品而存在的,因此销售管理显得尤为重要,商品销售模块正是它的重要组成部分。

    界面描述:系统从Product表中读取数据并显示到页面上,点击付账后会加入到Checkout表中。
    商品购物清单管理:每次购物后,如果结帐则系统自动生成购物清单。

    界面描述:系统从商品销售信息管理页面读取数据并显示到页面上,用户点击付账后将数据保存到Checkout表中。
    2.5 用户权限及个人密码修改用户权限修改:超市综合管理信息系统中,肯定存在各种不同角色,不同的角色就应该有不同的权限,而只有超级管理员才有角色赋予权利。

    界面描述:超级管理员点击相应的部门会进入相应的修改页面,更新Users表中的数据。
    用户密码的修改:为了系统的安全,用户的应该只有用户个人才能修改,这不仅保证了整个公司的利益也保护了个人隐私。

    界面描述:管理员填写相应的数据后,点击提交后将数据保存到Users表中。
    3 接口设计3.1 用户接口包括商品基本信息管理、进货管理、销售管理等管理界面,其中商品信息管理对商品信息的增,改,删除等设置;进货管理分供应商档案管理和供应商商品管理,增、改、删除供应商及其商品信息;销售管理提供销售时对商品的信息显示及修改。
    3.2 外部接口应用系统通过ODBC和数据库沟通。

    3.3 内部接口该系统适合windows操作系统,没有和其他软件的接口。
    4 运行设计4.1 运行模块组合 商品信息管理模块用来管理商品的一些基本信息,是本系统中数据管理的基本对象。管理超市的全部商品信息。销售管理模块提供销售时商品信息的确认与更新,是本系统的主要模块。销售模块提取数据库里商品的基本信息然后在销售成功时修改货架上商品的数量,当商品货架上的数量低于一定程度是,系统提示管理员,从仓库提取商品补充货架。仓库管理系统负责管理仓库的货物信息,管理人员通过仓库管理模块将仓库的商品转移到货架上。当仓库的货物数量下降时,管理人员通过进货管理联系供应商以采集相应商品。为了用户方便快捷的使用本系统,可以参考系统说明模块。

    商品信息的收集与修改功能: 商品信息管理模块,仓库管理模块商品数量更新功能: 销售管理模块,仓库管理模块查询,打印功能: 商品信息管理模块,销售管理模块,仓库管理模块
    5 系统数据结构设计5.1 逻辑结构设计要点主要逻辑结构如下:
    1.员工信息表

    包括的必填数据项:员工编号,员工姓名,员工性别;可选填数据项:员工籍贯,出生年月,学历,是否结婚,身份证号码,员工电话,员工地址,员工描述;说明:员工编号是唯一的员工标识,使此表的主键. 系统通过添加员工可以使用户登陆到系统相应的管理模块。如图5-1所示。

    2.商品类别表

    商品类别号、商品类别名称。说明:商品类别编号为主键 如图5-2所示。

    3.商品信息表

    商品编号、商品类别号、商品名称、商品单位、商品当前价格、商品进货价格、商品数量、商品描述。编号方法:商品的编号采用位数分类的方法,如图5-3所示。

    4.商品采购信息表

    商品采购信息编号、商品编号、商品名称、采购人员编号、供应商联系人编号、采购数量、采购时单位商品价格、采购时间、采购地点、采购描述、采购日期。说明:这张表标识的是商品采购信息的信息情况的外部信息,采购信息编号为该表的主键。如图5-4所示。

    5.商品销售信息

    商品编号、商品名称、商品单位、商品库存数量、商品当前价格。说明:这张表标识的是商品销售的内部信息列表,商品编号是该表的主键,它与商品信息一一对应。编号方法:商品编号采用自动生成方式。如图5-5所示。

    6.员工部门信息

    部门编号、部门名称。说明:这张表标识的是超市管理信息系统员工部门的信息列表,部门编号是该表的主键。编号方法:部门编号采用自动生成方式。如图5-6所示。

    7.员工考勤信息

    员工考勤编号、员工编号、考勤时间、考勤主题、考勤结果、考勤分数、考勤描述。说明:这张表标识的是超市管理信息系统员工考勤的信息列表,员工考勤编号是该表的主键。编号方法:员工考勤编号采用自动生成方式,员工编号与人事管理系统中员工编号一一对应。如图5-7所示。

    8.员工工资信息

    员工工资编号、员工编号、员工基本工资、员工季度奖金、员工年度奖金、员工鼓励奖金、员工发工资时间。说明:这张表标识的是超市管理信息系统员工工资的信息列表,员工工资编号是该表的主键。编号方法:员工工资编号采用自动生成方式,员工编号与人事管理系统中员工编号一一对应。如图5-8所示。

    9.商品供应商信息

    供应商编号、供应商名称、供应商地址、供应商邮编、供应商生产产品的名称。说明:这张表标识的是超市管理信息系统中商品采购模块中商品供应商的信息列表,供应商编号是该表的主键。编号方法:商品供应商编号采用自动生成方式。如图5-9所示。

    10.商品供应商联系人信息

    供应商联系人编号、联系人姓名、联系人性别、联系人职位、联系人公司名称、联系人爱好、联系人电话、联系人描述、联系人公司编号。说明:这张表标识的是超市管理信息系统中商品采购模块中商品供应商联系人的信息列表,供应商联系人编号是该表的主键。编号方法:商品供应商联系人编号采用自动生成方式。如图5-10所示。

    11.系统登陆用户信息

    用户编号、用户姓名、用户密码、用户登陆身份。说明:这张表标识的是超市管理信息系统中登陆到系统的用户的信息列表,用户编号是该表的主键,其中用户编号与员工信息表中的用户编号是一一对应的。如图5-11所示。

    6 经验与教训中小型超市综合管理信息系统的开发是在Window7平台上,以JSP+JavaBean为前台,采用SQL Server 2008作为数据库管理系统管理后台数据库。本系统是超市信息管理建设中必不可少的一部分,它实现了现代管理信息系统的大部分功能需要。使用本系统可以使企业管理更加方便快捷,合理的页面设计也使得这个企业用户充分享受到未来基于Internet管理信息系统的优越。本系统开发说明:

    功能完备
    在开发初期,查看了大量关于电子商务,管理信息系统,J2EE等方面的资料,同时借鉴了很多其他电子商务网站和管理信息的流程。经过总结,确定了满足需求分析的基本模块。系统总体设计上实现了整个系统模块的划分,系统主要包含5大模块,分别是:人事管理信息,企业财务管理,商品采购管理,商品销售管理,个人信息咨询,基本上实现了综合管理系统的所有功能。 
    界面友好
    系统用户登陆到管理页面后,每页有导航和引领的作用。系统根据用户角色的不同,直接进入不同的管理页面,同时导航条方便快捷的引导用户进行各种合理的操作。
    管理科学
    本系统一开始就从管理学的角度做出了详细细致的考虑,后来有参考了ERP,现代电子商务管理等,最后才做出了系统总体设计,同时在设计中也遵循现代企业管理的理念,因此可以讲该系统是较为科学的。

    这一次团队开发综合管理信息系统,从开始选择课题的困惑到最终完成了一个我们还算满意的作品,我们学到了很多很多东西。需求分析—>系统架构设计—>总体模块设计—>详细模块设计—>编码—>调试测试,按照这个步骤一步一步走过来,我们的进度可以说是相对比较慢的。后台管理部分就是在后期制作完成的。近1个月的不断磨练,我们最大的收获除了学到了真正可以应用的知识外,更重要的是激发了我们对Java和JSP的强烈兴趣。
    4 评论 62 下载 2018-10-04 21:03:49 下载需要14点积分
  • 基于JSP的校园论坛BBS网站的设计与实现

    1 概述开发校园论坛系统的目的是提供一个供我校学生交流的平台,为我校学生提供交流经验、探讨问题的社区。因此, 校园论坛系统最基本的功能首先是发表主题,其次是其他人员根据主题发表自己的看法。此外,为了记录主题的发表者和主题的回复者信息,系统还需要提供用户注册和登录的功能。只有注册的用户登录后才能够发表和回复主题,浏览者(游客)只能浏览主题信息。根据用户的需求及以上的分析,校园论坛需要具备前台功能和后台功能。
    1.1 系统概述
    网站名称
    校园论坛
    网站功能实现
    为用户提供一个注册、发帖、回复、浏览等交流操作功能。
    用户
    在校学生
    子系统关系图


    1.2 系统目标为了方便校内同学的交流,我们决定要做这么一个校园论坛,而对于论坛这样的数据流量特别大的网络管理系统,必须要满足使用方便、操作灵活等设计需求。所以本系统在设计时应满足以下几个目标:

    临时用户进入,可浏览帖子但不可发帖一个版面能显示所有的帖子具有登录模块,有用户的个人信息用户随时都可以查看自己发表的帖子有用户的消息的时间及时提醒,主要用于提示哪个用户 回复了自己的主题管理员权限可删除任意帖子,具有最大权限的管理功能对用户输入的数据,系统进行严格的数据检验,尽可能 排除人为的错误系统最大限度地实现了易维护性和易操作性系统运行稳定安全可靠
    1.3 文档概述需求分析报告采用面向对象的方法,在文档中主要采用了用例、流程图等表示方法来描述需求。
    1.4 需求概述1.4.1 用户需求对于一个用户,使用论坛进行交流时,首先要注册一个 账户,然后登录后才能进行对帖子的回复,如果不登录,就 只能查看帖子而不能进行回复和发表帖子。用户使用论坛系 统的需求是发表某一个主题相关的帖子,用户在发表帖子后, 如果有人进行回复,就要在首页提醒用户有新消息。用户可以删除自己发表的帖子和评论。对于论坛管理人员来说,需要完成对用户发表的帖子的管理,包括:设置精华帖、置顶 帖子、删除帖子等操作。
    开发校园论坛系统的目的是提供一个供我校学生交流的平台,为我校学生提供交流经验、探讨问题的社区。因此, 校园论坛系统最基本的功能首先是发表主题,其次是其他人员根据主题发表自己的看法。此外,为了记录主题的发表者和主题的回复者信息,系统还需要提供用户注册和登录的功能。只有注册的用户登录后才能够发表和回复主题,浏览者(游客)只能浏览主题信息。根据用户的需求及以上的分析, 校园论坛需要具备前台功能和后台功能。

    系统前台功能:显示用户发表的帖子,查看帖子的内容、发表对帖子的回复、发表对回复的回复、显示用户的头像、用户信息的显示、用户新信息的提醒。系统后台功能:进入后台、帖子管理、用户管理、添加删除用户、系统设置、退出系统、返回首页。
    1.4.2 系统开发环境需求1.4.2.1 开发环境我们一致认为在开发此论坛的时候需要配置以下软件环境:
    服务器端:

    操作系统:Windows 7及以上Web服务器:Tomcat 7.0 集成开发环境:Eclipse 数据库:MySQL
    客户端:

    无特别要求
    1.4.2.2 使用技术
    前端:HTML、CSS、JS、BootStrap后端:Java数据库:MySQL
    1.4.2.3 用户的特点
    本网站的最终用户的特点:所有上网用户在无需培训的情况下,按照网站页面提示即可使用网站的相关服务和功能后台管理和维护人员的教育水平和技术专长:本软件的后台管理和维护人员均为我小组开发成员
    1.5 功能需求经过系统性的研究,我们认为整个论坛大概分为 3 个功能模块,分别为:论坛模块、管理员模块和用户模块。
    1.5.1 前台功能需求在论坛前台中,我们作了如下设计:分未登录前和登录后,登录前,用户进入校园论坛的主页面后,可以查看帖子内容、用户注册、用户登录,登录后,用户可以修改个人信息、查看个新消息、修改头像、查看帖子内容、回复帖子。
    1.5.2 后台功能需求管理用户进入后台后,可以进行帖子管理,包括查看帖子、删除帖子、返回论坛首页和退出系统。
    1.5.3 系统前台流程图 在系统前台流程中,我们做出了如下设置。首先,我们开始点开界面,是我们的论坛主页,不登录可以以临时用户身份浏览,登陆则可以发帖和评论,没有账号的可以注册。

    1.5.4 系统后台流程图在系统的后台流程中,我们做出了如下设置。首先,我们进入登录界面,使用管理员账号和密码进行登录,在管理员界面,我们可以进行用户信息管理,可以查看、删除用户帖子

    1.6 系统用例图
    1.7 系统时序图论坛管理员处理帖子的时序图

    用户发帖评论时序图

    1.8 系统组件图
    1.9 系统E-R图
    1.10 系统配置图
    2 操作指引2.1 项目简介校园论坛所具有的功能包括:用户注册、用户登录、用户信息修改、浏览帖子、发表帖子、收藏帖子、搜索帖子、回复帖子、用户信息管理(查询、增加、删除、修改)。
    从整体上可以分为数据层、数据访问层和业务逻辑层。数据层是系统最底层,它用于存储系统的所有数据。数据访问层建立在数据库之上,应用程序通过该层访问数据库。数据访问层一般封装数据库的选择、添加、更新和删除操作,同时还为业务逻辑层服务,所以数据访问层的设计的好坏关系到整个系统的成败。业务逻辑层包括用户登录、用户注册、 发表帖子等业务逻辑,它一般由Web页面实现。
    系统操作结构

    页面操作结构

    2.2 操作介绍在登录注册界面可以通过登录和注册按钮进行登录和注册操作


    登录完就会进入主界面,在主界面上方有“个人信息”,“我的帖子”、“用户管理”等按钮可以进行相应的操作。界面中间是其他用户发的帖子,可以点击进行浏览和恢复等操作。界面的最下方是发帖模块,只用登录用户才可以进行发 帖操作,游客只有浏览帖子的权限。

    点击个人信息按钮进入个人信息界面可以修改个人的详细信息。

    点击我的帖子进入我的帖子界面可以对自己发的帖子进行删除和查看操作。

    在首页点击其他用户的帖子可以进入帖子的完整内容进行浏览,还可以在最下方的回复模块进行回复。

    如果你是以管理员的身份登录,你还可以进入用户管理模块,进行删除帖子的操作。

    3 业务说明3.1 业务简介本软件系统旨在通过网络论坛,让在校大学生快速地进行交流更为便捷。使得大学生的交流环境和校方教育及管理人员获得广大学生声音更加方便也更为人性化。校园论坛是面向各大高校师生的一个信息交流平台,建立一个基于师生沟通为目的,功能简洁,方便实用和管理的论坛系统显得越来越必要。为达成这一目标,并将大学学习期间所学的数据库设计与实现、网页设计、面向对象程序设计、Web 应用开发等知识综合运用,融会贯通,特开发此项目。
    3.2 业务场景


    触发事件
    用户注册




    执行者
    用户


    工作内容
    1.进行用户的信息注册






    触发事件
    用户登录




    执行者
    用户


    工作内容
    1.用户使用已注册的账号和密码进行登录






    触发事件
    查看已发布的帖子




    执行者
    用户/游客


    工作内容
    1. 对已发布的帖子进行查看






    触发事件
    发帖




    执行者
    用户


    工作内容
    1.用户进行帖子发布






    触发事件
    回帖




    执行者
    用户


    工作内容
    1.用户对已发布的帖子内容进行回复






    触发事件
    论坛出现违规帖子




    执行者
    网站管理员


    工作内容
    1.对违规帖子进行查看,评估 2.对存在违规现象的帖子进行删除,当情况严重时还需要对违规用户进行禁言或封号处理



    4 数据库数据流图,简称 DFD,是 SA 方法中用于表示系统逻辑模型的一种工具,它以图形的方式描绘数据在系统中流动和处理的过程,由于它只反映系统必须完成的逻辑功能,所以它 是一种功能模型。
    4.1 顶层数据流图
    4.2 0 层数据流图
    4.3 具体数据流图4.3.1 登录系统
    4.3.2 注册系统
    4.3.3 发表主题
    4.3.4 回复主题
    4.3.5 论坛管理
    4.4 数据字典4.4.1 数据流




    4.4.2 数据项




    4.5 E-R图E-R 图即实体-联系图(Entity Relationship Diagram),是指提供了表示实体型、属性和联系的方法,用来描述现实世界的概念模型 。 E-R方法是 “实体-联系方法 ”(Entity-Relationship Approach)的简称,它是描述现实世界概念结构模型的有效方法。

    4.6 数据库设计4.6.1 数据库分析数据库的设计,在程序的开发中起着至关重要的作用,它往往决定了在后面的开发中进行怎样的程序编码。一个合理、有限的数据库设计可降低程序的复杂性,使程序开发的过程更为容易。
    本系统是一个中型的用户交流的网站,考虑到用户访问量以及网络连接,本系统采用MySQL 作为数据库。
    MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL 的 SQL 语言是用于访问数据库的最常用标准化语言。
    4.6.2 数据库的逻辑设计根据系统需求,我们就可以创建系统所需要的数据库表了。本系统包含 3 个表,下面是这些表的结构。
    user_info 表结构如表所示:



    字段名
    数据类型
    字段长度
    是否主键
    是否为空
    备注




    user_id
    int
    15


    用户 id


    user_name
    varchar
    50


    用户名


    user_password
    varchar
    50


    密码


    user_sex
    varchar
    2


    性别


    user_face
    varchar
    255


    头像


    user_phone
    varchar
    255


    联系电话


    user_email
    varchar
    200


    电子邮箱


    user_from
    varchar
    200


    来自何处


    isAdmin
    int
    2


    是否为管理员



    forum_info 表结构如表所示:



    字段名
    数据类型
    字段长度
    是否主键
    是否为空
    备注




    Fid
    int
    10


    发帖 id


    Title
    varchar
    255


    帖子标题


    content
    varchar
    255


    帖子内容


    create_time
    datetime



    发帖时间


    user_id
    int
    11


    用户 id



    reply_info 表结构如表所示:



    字段名
    数据类型
    字段长度
    是否主键
    是否为空
    备注




    reply_id
    int
    10


    回帖 id


    reply_content
    varchar
    255


    回帖内容


    reply_time
    datetime



    回帖时间


    user_id
    int
    11


    用户 id


    fid
    int
    11


    发帖 id



    4.6.3 SQL 语句设计(建表语句 )用户信息表(user_info)
    CREATE TABLE `user_info` ( `user_id` int(15) NOT NULL, `user_name` varchar(50) NOT NULL, `user_password` varchar(50) NOT NULL, `user_sex` varchar(2) NOT NULL, `user_face` varchar(255) NOT NULL, `user_phone` varchar(255) NOT NULL, `user_email` varchar(200) NOT NULL, `user_from` varchar(200) NOT NULL, `isAdmin` int(2) DEFAULT NULL, PRIMARY KEY (`user_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8
    主题信息表(forum_info)
    CREATE TABLE `forum_info` ( `fid` int(10) NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `content` varchar(255) NOT NULL, `create_time` datetime NOT NULL, `user_id` int(11) NOT NULL, PRIMARY KEY (`fid`)) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=utf8
    回帖信息表(reply_info)
    CREATE TABLE `reply_info` ( `reply_id` int(10) NOT NULL AUTO_INCREMENT, `reply_content` varchar(255) NOT NULL, `reply_time` datetime NOT NULL, `user_id` int(11) NOT NULL, `fid` int(11) NOT NULL, PRIMARY KEY (`reply_id`)) ENGINE=InnoDB AUTO_INCREMENT=52 DEFAULT CHARSET=utf8
    4.7 MD5 算法加密实现代码
    public class MD5 { public static String generateCode(String str) throws Exception{ MessageDigest md5=MessageDigest.getInstance("MD5"); byte[] srcBytes=str.getBytes(); md5.update(srcBytes); byte[] resultBytes=md5.digest(); String result=new String(resultBytes); return result; }}
    实现结果

    5 系统测试
    测试环境
    操作系统:windows10
    浏览器:Google Chrome

    5.1 测试内容


    用户注册
    输入学号、密码及个人信息,并且通过验证码认证后,完成注册





    用户登录
    输入学号及密码完成登录



    浏览帖子
    不论是否登录,都可以正常浏览已有的帖子



    发帖
    只有登录后,方可发帖



    回复
    只有登录后,方可回复



    个人信息
    查看个人信息(头像、学号、姓名、性别 联系电话、电子邮箱、来自哪里)



    修改个人信息
    对个人信息(头像、学号、姓名、性别、联系电话、电子邮箱、来自哪里)进行修改



    退出登录
    退出已登录状态




    5.2 功能截图校园论坛主页

    在校园论坛主页,可作为游客身份浏览帖子,但只有注册、 登录之后,方可回复跟帖。主页提供直观的注册、登录按钮。
    用户注册

    输入学号、用户名、密码,以及其它个人信息之后,即可完成注册。并且为了网站安全,用户需要通过验证码验证。
    用户登录
    输入学号、密码即可完成登录。

    若勾选“记住密码”,会自动填充学号及密码,方便用户快捷登录校园论坛。
    查看帖子

    登录之后,进入“查看帖子”页面,可浏览已发布的帖子。右上角提供“个人信息”、“ 我的帖子”、“退出论坛”三个按钮。
    发帖

    “查看帖子”页面底部,输入标题及内容,点击”发表”,即可发布自己的帖子。
    阅读、回复帖子

    点击帖子的标题,即可阅读帖子详情,可以回复跟帖。
    个人信息

    点击右上角的“个人信息”按钮,即可查看个人信息,包 括头像、学号、姓名、性别、联系电话、电子邮箱,及来自哪里。
    修改个人信息

    “个人信息”页面,点击“修改资料”按钮,即可进入“修改个人信息”页面。可对个人信息进行修改。
    退出登录

    点击右上角的“退出论坛”按钮,即退出登录状态,回到论坛主页。
    12 评论 395 下载 2018-10-05 22:38:31 下载需要16点积分
  • 基于Java实现的商品推荐系统

    一、介绍商品推荐是针对用户面对海量的商品信息而不知从何下手的一种解决方案,它可以根据用户的喜好,年龄,点击量,购买量以及各种购买行为来为用户推荐合适的商品。在本项目中采用的是基于用户的协同过滤的推荐算法来实现商品的推荐并在前台页面进行展示,我将会使用余弦相似度的度量方法来计算用户与用户之间相似性,最终将相似度较高的用户浏览的商品推荐给用户。
    二、目标
    商品推荐:根据不同用户之间的相似性来推荐给用户合适的商品
    一级类目管理:管理一级类目的相关功能
    二级类目管理:管理二级类目的相关功能
    商品管理:对商品进行上架,下架,修改信息
    管理员管理:管理管理员,用于商城后台的管理平台页面
    商城会员管理:管理商城会员,对商城页面的会员进行管理
    商城会员登录及注册:实现商城用户的登录功能以及注册功能

    三、采用的技术3.1 开发环境
    操作系统:Windows8.1
    IDE:eclipse
    Java版本:1.8
    数据库:mysql5.6.36
    服务器:tomcat8
    项目的构建工具:Maven

    3.2 后台框架
    spring-4.2.1:轻量级的IOC和AOP的容器框架
    springMVC-4.2.1表示层框架,负责匹配请求,处理请求,返回视图mybatis-3.3.1建立与数据库的会话druid-1.1.16为监控而生的数据库连接池

    四、推荐流程
    五、界面
    六、阶段性成果6.1 用户相似度计算功能以下为通过余弦相似度公式计算得出的用户与用户之间的相似度:
    具体的代码实现见 shopping/recommendate/util/RecommendUtils.java。
    1 2 0.9994891442833921 3 0.9510094685910491 4 0.61016991946945632 3 0.95149554552980992 4 0.61048178758052683 4 0.64080979076955366.2 余弦相似度的原理在三角形中,cos30°=二分之根三,cos60°=1/2。很明显,cos30°相比于cos60°更接近于 1,可以看出角度越接近于 0°,对应的余弦值越接近于 1,构成这个角度的两条边也就越接近于重合,也就可以认为这两条边越相似。
    在二维的平面向量中,两个向量之间夹角的余弦值公式为:

    假设两个向量a,b的坐标分别为(x1,y1)、(x2,y2),所以最终可以化简为:

    注:其中的x和y是两个不同的维度,在向量直角坐标系中可以认为是距x和y轴的距离,但是在实际的应用中,可以是把它理解为一个物体的任何一个可以衡量它与其他物体不同之处的属性…咳咳,还是说人话吧,在商品推荐中可以把向量 a 和向量 b 理解为两个不同的用户,把 (x1,y1) 理解为 a 用户对 x 商品的点击次数和对 y 商品的点击次数,再把对应的值带入上述公式即可求出两个用户之间的相似性,越接近于 1 ,说明两个用户的浏览行为越相似,就可以把一个用户浏览过的商品推荐给另一个没有浏览过该商品的用户,从而完成商品推荐。
    设向量 A = (A1,A2,A3,…,An), B = (B1,B2,B3,…,Bn),推广到多维,公式为:

    其中的 A1,A2,A3…就可以理解为该用户对不同的商品的点击量。
    6.3 计算出要推荐给用户的二级类目通过上一阶段对用户相似度之间的求解,可以获得与某个用户最相似的前N个用户,(假设需要被推荐商品的用户为X)然后在这N个用户的浏览记录中查找X没有浏览的类目,但是这N个用户浏览的二级类目的类目的id,作为推荐给用户的二级类目id。
    具体的代码实现见 shopping/recommendate/util/RecommendUtils.java。

    对用户的商品推荐在上一个阶段确定了要推荐给用户的二级类目之后,找出每个类目下点击量最高的商品推荐给用户。
    直观感受一下:
    1 评论 9 下载 2020-11-16 12:09:05 下载需要6点积分
  • 基于python的网易云音乐分析


    MacOS Sierra 10.12.1
    Python 2.7
    selenium 3.4.3
    phantomjs

    前言
    发现自己有时候比挖掘别人来的更加有意义,自己到底喜欢谁的歌,自己真的知道么?习惯不会骗你

    搭建爬虫环境1.安装seleniumpip install selenium# anaconda环境的可用conda install selenium# 网速不好的可用到https://pypi.python.org/pypi/selenium下载压缩包,解压后使用python setup.py install
    2.安装Phantomjs2.1 Mac版本步骤一下载包:去这里下载对应版本http://phantomjs.org/download.html步骤二解压:双击就行,用unzip这都无所谓步骤三切入路径:cd ~/Downloads/phantomjs-2.1.1-macosx/bin # 我下的路径的路径是download,版本不一,注意修改步骤四:chmod +x phantomjs步骤五: 配置环境,因为我装的的zsh,所以文件需要修改的是~/.zshrc这个文件,加上这句话export PATH="/Users/mrlevo/Downloads/phantomjs-2.1.1-macosx/bin/:$PATH",然后source ~/.zshrc 即可生效(没用zsh的同学,直接修改的文件时~/.bash_profile,添加内容和上述一致)查看是否生效:phantomjs -v # 有信息如 2.1.1 则生效mac若遇到问题请参考PhantomJS 安装
    2.2 Win版本官网http://phantomjs.org/下载PhantomJS解压后如下图所示:

    调用时可能会报错“Unable to start phantomjs with ghostdriver”如图:



    此时可以设置下Phantomjs的路径,同时如果你配置了Scripts目录环境变量,可以解压Phantomjs到该文件夹下。可参考Selenium with GhostDriver in Python on Windows - stackoverflow,整个win安装过程可参考在Windows下安装PIP+Phantomjs+Selenium],Mac和Linux/Ubuntu 下可参考[解决:Ubuntu(MacOS)+phantomjs+python的部署问题

    3. 测试安装是否成功# 进入python环境后执行如下操作# win下操作>>> from selenium import webdriver # pip install selenium>>> driver_detail = webdriver.PhantomJS(executable_path="F:\Python\phantomjs-1.9.1-windows\phantomjs.exe")>>> driver_detail.get('https://www.baidu.com')>>> news = driver_detail.find_element_by_xpath("//div[@id='u1']/a")>>> print news.text新闻>>> driver_detail.quit() # 记得关闭,不然耗费内存------------------------------------------------------------------------# mac下操作>>> from selenium import webdriver # pip install selenium>>> driver_detail = webdriver.PhantomJS()>>> driver_detail.get('https://www.baidu.com')>>> news = driver_detail.find_element_by_xpath("//div[@id='u1']/a")>>> print news.text新闻>>> driver_detail.quit() # 记得关闭,不然耗费内存爬取动态数据
    获取自己的id号,这个可以自己登陆自己的网易云音乐后获得,就是id=后面那个值



    构造爬取的id,因为我发现,每个人的id只要被获取到,他的歌单都是公开的!!!这就节省了自动登录的一步,而且,我还有个大胆的想法,哈哈哈,我还要搞个大新闻!这次先不说~

    墙裂推荐先阅读该博客掌握获取元素方法:Python爬虫 Selenium实现自动登录163邮箱和Locating Elements介绍
    # -*- coding: utf-8 -*-import tracebackfrom selenium import webdriverimport selenium.webdriver.support.ui as uifrom selenium.webdriver.common.desired_capabilities import DesiredCapabilitiesimport timeimport random# 存储为文本的子函数def write2txt(data,path): f = open(path,"a") f.write(data) f.write("\n") f.close()# 获取该id喜欢音乐的列表def catchSongs(url_id,url): user = url_id.split('=')[-1].strip() print 'excute user:',user driver = webdriver.PhantomJS()#,executable_path='/Users/mrlevo/phantomjs-2.1.1-macosx/bin/phantomjs') # 注意填上路径 driver.get(url) driver.switch_to_frame('g_iframe') # 网易云的音乐元素都放在框架内!!!!先切换框架 try: wait = ui.WebDriverWait(driver,15) wait.until(lambda driver: driver.find_element_by_xpath('//*[@class="j-flag"]/table/tbody')) # 等待元素渲染出来 try: song_key = 1 wrong_time = 0 while wrong_time < 5: # 不断获取歌信息,假定5次获取不到值,就判无值可获取,跳出循环 try: songs = driver.find_elements_by_xpath('//*[@class="j-flag"]/table/tbody/tr[%s]'%song_key) info_ = songs[0].text.strip().split("\n") if len(info_) == 5: info_.insert(2,'None') # 没有MV选项的进行插入None new_line = '%s|'%user+'|'.join(info_) song_key +=1 #new_line = "%s|%s|%s|%s|%s|%s|%s"%(user,info_[0],info_[1],info_[2],info_[3],info_[4],info_[5]) print new_line write2txt(new_line.encode('utf-8'),user) # mac写入文件需要改变字符,以id命名的文件,存储在执行脚本的当前路径下,在win下请去掉编.endcode('utf-8') except Exception as ex: wrong_time +=1 # print ex except Exception as ex: pass except Exception as ex: traceback.print_exc() finally: driver.quit()# 获取id所喜爱的音乐的urldef catchPlaylist(url): driver = webdriver.PhantomJS()#,executable_path='/Users/mrlevo/phantomjs-2.1.1-macosx/bin/phantomjs') # 注意填上路径 driver.get(url) driver.switch_to_frame('g_iframe') # 网易云的音乐元素都放在框架内!!!!先切换框架 try: wait = ui.WebDriverWait(driver,15) wait.until(lambda driver: driver.find_element_by_xpath('//*[@class="m-cvrlst f-cb"]/li[1]/div/a')) # 根据xpath获取元素 urls = driver.find_elements_by_xpath('//*[@class="m-cvrlst f-cb"]/li[1]/div/a') favourite_url = urls[0].get_attribute("href") except Exception as ex: traceback.print_exc() finally: driver.quit() # print favourite_url return favourite_urlif __name__ == '__main__': for url in ['http://music.163.com/user/home?id=67259702']: # 这里把自己的id替换掉,想爬谁的歌单都可以,只要你有他的id time.sleep(random.randint(2, 4)) # 随机休眠时间2~4秒 url_playlist = catchPlaylist(url) time.sleep(random.randint(1, 2)) catchSongs(url,url_playlist)

    不出意外的话,你的执行脚本的目录下会产生一个以你的id命名的文件,里面打开应该是这样的

    67259702|2|因为了解|None|04:08|汪苏泷|慢慢懂67259702|3|潮鳴り|None|02:37|折戸伸治|CLANNAD ORIGINAL SOUNDTRACK67259702|4|每个人都会|None|02:58|方大同|橙月 Orange Moon67259702|5|Don't Cry (Original)|MV|04:44|Guns N' Roses|Greatest Hits67259702|6|妖孽(Cover:蒋蒋)|None|02:58|醉影An|醉声梦影67259702|7|好好说再见(Cover 陶喆 / 关诗敏)|None|04:06|锦零/疯疯|zero67259702|8|好好说再见(cover陶喆)|None|03:34|AllenRock|WarmCovers ·早# 这边分别爬取的数据结构是: id|歌次序|歌名|是否有MV|时长|歌手|专辑
    Show数据-ROUND1
    接下来就是处理自己下好的自己的歌单了,为了方便起见,我在构造爬取代码的时候,已经构造的比较好了,这也就帮助大家减少了数据预处理的时间了,一般来说,数据不会那么干净的。

    我只是做了最简单的歌手词云的例子,数据比较丰富的情况下,自己处理吧,想做什么统计都可以,或许以后我会补上可视化相关的一些例子
    1. 自定义遮罩层版本# -*- coding: utf-8 -*-# 如果还不清楚词云怎么搞,请参考这里https://mp.weixin.qq.com/s/0Bw8QUo1YfWZR_Boeaxu_Q,或者自行百度,很简单的一个包import numpy as npimport PIL.Image as Imagefrom wordcloud import WordCloud, ImageColorGeneratorimport matplotlib.pyplot as plt# 统计词频# win的用户,把解码去掉即可,因为当时mac写入的文件有编码,所以读出来需要解码def statistics(lst): dic = {} for k in lst: if not k.decode('utf-8') in dic:dic[k.decode('utf-8')] = 0 dic[k.decode('utf-8')] +=1 return dic path = '67259702' # 自己路径自己搞定list_ = []with open(path,'r') as f: for line in f: list_.append(line.strip().split('|')[-2].strip())dict_ = statistics(list_)# the font from github: https://github.com/adobe-fontsfont = r'SimHei.ttf'coloring = np.array(Image.open("screenshot.png")) # 遮罩层自己定义,可选自己的图片wc = WordCloud(background_color="white", collocations=False, font_path=font, width=1400, height=1400, margin=2, mask=np.array(Image.open("screenshot.png"))).generate_from_frequencies(dict_)# 这里采用了generate_from_frequencies(dict_)的方法,里面传入的值是{‘歌手1’:5,‘歌手2’:8,},分别是歌手及出现次数,其实和jieba分词# 之后使用generate(text)是一个效果,只是这里的text已经被jieba封装成字典了image_colors = ImageColorGenerator(np.array(Image.open("screenshot.png")))plt.imshow(wc.recolor(color_func=image_colors))plt.imshow(wc)plt.axis("off")plt.show()wc.to_file('mymusic2.png') # 把词云保存下来

    2. 方块版本# -*- coding: utf-8 -*-# 稍微修改下参数,就是另一幅图,这是没有遮罩层的import numpy as npimport PIL.Image as Imagefrom wordcloud import WordCloud, ImageColorGeneratorimport matplotlib.pyplot as plt# 统计词频def statistics(lst): dic = {} for k in lst: if not k.decode('utf-8') in dic:dic[k.decode('utf-8')] = 0 dic[k.decode('utf-8')] +=1 return dic path = '67259702' # 自己路径自己搞定list_ = []with open(path,'r') as f: for line in f: list_.append(line.strip().split('|')[-2].strip())dict_ = statistics(list_)# the font from github: https://github.com/adobe-fontsfont = r'SimHei.ttf'coloring = np.array(Image.open("screenshot.png"))wc = WordCloud( collocations=False, font_path=font, width=1400, height=1400, margin=2, ).generate_from_frequencies(dict_)# 这里采用了generate_from_frequencies(dict_)的方法,里面传入的值是{‘歌手1’:5,‘歌手2’:8,},分别是歌手及出现次数,其实和jieba分词# 之后使用generate(text)是一个效果,只是这里的text已经被jieba封装成字典了image_colors = ImageColorGenerator(np.array(Image.open("screenshot.png")))plt.imshow(wc)plt.axis("off")plt.show()wc.to_file('mymusic2.png') # 把词云保存下来

    SHOW数据-ROUND2
    刚看到个好玩的,迫不及待的试了下,这是关于语种翻译的API接口,阿里云买的,0.01=1000条,买买买,买来玩玩试试自己歌曲语种

    # -*- coding:utf-8 -*-# 调用的阿里云的API接口实现语种翻译# API官网:https://market.aliyun.com/products/57124001/cmapi010395.html?spm=5176.730005.0.0.UrR9bO#sku=yuncode439500000import urllib, urllib2, sysimport ssldef Lang2Country(text): host = 'https://dm-12.data.aliyun.com' path = '/rest/160601/mt/detect.json' method = 'POST' appcode = 'xxxxx' # 购买后提供的appcode码 querys = '' bodys = {} url = host + path bodys['q'] = text post_data = urllib.urlencode(bodys) request = urllib2.Request(url, post_data) request.add_header('Authorization', 'APPCODE ' + appcode) # 根据API的要求,定义相对应的Content-Type request.add_header('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8') ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE response = urllib2.urlopen(request, context=ctx) content = response.read() if (content): # print(content) return content else: return None# 67259702|1|Claux - 水之畔(8lope Remix) (feat. 陶心瑶)|None|02:44|8lope|水之畔(feat. 陶心瑶) (8lope Remix)list_songs = []list_songwithsinger = []with open('67259702') as f: # 文件名写上次爬下来的 for line in f: line_split = line.split('|') list_songs.append(line_split[2]) list_songwithsinger.append(line_split[2]+line_split[5])# 调用接口进行语种识别dict_lang = {}for i in range(537): try: content = Lang2Country(list_songwithsinger[i]) lag_ = json.loads(content)['data']['language'] if lag_ not in dict_lang: dict_lang[lag_]=0 dict_lang[lag_] +=1 except: passprint dict_lang # {u'ru': 1, u'fr': 9, u'en': 111, u'zh': 259, u'pt': 21, u'ko': 8, u'de': 7, u'tr': 15, u'it': 47, u'id': 2, u'pl': 7, u'th': 1, u'nl': 10, u'ja': 17, u'es': 20}

    ok,数据准备好了,接下来可视化就好了!这次我用Echarts,换个口味的就不用云词了,来个统计效果好看点的!


    # 进入该网页:http://echarts.baidu.com/demo.html#pie-simple# 然后把里面的内容替换掉就行option = { title : { text: '哈士奇说喵喜欢的音乐', x:'center' }, tooltip : { trigger: 'item', formatter:'{b} : {c} ({d}%)' }, legend: { orient: 'vertical', left: 'left', data:['中文','英文','俄语','法语','葡萄牙语','韩语','德语','土耳其语','意大利语'] }, series : [ { name: '访问来源', type: 'pie', radius : '55%', center: ['50%', '60%'], itemStyle: { normal: {label:{ show:true, formatter:'{b} : {c} ({d}%)' }, }}, data:[ {value:259, name:'中文'}, {value:111,name:'英文'}, {value:1, name:'俄语'}, {value:9, name:'法语'}, {value:21, name:'葡萄牙语'}, {value:8, name:'韩语'}, {value:7, name:'德语'}, {value:15, name:'土耳其语'}, {value:47, name:'意大利语'}, {value:2, name:'印尼语'}, {value:7, name:'波兰语'}, {value:1, name:'泰语'}, {value:10, name:'荷兰语'}, {value:17, name:'日语'}, {value:20, name:'西班牙语'}, ], } ]};
    Pay Attention
    这里遇到的最大问题,就是网易云的网页竟然还iframe框来做!!!不切入那个内联框架连phantomjs都无能为力!!这是最值得注意的一点,即使你找对了元素,也可能获取不到值!
    如果是win的计算机,在 driver = webdriver.PhantomJS()里面填上phantomjs.exe的路径,上面抓取数据的代码里面有两个需要引擎需要填写路径
    如果有打印出字段,但是记录的数据为0KB,那么是文件没有写进去,对于win的用户,把代码写入的部门,编码方式去掉即可
    有些win的小伙伴反应路径都加载对了,但是还是找不到exe,那么请在路径前面加r比如 executable_path=r"F:\Python\phantomjs-1.9.1-windows\phantomjs.exe"

    结论
    果然一下子就看出是上个世纪九十年代的人(:,还有就是,音乐不分国界,就是动感~

    附录
    对照表

    2 评论 12 下载 2019-04-29 21:42:11 下载需要12点积分
  • 基于OpenCV的批量处理tiff图片黑边(QT环境)

    这几天基础OpenCV,练习写了一个去黑边程序,新手代码,记录一下。
    该方法为扫描线法,遇到非黑边内的(0,0,0)黑色时,用坐标排除(不在边界上跳过)。
    PS:这里还提供一种区域增长思路,找图片黑色区域,面积最大的区域为需要去除的黑边。
    基本思路
    遍历导入图片,遍历像素,找到黑边所在的矩形框坐标,剪切图片(一分为四)
    根据矩形坐标,计算新的地理位置信息
    删除带有黑边的图片和tfw文件信息
    打开和写入保存tif图片和tfw位置信息

    博客链接
    //传入图片 返回图片分割的图片 得到切点坐标QVector<Mat> separationTif(Mat &iplImg, Point2d &cutPnt){ QVector<Mat> vecMat; int width = iplImg.size().width; int height = iplImg.size().height; int begin_wid = 0, end_wid = 0, begin_heig = 0, end_heig = 0; //标记黑边 坐标 int i = 0, j = 0; int blackNumber = 0; for (j = 0; j < height; ++j) { for (i = 0; i < width; ++i) { int tmpb, tmpg, tmpr; tmpb = cvGet2D(&(IplImage)iplImg, j, i).val[0]; tmpg = cvGet2D(&(IplImage)iplImg, j, i).val[1]; tmpr = cvGet2D(&(IplImage)iplImg, j, i).val[2]; if (tmpb == 0 && tmpg == 0 && tmpr == 0) //这里RGB数字可以灵活变动 { ++blackNumber; } } } if (blackNumber == 0) //不存在黑边 { vecMat << iplImg; return vecMat; } else { for (j = 0; j < height; ++j) { bool flag = false; for (i = 0; i < width; ++i) { int tmpb, tmpg, tmpr; tmpb = cvGet2D(&(IplImage)iplImg, j, i).val[0]; tmpg = cvGet2D(&(IplImage)iplImg, j, i).val[1]; tmpr = cvGet2D(&(IplImage)iplImg, j, i).val[2]; if (tmpb == 0 && tmpg == 0 && tmpr == 0) { if (i > 0 && i < width - 1 && j > 0 && j < height - 1) ; else { flag = true; begin_heig = j; break; } } } if (flag) break; } for (j = height - 1; j >= begin_heig; --j) { bool flag = false; //判断 for (i = 0; i < width; ++i) { int tmpb, tmpg, tmpr; tmpb = cvGet2D(&(IplImage)iplImg, j, i).val[0]; tmpg = cvGet2D(&(IplImage)iplImg, j, i).val[1]; tmpr = cvGet2D(&(IplImage)iplImg, j, i).val[2]; if (tmpb == 0 && tmpg == 0 && tmpr == 0) { if (i > 0 && i < width - 1 && j > 0 && j < height - 1) ; else { flag = true; end_heig = j; break; } } } if (flag) break; } for (i = 0; i < width; ++i) { bool flag = false; for (j = 0; j < height; ++j) { int tmpb, tmpg, tmpr; tmpb = cvGet2D(&(IplImage)iplImg, j, i).val[0]; tmpg = cvGet2D(&(IplImage)iplImg, j, i).val[1]; tmpr = cvGet2D(&(IplImage)iplImg, j, i).val[2]; if (tmpb == 0 && tmpg == 0 && tmpr == 0) { if (i > 0 && i < width - 1 && j > 0 && j < height - 1) ; else { flag = true; begin_wid = i; break; } } } if (flag) break; } for (i = width - 1; i >= begin_wid; --i) { bool flag = false; for (j = 0; j < height; ++j) { int tmpb, tmpg, tmpr; tmpb = cvGet2D(&(IplImage)iplImg, j, i).val[0]; tmpg = cvGet2D(&(IplImage)iplImg, j, i).val[1]; tmpr = cvGet2D(&(IplImage)iplImg, j, i).val[2]; if (tmpb == 0 && tmpg == 0 && tmpr == 0) { if (i > 0 && i < width - 1 && j > 0 && j < height - 1) ; else { flag = true; end_wid = i; break; } } } if (flag) break; } if (begin_wid > 0 && begin_wid < (width - 1)) cutPnt.x = begin_wid; else cutPnt.x = end_wid; if (begin_heig > 0 && begin_heig < (height - 1)) cutPnt.y = begin_heig; else cutPnt.y = end_heig; if (cutPnt.x != 0 || cutPnt.y != 0) { //裁剪的中心点不在(0,0)时 剪切图像 cout << "裁剪的中心点为:" << endl; qDebug() << cutPnt.x << cutPnt.y; Mat img0 = Mat(iplImg, Rect(0, 0, cutPnt.x + 1, cutPnt.y + 1)); //左上 Mat img1 = Mat(iplImg, Rect(0, cutPnt.y, cutPnt.x + 1, height - cutPnt.y - 1)); //左下 Mat img2 = Mat(iplImg, Rect(cutPnt.x, 0, width - cutPnt.x - 1, cutPnt.y + 1)); //右上 Mat img3 = Mat(iplImg, Rect(cutPnt.x, cutPnt.y, width - cutPnt.x - 1, height - cutPnt.y - 1)); //右下 vecMat << img0 << img1 << img2 << img3; } else { qDebug() << "Do not have black_border"; vecMat << iplImg; } return vecMat; }}
    0 评论 2 下载 2020-12-03 18:49:03 下载需要7点积分
  • 一键生成QQ个人历史报告

    一、简介近几年,由于微信的流行,大部分人不再频繁使用QQ,所以我们对于自己的QQ数据并不是特别了解。我相信,如果能够生成一份属于自己的QQ历史报告,那将是无比开心的一件事。
    目前网上关于QQ的数据分析工具较少,原因是QQ相关接口比较复杂。而本程序的运行十分简单,具有良好的用户交互界面,只需要扫码登录一步操作即可。
    目前本程序获取的数据包括:QQ详细数据、手机在线时间、非隐身状态下在线时间、QQ活跃时间、单向好友数量、QQ财产分析、群聊分析、过去一年我退出的群聊数据、退去一个月我删除的好友数据、所有代付信息、我最在意的人以及最在意我的人。由于相关的数据接口有访问限制,所以本程序并没有对QQ好友进行分析。
    二、功能截图



    三、如何运行# 跳转到当前目录cd 目录名# 先卸载依赖库pip uninstall -y -r requirement.txt# 再重新安装依赖库pip install -r requirement.txt# 开始运行python main.py
    四、编写思路本程序分为多个模块,模块如下:

    main.py,主程序,用于获取并处理相关数据,并导出数据报告
    qq_bot.py, 核心模块,实现了qq相关的接口,较为复杂
    tkinter_gui.py,绘制gui模块,使用tkinter绘制基本的交互界面
    static_data.py,数据存储模块,所有数据采用base64编码存储

    4.1 main.py模块首先,初始化相关文件夹,并调用qq_bot.py模块,定义一个qq bot对象,该对象为本程序的核心对象,所有数据获取均从该对象获取。
    同时,本程序数据的报告文件为.md格式
    # 初始化文件夹 init_folders() # 写入项目所需资源文件到本地目录 write_data() # 创建一个自己编写的qq bot对象 bot = Bot() custom_print(u'登录成功,正在获取数据...') # 定义欲输出的markdown字符串 markdown_content = ''' <p align="center"> <font size='6px'>{qq_number}的个人QQ历史报告</font> <img src="{qq_icon_png}" align="right" height="60"> </p> ''' # 更新一下欲输出的markdown文本 markdown_content = markdown_content.replace('{qq_number}',bot.qq_number) markdown_content = markdown_content.replace('{qq_icon_png}', 'data/qq_icon.png')
    登录成功后,开始获取该登录账户的详细资料
    custom_print(u'正在获取该登录账户的详细数据...') detail_information = bot.get_detail_information() # content为markdown语法文本 content = '\n<br/><br/>\n' + '## 我的详细资料\n' + '种类|内容\n:- | :-\n' for key, value in detail_information.items(): if key == 'qq_level': star_count, moon_count, sun_count, crown_count = calculate_level(value) data = crown_count * '![](data/level_crown.png)' + sun_count * '![](data/level_sun.png)' + moon_count * '![](data/level_moon.png)' + star_count * '![](data/level_star.png)' content += '{}|{}\n'.format(key_dict[key], data) else: content += '{}|{}\n'.format(key_dict[key], value) # 更新一下欲输出的markdown文本 markdown_content += content markdown_content += '\n> 注:单向好友表示他/她的列表中有你,而你的列表中没有他/她' # 每个步骤完成后,保存markdown文件,以便防止程序出错时能够保存到最新的数据 with open('{}的个人QQ历史报告.md'.format(bot.qq_number), 'w', encoding='utf-8') as file: file.write(markdown_content)
    接着,获取所有qq好友的备注名和qq号
    all_qq_friends = bot.get_all_friends_in_qq() custom_print(u'所有qq好友号码和备注名中...') qq_number_list = [] for key, friend_group in all_qq_friends.items(): for info in friend_group['mems']: qq_number_list.append(info['uin'])
    并获取所有群数据
    # 获取所有群信息 custom_print(u'获取该QQ加入的所有群信息...') group_list = bot.get_group() print(group_list) # content为markdown语法文本 content = '\n\n<br/><br/>\n' + '## 我加入的群资料\n' + '序号|群名|群号|群主QQ\n:- | :-| :-| :-\n' # 获取某个群的群成员信息 for index, group in enumerate(group_list): group_number = group['gc'] group_name = group['gn'] owner = group['owner'] content += '{}|{}|{}|{}\n'.format(str(index+1), str(group_name), str(group_number), str(owner)) # 更新一下欲输出的markdown文本 markdown_content += content # 每个步骤完成后,保存markdown文件,以便防止程序出错时能够保存到最新的数据 with open('{}的个人QQ历史报告.md'.format(bot.qq_number), 'w', encoding='utf-8') as file: file.write(markdown_content)
    接下来的步骤如你所需,也就是获取其他相关的数据,所以本小节就不一一详细解释了,您可以查看相关源代码查看。获取的数据包括:

    获取过去30天内退出的群名单
    获取过去364天内删除的好友名单
    判断此次登录的qq是否为vip或者svip
    获取qb值
    获取代付信息
    亲密度排行榜
    共同好友数
    成为好友的天数

    4.2 qq_bot模块此模块实现了获取qq数据的接口,主要通过抓包获得数据、分析数据,对参数进行加密解密等。
    首先,是模拟扫码登录id.qq.com,qun.qq.com,qzone.qq.com。三者登录方式大同小异,唯一有区别的就是提交数据中的参数加密方式不同。
    我们以id.qq.com登录为例:
    def login_id_qq_com(self): # 登录id.qq.com # 访问网页,为了获取参数pt_login_sig login_url = 'https://xui.ptlogin2.qq.com/cgi-bin/xlogin?pt_disable_pwd=1&appid=1006102&daid=1&style=23&hide_border=1&proxy_url=https://id.qq.com/login/proxy.html&s_url=https://id.qq.com/index.html' html = get_html(login_url, '') # 对返回的cookies进行转化为dict类型,方便处理 cookies_back_dict = dict_from_cookiejar(html.cookies) pt_login_sig = cookies_back_dict['pt_login_sig'] self.cookies_merge_dict_in_id_qq_com.update(cookies_back_dict) # 访问网页,为了获取参数ptqrtoken qrcode_url = 'https://ssl.ptlogin2.qq.com/ptqrshow?appid=1006102&e=2&l=M&s=4&d=72&v=4&t=0.10239549811477189&daid=1&pt_3rd_aid=0' html = get_html(qrcode_url, '') # 对返回的cookies进行转化为dict类型,方便处理 cookies_back_dict = dict_from_cookiejar(html.cookies) qrsig = cookies_back_dict['qrsig'] ptqrtoken = hash33_token(qrsig) self.cookies_merge_dict_in_id_qq_com.update(cookies_back_dict) # 将二维码显示到图片框 BytesIOObj = BytesIO() BytesIOObj.write(html.content) qr_code = PIL.Image.open(BytesIOObj) image = PIL.ImageTk.PhotoImage(qr_code) image_label['image'] = image # 实时检测二维码状态 while (True): # 目标网址 target_url = 'https://ssl.ptlogin2.qq.com/ptqrlogin?u1=https://id.qq.com/index.html&ptqrtoken=' + str(ptqrtoken) + '&ptredirect=1&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=0-0-1556812236254&js_ver=19042519&js_type=1&login_sig=' + str(pt_login_sig) + '&pt_uistyle=40&aid=1006102&daid=1&' # 登录,需要带上访问cookies html = get_html(target_url, self.cookies_merge_dict_in_id_qq_com) # 返回的响应码为200说明二维码没过期 if (html.status_code): if ('二维码未失效' in html.text): custom_print(u'(1/3)登录id.qq.com中,当前二维码未失效,请你扫描二维码进行登录') elif ('二维码认证' in html.text): custom_print(u'(1/3)登录id.qq.com中,扫描成功,正在认证中') elif ('登录成功' in html.text): self.is_login = True custom_print(u'(1/3)登录id.qq.com中,登录成功') break if ('二维码已经失效' in html.text): custom_print(u'(1/3)登录id.qq.com中,当前二维码已失效,请重启本软件') exit() # 延时 time.sleep(2) # 登录成功后,把返回的cookies合并进去 self.cookies_merge_dict_in_id_qq_com = dict_from_cookiejar(html.cookies) self.cookies_merge_dict_in_id_qq_com.update(cookies_back_dict) # print(u'当前cookies:{}'.format(cookies_merge_dict)) # 获取此次登录的qq号码 qq_list = re.findall(r'&uin=(.+?)&service', html.text) self.qq_number = qq_list[0] # 登录成功后,会返回一个地址,需要对该地址进行访问以便获取新的返回cookies startIndex = (html.text).find('http') endIndex = (html.text).find('pt_3rd_aid=0') url = (html.text)[startIndex:endIndex] + 'pt_3rd_aid=0' # 屏蔽https证书警告 urllib3.disable_warnings() # 这里需要注意的是,需要禁止重定向,才能正确获得返回的cookies html = get(url, cookies=self.cookies_merge_dict_in_id_qq_com, allow_redirects=False, verify=False) # 把返回的cookies合并进去 cookies_back_dict = dict_from_cookiejar(html.cookies) self.cookies_merge_dict_in_id_qq_com.update(cookies_back_dict)
    首先是访问指定网址,获取参数pt_login_sig,其次是访问另外一个网址,获取参数qrsig,通过加密函数,将参数qrsig转化为ptqrtoken,然后就是获取二维码图片的状态了。当我们检测到登录成功时,就证明用户已经完成扫码操作,此时将网址返回的cookie保存下来。
    这里要说明的是,加密函数的获取,需要具备一定的抓包基础才能获取得到。本程序的几个加密函数如下:
    # 对qrsig进行基本的加密,该加密函数由抓包获得,需要具备一定抓包知识才能找到该加密函数# 根据javascript版的加密函数,将其改写成python版本def hash33_token(t): e, n = 0, len(t) for i in range(0,n): e += (e << 5) + ord(t[i]) return 2147483647 & e# 对skey进行基本的加密,该加密函数由抓包获得,需要具备一定抓包知识才能找到该加密函数# 根据javascript版的加密函数,将其改写成python版本def hash33_bkn(skey): e = skey t = 5381 for n in range(0,len(e)): t += (t << 5) + ord(e[n]) return 2147483647 & t
    由于该模块下具有许多获取相关数据的qq接口,但是它们的形式非常相似,所以本节仅仅以获取所有qq群数据为例:
    def get_group(self): # 获取所有群基本信息 # bkn由参数skey通过另一个加密函数得到 bkn = hash33_bkn(self.cookies_merge_dict_in_qun_qq_com['skey']) submit_data = {'bkn': bkn} html = post_html('https://qun.qq.com/cgi-bin/qun_mgr/get_group_list', self.cookies_merge_dict_in_qun_qq_com, submit_data) group_info = loads(html.text) print(group_info) return group_info['join']
    这里主要涉及到的还是参数的加密、解密过程,这是一个难点,其他的话还是比较简单的。
    4.3 tkinter_gui模块这个模块是绘制基本的gui模块,采用python内置的tkinter模块完成,用法相当简单,这里就不详细讲了。
    4.4 static_data模块这个模块主要是用来存储相关的数据的,在程序每次运行时,将该静态资源文件输出。这么做的原因是可以防止用户将某些静态数据给删除了,导致程序运行错误。
    五、补充完整版源代码存放在github上,有需要的可以下载
    项目持续更新,欢迎您star本项目
    LicenseThe MIT License (MIT)
    3 评论 1 下载 2020-10-27 12:56:14 下载需要7点积分
  • 基于Python实现的抓包分析软件

    一、简介这是一个学习模仿WireShark的抓包软件。可以的功能有:侦听、解析、构造数据包等。其中还包括扩展功能:流量监测和攻击检测(Land攻击,Ping of Death)。软件目前支持解析:IP、IPv6、ARP、TCP、UDP、ICMP、ICMPv6、SSDP、HTTP、TLS。
    二、主要功能
    侦听指定网卡或所有网卡,抓取流经网卡的数据包
    解析捕获的数据包每层的每个字段,查看数据包的详细内容
    可通过不同的需求设置了BPF过滤器,获取指定地址、端口或协议等相关条件的报文
    针对应用进行流量监测,监测结果实时在流量图显示,并可设置流量预警线,当流量超过预警线时自动报警
    提供了以饼状图的形式统计ARP、TCP、UDP、ICMP报文,以柱状图的形式统计IPv4、IPv6报文
    可将抓取到的数据包另存为pcap文件,并能通过打开一个pcap文件对其中的数据包进行解析
    可逐层逐字段构造数据包,实现自定义数据包发送

    三、主要模块
    数据报文采集模块:完成网络接口数据的捕获、解析,可以根据用户定义条件组合来进行捕获,如只监视采用TCP或UDP协议的数据包,也可以监视用户希望关注的相关IP地址的数据包,同时完成数据封包日志记录,提高了系统的灵活性。此外,对IP类型、ARP、TCP、UDP、ICMP的数量进行统计。
    应用流量监测模块:获取当前正在运行的应用进程,用户可选择一个应用进行流量监测,获取应用中流量信息,同时对一些常见的入侵攻击特征进行判断,如根据源目的地址是否相同判断Land攻击、IP头部长度是否过长判断ping拒绝服务攻击,并发出预警。
    报文伪造模块:可以自行构造Ether、IP、TCP、UDP、ICMP、ARP报文,并选择send()、sendp()、sr()、srl()、srloop()五种方式发送报文以实现简单攻击或对TCP/IP进行调试。
    界面显示模块:设计系统主窗口即数据报文采集界面、应用流量监测界面、报文伪造界面。并完成报文统计图的显示,流量图的显示。
    四、源代码结构
    img存放程序中使用的背景和图标。
    capture_core.py抓包程序的后台文件,主要用来生成数据包的摘要信息、分析数据包的结构、程序状态处理、下载速度和上传速度的更新等。
    flow_monitor.py流量监控程序的后台服务代码,实时更新速度、应用流量的过滤及摘要信息的生成、更新应用的网络连接等。
    forged_packet用于构造数据包并发送,可自定义数据包的每个字段,实现网络攻击或网络欺骗等功能。
    main_ui.py抓包程序的GUI代码,包括了快捷键的绑定以及可自定义字体和背景图片、已抓到数据包的摘要信息的展示、显示某个数据包的详细信息和十六进制数据等功能。
    main.py程序的入口。
    monitor_system.py流量监控的GUI代码,用于查看网络连接速度等。
    tools.py工具代码,用于获取网卡的NIC、格式的转换、网络连接速度的获取。
    data.json用于存放程序的配置信息。

    五、环境依赖
    Python 3.6
    Scapy 2.4

    Linux & Windows
    # pip install psutil scapy matplotlib pyqt5
    在Windows下,还需要
    # pip install wmi pywin32
    六、使用方法进入项目目录
    # cd WireWhale # python main.py
    七、部分功能介绍
    主界面主要包括5个部分:
    菜单栏
    文件:文件保存、打开,软件退出编辑:可自行设置主窗体字体捕获:捕获数据包的流程分析:两大拓展功能,应用流量监测和伪造数据包统计:报文统计帮助:功能介绍及版权声明
    工具栏
    界面初始时,根据程序运行状态转移图只有开始键可以响应设置了标志位:start_flag、pause_flag、stop_flag、save_flag,用于对程序中一些函数的使用添加限制。开始、暂停、停止、重新开始四个按钮全部按照下图逻辑设置在什么情况下可响应下面为部分状态截图
    起始状态运行状态暂停状态停止状态

    过滤器以及网卡选择
    页面初始化时网卡选择下拉框获取网卡信息进行显示,如下图所示,默认全选
    报文显示
    根据报文类型显示不同颜色,以进行明显的区别报文解析以树状结构显示,层次结构清晰明了抓包简略信息显示框定时滑到最底部
    状态栏(显示当前网卡、实时收发包速度、上传下载速度)

    数据统计模块:绘制图使用python下最流行的数据处理框架Matplotlib绘制要求的统计图。


    八、软件运行时部分截图8.1 主程序



    8.2 数据包伪造

    8.3 流量监控
    2 评论 38 下载 2019-05-17 17:03:33 下载需要13点积分
  • 基于JSP的停车场信息管理系统设计与实现

    1 引言1.1 项目背景软件系统的名称是停车场管理系统。我们开发的系统将帮助停车场管理员和物业公司更加智能化的管理停车场,省去很多的人力物力。方便随时查询停车场的情况,也有助于车主方便随时查找附近可以停车的停车场。
    1.1.1用户基本情况介绍
    角色1:停车场管理员
    查看剩余车位数量,状态
    记录车牌号,出入时间,收钱
    查看停车出入记录
    修改停车位类型(临时车位或永久车位,当有业主购买车位的情况下,记录购买的基本信息,停车位的年限等)
    角色2:系统管理员
    增加停车场数量,因为不止有一个停车场,设置停车场的相关信息
    增加停车场管理员数量
    角色3:用户(车主)手机端
    用户可以查看停车场的停车位信息,以及其他停车场的停车位信息(用户除了可以停在自己小区已购买的停车位,还可以停在周围小区的临时收费停车位)

    1.1.2 项目开发目标停车管理系统能够对对进出停车场的车辆进行科学有效的实时管理,通过过网络和服务中心服务器相联,进行数据共享。停车场系统管理软件可方便地完成管理临时车位、长期占有车位、随时查询停车场情况、修改停车位信息、给更多的停车场提供接口等功能。
    自动统计车辆进出数量,在每个入口处设置显示牌显示该区车辆统计。各停车场系统之间应能进行信号传输,方便各个车主查询和物业公司进行管理。
    1.1.3 用户组织结构
    1.1.4 用户相关业务
    停车场管理员
    记录车的出入信息
    查看停车历史记录
    管理车主买车位的信息
    系统管理员
    管理停车场的属性信息
    管理停车场管理员信息
    用户(安卓)
    查看停车位信息

    1.2 业务对象说明及术语定义
    进库、进场:指车辆进入停车场。
    出库、出场:指车辆驶离停车场。
    车主:指拥有车辆、购买停车位的本小区业主,不是指外来临时停靠的司机。
    车位类型:分固定车位和临时车位,固定车位指已经被业主购买的车位,临时车位指没有被业主购买,可供外来车辆临时停车的车位。

    2 任务概述2.1 目标具有操作简单、使用方便、功能先进等特点,停车场使用者可以在最短的时间进入或离开停车场,从而提高停车场的管理水平,取得更高的经济效益和良好的社会效益。它一方面以智能化设备和完善的管理软件来简化人的劳动,实现停车场车辆进入、场内监控以信息化管理;另一方面通过网络化管理实现能够在一个相对广阔的地域内(例如一个城市)了解多个停车场情况,附近停车场的空车位数。
    2.2 运行环境2.2.1 网络及硬件环境一台联网的pc 和一个安卓手机
    2.2.2 支持软件环境该系统为B/S三层结构,它的运行环境分客户端、应用服务器端和数据库服务器端三部分。

    客户端
    操作系统:Windows7或更新版本。 浏览器:IE8以上,其它常见浏览器如FireFox。
    应用服务器端
    操作系统:Windows7或更新版本。
    应用服务器:Tomcat 7或更新版本。
    数据库访问:JDBC。
    数据库服务器端
    操作系统:Windows7或更新版本。 数据库系统:SQL Server 2008 r2
    Android端
    Android4.4版本或以上

    2.3 条件与限制要求用户具有简单的计算机使用知识,系统暂时无法提供收费管理功能
    3 功能需求3.1 总体功能需求停车场管理系统主要有管理车辆进场出场功能、记录查询功能等。停车场车位划分为固定停车位和临时停车位。满足业主拥有固定停车位和周围散客停车的要求。给不同类型的用户赋予不同的权限管理停车场。主要能管理车辆进场入场、查询历史记录、查询当前停车信息(如空余车位量等)。
    3.2 功能划分根据系统的需求分析,将系统设计的功能分为三大模块:车辆进出管理模块、信息查询模块和系统管理模块。

    停车场管理:车辆入场、车辆出场
    车辆进入停车场时,系统管理员记录车辆的车牌号码和自动获取系统时间作为进入时间。车辆离开停车场时,根据车辆车牌号码判断是否为固定车位车辆来决定是否收费。所有进出停车场的信息(包括车牌号、进入时间、离开时间)都记入一个进出记录表以备查询和统计使用。
    信息查询:某时间段的出入场信息,当前在场信息,车辆历史停车记录
    系统的查询功能可以查询包括自由车位空闲数目、自由车位停车情况、固定车位使用情况、固定车位车主信息、自由车位使用率等多种信息。将自由车位空闲数目显示在停车场入口处,可以提示即将进入停车场的车主;如果自由车位已满,更可以给出指示,并不允许继续进行车辆进入自由车位停车场的操作。
    信息维护:用户及停车位续费等
    查询模块包括自由车位空闲数目指示、固定车位停车情况查询、固定车位车主信息查询、自由车位停车情况查询,指定车辆进出记录查询、系统初始化功能。
    系统管理:车位信息
    进出记录表中记录了包括固定车位车辆和自由车位车辆的所有进出信息,每车每次离开停车场时增加一条记录,非常方便日后查询和统计工作的需要。

    将停车场划分为固定车位和自由车位两部分。固定车位又可以称为专用车位或内部车位,它的特点是使用者固定,交费采用包月制或包年制,平时进出停车场时不再交费。对于固定车位的车辆,系统有着详细的信息记录,包括车辆信息和车主信息。自由车位又可以称为公用车位或公共车位,它的特点是使用者不固定,针对临时性散客服务,车辆每次出停车场时,根据停车时间和停车费率交纳停车费用。固定车位的车辆总是停放在自己的车位上,而不停放在自由车位上。不同类型停车场的固定车位和自由车位数目比例是不同的,,系统可以在系统管理功能里对这两类车位的数目进行设定和修改。
    系统包含三类用户:系统管理员、停车场管理员和普通用户。

    系统管理员能够对停车场和停车场管理员实现信息管理,包括开放对更多停车场的接口,管理各个停车场管理员等。
    停车场管理员可以查看剩余停车位信息,查看以前的停车记录,对车辆的入库出库信息进行管理,以及对于车主购买停车位的信息管理,车主购买停车位的信息管理基本包括信息的增删改查。
    普通用户能够通过手机端查看剩余车位信息。

    3.3 功能需求1系统管理员能够对停车场和停车场管理员实现信息管理,包括开放对更多停车场的接口,管理各个停车场管理员等。
    3.3.1 用例描述
    3.3.2 数据概念结构图
    3.3.3 系统业务流程图
    3.4 功能需求2停车场管理员由可以查看剩余停车位信息,查看以前的停车记录,对车辆的入库出库信息进行管理,以及对于车主购买停车位的信息管理,车主购买停车位的信息管理基本包括信息的增删改查。
    3.4.1 用例描述停车场管理员用例图

    3.4.2 数据概念结构图
    3.4.3 系统业务流程图
    3.5 功能需求3普通用户的定位在于私家车主,只需要能够在手机上查看到指定的停车场有没有剩余的停车位信息即可。
    3.5.1 用例描述
    3.5.2 数据概念结构图
    3.5.3 系统业务流程图
    4 性能需求4.1 数据精确度


    数据
    要求




    车牌号
    格式长度正确


    离开、到达时间
    精确到分钟


    手机号
    11位数


    停车场地址
    精确到道路的哪一号



    5 运行需求5.1 安全性权限控制根据不同用户角色,设置相应权限,用户的重要操作都做相应的日志记录以备查看,没有权限的用户禁止使用系统。只有该停车场管理员能对该停车场进行操作。系统管理员才能新增停车场管理员和开放对其他停车场的接口。
    重要数据加密本系统对一些重要的数据按一定的算法进行加密,如用户口令、重要参数等。
    数据备份允许用户进行数据的备份和恢复,以弥补数据的破坏和丢失。
    记录日志本系统应该能够记录系统运行时所发生的所有错误,包括本机错误和网络错误。这些错误记录便于查找错误的原因。日志同时记录用户的关键性操作信息。
    5.2 用户界面
    屏幕尺寸387mm*259mm手机端建议使用5.2寸或以上屏幕
    5.3 接口要求5.3.1 硬件接口
    服务器端建议使用专用服务器
    5.3.2 通信接口
    http协议
    6 系统结构分析6.1 系统静态结构关系分析说明
    其中的类包括:

    普通用户类:具有车牌号属性,完成用户的查询空车位行为。停车场管理员类:具有管理员工号,电话,身份证号,年龄等基本信息,完成查询剩余停车位信息,查看停车记录,记录车辆出入信息,管理车主购买停车位信息等行为。系统管理员类:具有用户名和密码属性,完成停车场信息管理,停车场管理员信息管理行为。车位信息类,停车场信息类,车主购买车位类,车辆进出场信息管理类(车辆进场信息类,车辆出场信息类)。
    6.2 系统体系结构分析说明

    用户查看剩余停车位信息管理包括普通用户查看指定停车场的剩余停车位信息;停车场管理员信息管理包括查看、增加、删除、修改停车场管理员信息的界面类,控制类以及停车场管理员信息实体类。停车场信息管理包括查看、增加、删除、修改停车场信息的界面类,控制类以及停车场信息实体类。车辆出入信息管理包括包含记录车辆的出入场时间,车牌号等信息。车主购买停车位信息管理包括查看、增加、删除、修改车主购买停车位的界面类,控制类以及车主信息以及停车位信息的实体类。
    6.3 系统部署分析说明
    7 系统功能行为分析7.1 系统业务流程说明系统管理员活动图
    系统管理员的主要活动基本为停车场信息管理和停车场管理员的信息管理活动,包括每种信息的查看,增加,删除和修改活动。

    停车场管理员活动图
    停车场管理员由于对系统操作较多,所以活动也较多,包括查看剩余停车位信息,查看以前的停车记录,对车辆的入库出库信息进行管理,以及对于车主购买停车位的信息管理,车主购买停车位的信息管理基本包括信息的增删改查。

    普通用户活动图
    普通用户的定位在于私家车主,只需要能够在手机上查看到指定的停车场有没有剩余的停车位信息即可,所以活动只有一个。

    7.2 系统交互说明因为系统管理员对于停车场信息管理和停车场管理员的管理流程基本相同,所以这里只写明系统管理员对于停车场信息的管理时序图,对于停车场管理员的流程基本相同。
    系统管理员查看停车场信息时序图

    系统管理员删除停车场信息时序图

    系统管理员修改停车场信息时序图

    系统管理员增加停车场信息时序图

    停车场管理员查看剩余停车位信息

    停车场管理员记录车辆入库信息

    停车场管理员记录车辆出库信息

    停车场管理员查看停车记录

    停车场管理员查看车主购买车位信息

    停车场管理员修改车主购买车位信息

    停车场管理员增加车主购买车位信息

    普通用户查看停车场剩余车位信息

    停车场管理员删除车主购买车位信息

    7.3 系统对象状态演化说明系统管理员主要状态图
    系统管理员主要进行停车场管理员和停车场信息的管理操作,所以主要的状态即为对于停车场和停车场管理员的操作状态。

    停车场管理员主要状态图
    停车场管理员在系统当中功能较多,主要功能涉及查看停车场的剩余停车位信息,查看停车的历史记录,对车辆的出入库信息进行管理,以及对车主购买停车位的信息管理,所以主要状态即为查看信息以及对信息进行管理操作。

    普通用户主要状态图

    8 系统展示登陆主界面

    系统管理员登录主界面

    查看管理员信息界面

    查看停车场信息界面

    添加停车场管理员信息界面

    修改停车场管理员信息界面

    查看出入信息界面

    添加停车记录信息界面

    查看停车记录备份界面

    手机端的查询界面

    手机端的显示界面
    8 评论 228 下载 2018-10-05 22:27:42 下载需要14点积分
  • 基于Python的有道翻译小软件


    Python 2.7.13
    IDE Pycharm 5.0.3
    macOS 10.12.1

    前言
    花了一点时间,半抄半写半修改的写了第一个能用的python小程序,作用是在IDE端模拟有道词典的访问,效果如下图所示,不足之处在于,当输入的中英文字符串超过一定数量,会抛出中间代码,新手并不知道怎么处理,望知道的不吝赐教

    初阶:交互界面
    首先在jupyter或者pycharm中进行交互的操作,核心语句是使用raw_input捕获系统输入

    1. 效果图
    2. 代码# -*- coding: utf-8 -*-import urllib2import urllib # python2.7才需要两个urllibimport jsonwhile True: content = raw_input("请输入需要翻译的内容:") # 系统捕获输入,就是命令框会弹出提示,需要你进行手动输入 if content == 'q': # 输入q退出while循环 break url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null" data = {} # 构造data,里面构造参数传入 data['type'] = 'AUTO' data['i']=content data['doctype'] = 'json' data['xmlVersion'] = '1.8' data['keyfrom'] = 'fanyi.web' data['ue'] = 'UTF-8' data['action'] = 'FY_BY_ENTER' data['typoResult'] = 'true' data = urllib.urlencode(data).encode('utf-8') # 将构造的data编码 req = urllib2.Request(url) # 向浏览器发出请求 response = urllib2.urlopen(req, data) # 带参请求,返回执行结果 html = response.read().decode('utf-8') # print(html) # 可以取消print的注释,查看其中效果,这边获取的结果是进行解析 target = json.loads(html) # 以json形式载入获取到的html字符串 print "翻译的内容是:"+target['translateResult'][0][0]['tgt'].encode('utf-8')# 请输入需要翻译的内容:test# 翻译的内容是:测试# 请输入需要翻译的内容:测试# 翻译的内容是:test# 请输入需要翻译的内容:q
    注意:这里的data字典中的数据根据实际网页中数据为准,可能会不一样,具体操作,点击审查元素。
    进阶:做成gui
    离实用还差那么两步,第一步是先做成GUI

    1. 界面效果
    2. 代码# -*- coding: utf-8 -*-from Tkinter import *import difflibimport urllib2import urllib # python2.7才需要两个urllibimport json# ----------------------主框架部分----------------------root = Tk()root.title('翻译GUI&beta1')root.geometry()Label_root=Label(root)#-----------------------定义规则------------------------def translate(content): url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null" data = {} # 构造data,里面构造参数传入 data['type'] = 'AUTO' data['i']=content data['doctype'] = 'json' data['xmlVersion'] = '1.8' data['keyfrom'] = 'fanyi.web' data['ue'] = 'UTF-8' data['action'] = 'FY_BY_ENTER' data['typoResult'] = 'true' data = urllib.urlencode(data).encode('utf-8') # 将构造的data编码 req = urllib2.Request(url) # 向浏览器发出请求 response = urllib2.urlopen(req, data) # 带参请求,返回执行结果 html = response.read().decode('utf-8') # print(html) # 可以取消print的注释,查看其中效果,这边获取的结果是进行解析 target = json.loads(html) # 以json形式载入获取到的html字符串 #print u"翻译的内容是:"+target['translateResult'][0][0]['tgt'] return target['translateResult'][0][0]['tgt'].encode('utf-8')#还可以继续增加规则函数,只要是两输入的参数都可以#----------------------触发函数-----------------------def Answ():# 规则函数 Ans.insert(END,"翻译 %s: "%var_first.get().encode('utf-8') + translate(var_first.get().encode('utf-8')))def Clea():#清空函数 input_num_first.delete(0,END)#这里entry的delect用0 Ans.delete(0,END)#text中的用0.0#----------------------输入选择框架--------------------frame_input = Frame(root)Label_input=Label(frame_input, text='请输入需要翻译的内容', font=('',15))var_first = StringVar()input_num_first = Entry(frame_input, textvariable=var_first)#---------------------计算结果框架---------------------frame_output = Frame(root)Label_output=Label(frame_output, font=('',15))Ans = Listbox(frame_output, height=5,width=30) #text也可以,Listbox好处在于换行#-----------------------Button-----------------------calc = Button(frame_output,text='翻译', command=Answ)cle = Button(frame_output,text='清空', command=Clea)Label_root.pack(side=TOP)frame_input.pack(side=TOP)Label_input.pack(side=LEFT)input_num_first.pack(side=LEFT)frame_output.pack(side=TOP)Label_output.pack(side=LEFT)calc.pack(side=LEFT)cle.pack(side=LEFT)Ans.pack(side=LEFT)#-------------------root.mainloop()------------------root.mainloop()
    高阶:发布应用
    如何在小伙伴面前装B才是我学习的动力,哈哈哈

    Pay Attention
    python3的用户注意url包的使用和python2是有区别的,请根据实际需求自行百度
    Python如果操作频率太快或者网页限制机器人对此的访问,则需要修改head了,修改代码后.当然每个电脑的user都不一样,具体去审查元素查看。

    req = urllib2.Request(url) # 生成对象# 添加如下一行代码;req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'),这样就可以伪装成人类啦
    当然也可以添加延时模块, 即可限定访问时间。
    import time #添加延时模块time.sleep(1)#休息1秒钟再进行操作
    python3的同学需要Tkinter改成小写,还有就是注意编码部分的转化。
    mac的同学可能遇到tkinter无法输入中文问题,可能是由tkinter版本过低导致,解决方案参考:MAC 系统中,Tkinter 无法用 中文输入法 输入中文
    3 评论 8 下载 2019-05-02 20:42:33 下载需要12点积分
  • 基于PyQT5、PocketSphinx的python语音识别小程序

    1.使用说明1.1 项目简介参照微软cotana的工作方式,编写自己的一个python语音助手程序,借助PyQt5和Pipy,创建可视化窗口,能实现基本的语音识别功能,同时根据几个特定的关键词执行简单的行动(如music,readme等)。
    1.2 项目功能要求
    实现语音识别,并将识别的内容在屏幕上打印出来
    设置几个命令关键词(music,readme),并实现相应的行动。若识别出的内容中包含设置的几个关键词,则程序执行相应的行动。
    设置两种识别模式:PocketSphinx中包含7个Recognizer API:程序中使用了两个API:recognize_sphinx和recognize_google。(两种识别模式可由用户自行选择,其中recognize_sphinx可直接在本地运行,但识别精度较低;recognize_google识别精度较高,但是使用recognize_google需要处于联网状态下且IP地址需要在境外,否则语音识别会出现错误)
    设置文本框:用户可直接在文本框中输入命令,其执行效力与语音输入等效

    2.程序设计与实现2.1 设计class Ui_MainWindow(object):
    Ui_Mainwindow类加载图形化用户界面,控制界面布局,类中包含各种Label,PushButton,MenuBar控件。
    class myWindow(QtWidgets.QMainWindow):
    mywindow类处理交互逻辑,类中包含各种执行函数,同时实现控件与函数的连接。
    2.2 主要函数实现声音监听与处理函数def listen(self): # Working with Microphones mic = sr.Recognizer() with sr.Microphone() as source: # use the default microphone as the audio source audio = mic.listen(source) # listen for the first phrase and extract it into audio data try: if self.isgoogle: content = mic.recognize_google(audio) else: content = mic.recognize_sphinx(audio) except sr.RequestError: self.ui.label.setText("Something was wrong! Try again......") COMMEND = ["music", "open"] commend_is_music = re.search(COMMEND[0].lower(), content.lower()) commend_is_file = re.search(COMMEND[1].lower(), content.lower()) if commend_is_music: self.ui.label.setText("you said: \" " + content + "\"") win32api.ShellExecute(0, 'open', 'D:\\网易云音乐\\CloudMusic\\cloudmusic.exe', '', '', 1) elif commend_is_file: self.ui.label.setText("you said: \"" + content + "\"") win32api.ShellExecute(0, 'open', 'D:\\Notpad++\\Notepad++\\notepad++.exe', '', '', 0) else: self.ui.label.setText("you said: \" " + content + "\"\nIt's not a valid command.")
    创建监听线程def listen_thread(self): self.ui.label.setText("I'm listening...... ") t1 = threading.Thread(target=self.listen) t1.setDaemon(True) t1.start()
    文本处理函数def text_changed(self): content = self.ui.textbox.text() print(content) COMMEND = ["music", "open"] commend_is_music = re.search(COMMEND[0].lower(), content.lower()) commend_is_file = re.search(COMMEND[1].lower(), content.lower()) if commend_is_music: self.ui.label.setText("you typed: \" " + content + "\"") win32api.ShellExecute(0, 'open', 'D:\\网易云音乐\\CloudMusic\\cloudmusic.exe', '', '', 1) elif commend_is_file: self.ui.label.setText("you typed: \"" + content + "\"") win32api.ShellExecute(0, 'open', 'D:\\Notpad++\\Notepad++\\notepad++.exe', '', '', 0) else: self.ui.label.setText("you typed: \" " + content + "\"\nIt's not a valid command.")
    创建文本处理线程def text_thread(self): t2 = threading.Thread(target=self.text_changed) t2.setDaemon(True) t2.start()
    连接各类控件与相应函数self.ui.recognize_btn.clicked.connect(self.listen_thread)#语音识别按钮连接监听线程self.ui.sphinx_bar.triggered.connect(self.sphinxbar_recognize)#sphinx模式触发self.ui.google_bar.triggered.connect(self.googlebar_recognize)#google模式触发self.ui.text_btn.clicked.connect(self.text_thread)#文本框输入确认按钮连接文本处理线程
    3.测试截图


    5 评论 17 下载 2019-05-11 23:24:40 下载需要12点积分
  • 基于Qt实现的AI同化棋游戏

    这是一个非常简单的 AI,基于这个框架,还可以进行大量改进以提高智商,代码已经进行了很基础的封装,关键过程的说明见注释。
    以下可参考:

    https://en.wikipedia.org/wiki/Minimax
    https://cs.uwaterloo.ca/~cbright/reports/cs686project.pdf ,(Negamax 是 miniMax 的变体)

    Minimax 算法首先,同化棋是一种“0和”对抗游戏(一方优势一方必然劣势) 那么我们考虑用通过 Minimax 算法解决。
    Minimax 算法又名极小化极大算法,是一种找出失败的最大可能性中的最小值的算法。
    简单来说,就是枚举当前执行者所有可能的选择,不断一层层拓展局面,达到限定层数后,对局面进行估值,然后按 MAX 层选择分支的最大值,MIN 层选择分支的最小值,模拟对弈双方的选择。
    α-β剪枝通过分析可以发现,在利用穷举方法执行 Minimax 算法中有许多的无效搜索,也就是说,许多明显较劣的状态分支我们也进行搜索了。
    我们在进行极大值搜索的时候,我们仅仅关心,下面最大的状态,对于任何小于目前值的分支也都是完全没有必要进行进一步检查的。

    图中 MIN 层第二个结点,在得到下一层的估值 2 后,它的返回值必然<=2,而上一层是 MAX 层,从 MIN 层第一个结点已经得到了 4,故其>=4,所以,MIN 层第二个结点必然不会被选 择,没有继续的必要。
    同理,我们在进行极小值搜索的时候,我们仅仅关心,下面最小的状态,对于任何大于目前值的分支都是完全没有必要进行进一步检查的。

    估价函数使用 Minimax 算法,最为关键的部分是如何对一个局面进行估价,判断其到底有多大的可能性会给 AI 带来胜利。
    分析同化棋的规则,容易发现其局面上的总棋子数是不减的。那么,双方获得的棋子的差是最容易想到的估价,也是此 AI 所使用的主要估价。
    其次,经过尝试,当一方占据半壁江山(>24)后,非常容易走向胜利,所以我们贪心地尽量让其超过一半,即给予较高估价。
    改进此 AI 可以进一步改进的地方:
    1.估价函数由于同化棋一步可以最多同化 8 个棋子,所以可能当前你优势(棋子差额)很大,但是下一步立马被翻盘。所以我们可以考虑统计一些容易被同化的如中空的方形,菱形的个数,给予估价值。还有很多估值方法…
    2.优化程序以加速根据 Minimax 算法的特点,在时限内搜索的层数越深,结点越多,选择就越优,AI 的智商就越高。此 AI 以易读性为主,牺牲了许多性能,可以做许多改进:
    (1)状态压缩对于一个棋盘,由于其只有 49 个位置,我们可以把位置映射到 0~48 这 49 个数 (f(x,y) = x * 7 + y) ,对于某个位置,其只有存在棋子,不存在棋子,两种状态,所以对于对弈的一方,我们可以用一个 64 位整数的第 k 个 2 进制位=0/1 表示是否在 k 位置有这个数,从而把他的所有棋子的位置映射成一个 64 位整数(c++: long long int)。
    这样一来,棋盘状态由一个 7*7 数组变成了两个整数,我们可以使用位运算,十分快速地进行查找位置,更新状态,统计个数等等操作。将压缩的状态 hash 判断冲突是防止进入循环局面的方法之一。
    (2)剪枝及搜索顺序如已经被已方及边界与最近对方分隔 2 层以上的己方完全占领区域的棋子,是可以稍后考虑的。 接近对方边缘部位的棋子是可以优先考虑的,这样可以容易得出接近最优值的选择,更高效地利用α-β剪枝。
    (3)常数优化根据语言及计算机的一些特性,在不改变功能的情况下对程序的语句进行修改,以期获得更好的性能。
    3. 随机化可以用随机化在一定程度上防止局面陷入循环,或者被对手用同样的走法再次打败。但要注意,不能随机进入一个劣势局面。
    4.迭代加深因为此 AI 现有估价及搜法较弱,最大搜索层数很低,所以在搜索时采用迭代加深层数限制的方法,这就产生了问题,下一个深度是沿用之前所有搜索深度得到的首层 max、min 值(通常在低深度得到最优值), 还是初始化 max,min 值,现版本 AI 经测试,第一种占优,但是改进后,是否还进行迭代加深,或者采取哪种方法,需测试。(理论上第二种占优,本质上第一种是贪心)。
    界面展示人人对弈,搜索深度为3

    AI先手,搜索深度为3

    AI后手,搜索深度为5
    1 评论 7 下载 2020-06-26 12:03:03 下载需要13点积分
  • 基于WIN32 API实现黄金矿工游戏单人版

    一、什么是设计文档游戏类型是什么?游戏有哪些功能?相关数学公式是什么?
    描述一个游戏的所有功能,这就是设计文档,也叫需求说明。真正的设计文档,并不是我写的这个样子,应该由策划来写(俗称“案子”)。我写的这篇,有流程图、有分类,条理清晰,基本上和真实代码完全对应,已经接近伪码了。
    二、游戏状态图
    三、游戏功能设计1.开屏

    显示内容:
    程序启动后,显示初始化图片,计时结束,进入菜单界面。
    逻辑处理:
    控制图片从左至右显示。

    2.菜单

    显示内容:
    显示菜单背景图片,显示“开始”按钮。
    逻辑处理:
    检测鼠标移动。当鼠标移动到按钮上,更改按钮图片。
    检测鼠标单击。当按下按钮后,初始化游戏数据,开始“地图加载”动画。

    3. 地图加载动画

    显示内容:
    显示背景图片,进度条,显示当前关卡、目标金钱数量。
    逻辑处理:
    控制进度条移动。

    4. 游戏中

    显示内容:
    显示人物图片,地面背景。
    显示当前金钱数量,目标金钱数量,剩余时间。
    显示叉子。
    显示金子、石头。
    显示炮的数量。
    显示爆炸动画。
    逻辑处理:
    控制叉子摆动,伸出,收回。
    检测按键“下”,按下后,叉子伸出。
    检测叉子是否碰到物品,碰到物品后,叉子收回,物品跟随叉子移动。
    当物品移动到地面位置,清除物品,增加金钱。
    胜负判断。
    道具使用:
    检测按键“上”,按下后,清除当前所抓物品,播放爆炸动画。
    判断玩家属性:如果有“体力”道具,增加叉子收回速度。
    判断玩家属性:如果有“魔法”道具,增加物品价值。

    5.游戏过关

    显示内容:
    显示过关图片。
    逻辑处理:
    计时结束,进入“购买道具”状态。

    6.购买道具

    显示内容:
    道具按钮:炮,体力,魔法。
    “下一关”按钮。
    逻辑处理:
    检测鼠标移动。当鼠标移动到按钮上,更改按钮图片。
    点击“炮”,增加炮的数量。
    点击“体力”,增加叉子收回速度。
    点击“魔法”,设置玩家属性:有魔法道具。
    点击“下一关”,加载地图,进入下一关游戏。

    7.游戏失败

    显示内容:
    显示失败图片。
    逻辑处理:
    计时结束,进入“菜单”状态。

    8.游戏通关

    显示内容:
    显示通关图片。
    逻辑处理:
    计时结束,进入“菜单”状态。

    四、叉子坐标系统叉子所在位置为坐标原点,所在位置垂线为X轴。向左摆动,旋转角度A大于0;向右摆动,旋转角度A小于0。其中,x,y是屏幕坐标系统。叉子坐标系统示意图:

    五、碰撞检测怎样检测叉子碰到了物品?在叉子端口处,设定一个圆形区域。如果这个圆与物品碰撞,则叉子碰到了物品。示意图如下:

    其中,圆心坐标A(50, 0) ,半径14。
    物品的检测范围也是圆形区域,示意图如下:

    六、地图数据物品属性表



    ID
    价值
    名称
    检测半径(像素)
    移动速度(像素)




    0
    500
    金子
    32
    4


    1
    150
    金子
    24
    12


    2
    50
    金子
    16
    20


    3
    15
    石头
    24
    12


    4
    5
    石头
    16
    20


    5
    600
    钻石
    16
    20



    地图物品数据
    目前只制作了3张地图。
    第一关地图,过关金钱数量:700



    ID
    横坐标
    纵坐标




    0
    50
    110


    1
    100
    270


    2
    200
    370


    1
    380
    370


    2
    480
    340


    0
    550
    150


    3
    190
    190


    4
    390
    260


    5
    120
    380



    第二关,过关金钱数量:1000



    ID
    横坐标
    纵坐标




    1
    50
    110


    4
    100
    270


    2
    200
    370


    3
    380
    370


    4
    480
    340


    5
    450
    400


    0
    550
    150


    1
    190
    190


    2
    390
    260



    第三关,过关金钱数量:2000



    ID
    横坐标
    纵坐标




    4
    50
    110


    1
    100
    270


    0
    200
    370


    0
    380
    370


    3
    480
    340


    4
    550
    150


    2
    190
    190


    4
    390
    260


    5
    460
    300



    游戏截图

    4 评论 129 下载 2018-10-04 21:41:13 下载需要16点积分
  • 基于python的自动续借图书集


    Python 2.7
    IDE Pycharm 5.0.3
    Firefox浏览器:47.0.1

    目的自动实现图书馆借书籍的书单截图,并一键续约全部书籍,我登录校图书馆的目的无非就这两个咯,我才不去预约没有的书呢—反正没有一次预约成功过0.0
    实现方法Selenium+PhantonJS自动化脚本执行
    实现方案
    采用Firefox浏览器进行模拟登录,这个比较酷炫把,可以看着浏览器自己在那边跑,欢快的停不下来。。。
    调用PhantomJS.exe,不展现浏览器的运作,直接在cmd窗口跑(用pyinstaller打包成exe后有cmd窗)

    方案实现过程采用Selenium+Firefox方式:
    先来个最后成品动图:

    然后来程序代码—主模块(被调用模块,也可单独执行)
    # -*- coding: utf-8 -*-from selenium import webdriverimport time#shift-tab多行缩进(左)print 'please wait...system loading...'#reload(sys)PostUrl = "http://lib.hrbeu.edu.cn/#"driver=webdriver.Firefox()#用浏览器实现访问#driver = webdriver.PhantomJS(executable_path="phantomjs.exe")#没用浏览器driver.get(PostUrl)elem_user = driver.find_element_by_name('number')elem_psw = driver.find_element_by_name('passwd')#选择我的图书馆,点击后才能看到输入账号密码click_first = driver.find_element_by_xpath("//ul[@id='imgmenu']/li[4]")click_first.click()elem_user.send_keys('S315080092')elem_psw.send_keys('xxxxxxxxx')#点击登录click_second = driver.find_element_by_name('submit')click_second.click()print 'log in...'time.sleep(1)#定位新页面元素,将handle重定位即可driver.switch_to_window(driver.window_handles[1])#定位弹出的第一个页面,也就是当前页面#sreach_window = driver.current_window_handle #此行代码用来定位当前页面#不可行driver.find_element_by_xpath("/html/body/div[4]/div/div/ul/li[3]/a").click()driver.save_screenshot('image_booklist_firefox.jpg')print 'turning to the mylib...'time.sleep(1)#搜索结果页面停留片刻#driver.switch_to_window(driver.window_handles[1])#没有跳出新窗口就是在同一页面的!for i in range(2,30):#这里限定是29本书,一般我们都不会借那么多书的 try: #driver.find_element_by_xpath("/html/body/div[4]/div/div[2]/table/tbody/%s/td[8]/div/input"%('tr[%s]'%i)).click()#下面的比较好理解 driver.find_element_by_xpath("/html/body/div[4]/div/div[2]/table/tbody/tr[%s]/td[8]/div/input"%i).click() print 'renewing...the %d\'th book renewed '%(i-1) except: print '%d books have been renewed !'%(i-2) a=i-2 time.sleep(4) driver.save_screenshot('image_done_firefox.jpg') print 'the picture is saving...' print 'done!' breaktime.sleep(1)driver.close()driver.quit()
    调用上述模块的主执行函数(其实就是为了封装上述模块而已,封装成gui界面,为后续的打包做准备)
    # -*- coding: utf-8 -*-from Tkinter import *import tkMessageBox#执行gui窗import timedef check_renew(): print 'checking and renewing...' tkMessageBox.showinfo('提示','即将开启装逼模式,请确认已安装Firefox浏览器') #time.sleep(4) import Selenium_PhantomJS_lib_firefox tkMessageBox.showinfo('提示','已执行成功!\n(截图已保存于程序目录)')#主框架部分root = Tk()root.title('图书馆查询续约(哈尔滨工程大学专版))label=Label(root,text=' 图书馆一键查询与续约Firefox版本 (✪ω✪) ')button_check=Button(root,text='查询书单并续期━Σ(゚Д゚|||)━开启Firefox有形装逼模式 ',background='green',command=check_renew)label.pack()button_check.pack()root.mainloop()
    实现效果如图所示:

    程序中的注释相信可以把程序解释的差不多了把。。。。
    遇到问题和解决方案
    selenium对新页面元素无法定位抛出NoSuchElementException: Message: Unable to locate element
    错误,导致无法进行对新的界面进行点击操作。
    解决方案:专门写了一篇博客,请见
    解决Selenium弹出新页面无法定位元素问题(Unable to locate element)

    对打包后的版本无法运行,抛出如图错误Errno 10054

    解决方案:暂未找到解决方案,exe文件不可用,程序执行可用

    对未知书籍数目重复点击操作,代码冗余
    解决方案:因为点击续借按钮的元素每个都不一样,通过观察可知其中的规律,之后就知道在那进行修改,但是,光修改的话,十本书就有十个相似的代码串,很不pythontic,所以,采用格式化字符串的方式进行for循环带入,方便又漂亮!

    使用了1中的解决方案还是不能定位元素
    可能查找元素的方式出现错误,我现在的使用方法是采用xpath的方式来找,比如说这样
    driver.find_element_by_xpath("/html/body/div[4]/div/div/ul/li[3]/a")虽然看起来有点长,但是元素相当好找,而且定位很准,如果采用类似这种driver.find_element_by_xpath("//ul[@id='imgmenu']/li[4]"),我现在还不能很好地驾驭,出错可能性有点大,下次要多进行尝试。
    接下来实现方案二的构思:调用PhantomJS.exe,不展现浏览器的运作,直接在cmd窗口跑(用pyinstaller打包成exe后有cmd窗)
    方案实现过程1. 效果
    2. 代码
    被调模块(可单独执行)

    # -*- coding: utf-8 -*-from selenium import webdriverimport timeimport sysfrom PIL import Image#shift-tab多行缩进(左)print 'please wait...system loading...'reload(sys)PostUrl = "http://lib.hrbeu.edu.cn/#"driver = webdriver.PhantomJS(executable_path="phantomjs.exe")#没用浏览器driver.get(PostUrl)elem_user = driver.find_element_by_name('number')elem_psw = driver.find_element_by_name('passwd')#选择我的图书馆,点击后才能看到输入账号密码click_first = driver.find_element_by_xpath("//ul[@id='imgmenu']/li[4]")click_first.click()elem_user.send_keys('S315080092')elem_psw.send_keys('xxxxxxxx')#点击登录click_second = driver.find_element_by_name('submit')click_second.click()print 'log in...'time.sleep(1)#定位新页面元素,将handle重定位即可driver.switch_to_window(driver.window_handles[1])#定位弹出的第一个页面,也就是当前页面driver.find_element_by_xpath("/html/body/div[4]/div/div/ul/li[3]/a").click()driver.save_screenshot('image_booklist.jpg')print 'turning to the mylib...'time.sleep(1)#搜索结果页面停留片刻#driver.switch_to_window(driver.window_handles[1])#没有跳出新窗口就是在同一页面的!for i in range(2,30):#这里限定是29本书,一般我们都不会借那么多书的 try: driver.find_element_by_xpath("/html/body/div[4]/div/div[2]/table/tbody/%s/td[8]/div/input"%('tr[%s]'%i)).click() print 'renewing...the %d\'th book renewed '%(i-1) except: print '%d books have been renewed !'%(i-2) a=i-2 time.sleep(4) driver.save_screenshot('image_done.jpg') print 'the picture is opening...please wait...' breaktime.sleep(2)driver.close()driver.quit()def show_img(): im_check=Image.open('image_booklist.jpg') im_check.show() im_done =Image.open('image_done.jpg') im_done.show()

    然后是程序入口

    # -*- coding: utf-8 -*-from Tkinter import *import tkMessageBoxdef check_renew(): print 'checking and renewing...' tkMessageBox.showinfo('提示','执行速度取决于网速和电脑,能等着就按"确定"\n(请允许phantomjs.exe访问网络)\nBTW 你现在按啥都不好使,程序照样执行(*゜Д゜)σ凸') from Selenium_PhantomJS_lib import show_img show_img()#show一下预约前和预约后截图,好确认 tkMessageBox.showinfo('提示','已执行成功!\n(若没有弹出图片则请自行打开程序目录)')#主框架部分root = Tk()root.title('图书馆查询续约(哈尔滨工程大学专版)--by 哈士奇说喵')label=Label(root,text=' 图书馆一键查询与续约cmd版本 (✪ω✪) ')button_check=Button(root,text='查询书单并续期━Σ(゚Д゚|||)━开启cmd无形装逼模式 ',background='green',command=check_renew)label.pack()button_check.pack()root.mainloop()

    之后启动的画面应该是这样的



    最后完成的画面应该是这样的,截图,确认框,cmd窗口,一个都不少;


    原理和上面并没有什么区别,只是调用了一个phantomjs.exe文件而已,实际上的处理都是这个exe在进行处理的,所以,在进行打包的时候,打包出来的exe需要和此文件在一个文件夹下才可以,就像这样

    遇到问题和解决方案
    找不到执行文件,phantomjs.exe
    解决方案:把phantomjs.exe添加到工作路径下,最方便的方法就是,你的工程在哪,直接添加到工程文件夹下就可以了

    截图的图片没有显示出来,或者提示”在禁用UAC时无法激活此应用“
    解决方案:图片有没有显示,可以看有没有调用show方法,如果调用了,那在自己电脑测试肯定是没有问题的,我在测试别的电脑的时候遇到UAC问题,直接启用就可以了,一般没有问题的,如果不想麻烦启动,那就直接去工作文件夹下手动打开看,截图已保存在本地的工作路径下的。
    最后这个程序是可以打包在别的电脑进行运行的,不过账号和密码我都直接输在程序里面了,而且也只是我自己学校的专版,主要还是自己用,如果有哈尔滨工程大学的小伙伴想用,你只要自己改个账号密码参数就可以了,前提是你有完整的python开发环境。
    2 评论 7 下载 2019-05-03 20:28:37 下载需要11点积分
显示 0 到 15 ,共 15 条
eject