精华内容
下载资源
问答
  • php学生成绩管理系统,数据库使用MySQL,包括代码和数据库SQL文件,具有学生和教师登录管理功能 数据库SQL文件 /* Navicat Premium Data Transfer Source Server : localhost Source Server Type : ...

    php学生成绩管理系统,数据库使用MySQL,包括源代码和数据库SQL文件,具有学生和教师登录管理功能

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    数据库SQL文件

    /*
     Navicat Premium Data Transfer
    
     Source Server         : localhost
     Source Server Type    : MySQL
     Source Server Version : 50527
     Source Host           : localhost:3306
     Source Schema         : 000000
    
     Target Server Type    : MySQL
     Target Server Version : 50527
     File Encoding         : 65001
    
     Date: 13/10/2019 23:22:41
    */
    
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for files
    -- ----------------------------
    DROP TABLE IF EXISTS `files`;
    CREATE TABLE `files`  (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
      `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
      `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '登录密码',
      `age` int(11) NULL DEFAULT NULL COMMENT '年龄',
      `sex` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别',
      `email` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱',
      `phone` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '电话',
      `hobbys` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '爱好',
      `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址',
      `createtime` datetime NULL DEFAULT NULL COMMENT '创建时间',
      `zzmm` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '政治面貌',
      `content` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '个人简介',
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 124100130 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '学生档案信息' ROW_FORMAT = Compact;
    
    -- ----------------------------
    -- Records of files
    -- ----------------------------
    INSERT INTO `files` VALUES (124100123, '李小龙', '123456', 18, '女', '123456@qq.com', '18314463777', '爬山', '中国北京123号', now(), '少先队员', '认真刻苦22');
    INSERT INTO `files` VALUES (124100124, '王小二', '123456', 19, '男', '789@qq.com', '18314463777', '游泳', '中国北京123号', now(), '少先队员', '踏实能干');
    INSERT INTO `files` VALUES (124100125, '张果果', '123456', 20, '女', '123456@qq.com', '18314463777', '弹钢琴', '中国北京123号', now(), '团员', '油嘴滑舌');
    INSERT INTO `files` VALUES (124100128, '小飞机', '123456', 21, '男', '123456@qq.com', '18314463777', '吹牛', '中国北京123号', now(), '团员', '靠谱');
    INSERT INTO `files` VALUES (124100129, '纸飞机', '123456', 22, '男', '123456@qq.com', '18314463777', '打篮球', '中国北京123号', now(), '党员', '有领导力');
    
    -- ----------------------------
    -- Table structure for student
    -- ----------------------------
    DROP TABLE IF EXISTS `student`;
    CREATE TABLE `student`  (
      `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '成绩ID',
      `coursename` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '课程名称',
      `sid` bigint(20) NULL DEFAULT NULL COMMENT '学号',
      `score` int(255) NULL DEFAULT NULL COMMENT '分数',
      `addtime` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '添加时间',
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '学生成绩' ROW_FORMAT = Compact;
    
    -- ----------------------------
    -- Records of student
    -- ----------------------------
    INSERT INTO `student` VALUES (1, '语文', 124100123, 88, now());
    INSERT INTO `student` VALUES (2, '语文', 124100123, 100, now());
    INSERT INTO `student` VALUES (3, '英语', 124100124, 100, now());
    INSERT INTO `student` VALUES (4, '语文', 124100125, 99, now());
    INSERT INTO `student` VALUES (5, '历史', 124100128, 66, now());
    INSERT INTO `student` VALUES (6, '体育', 124100129, 88, now());
    INSERT INTO `student` VALUES (7, '地理', 124100123, 66, now());
    INSERT INTO `student` VALUES (8, '化学', 124100123, 88,now());
    INSERT INTO `student` VALUES (9, '物理', 124100123, 78, now());
    INSERT INTO `student` VALUES (10, '信息', 124100123, 77, now());
    
    SET FOREIGN_KEY_CHECKS = 1;
    
    

    php文件说明

    addfiles.php 学生档案添加页面
    showfiles.php 显示学生档案列表页面
    index.php 教师登录首页,显示所有学生信息
    login.php 教师登录页面
    loginCheck.php 教师登录验证页面
    filesAction.php 学生档案增加 修改 删除逻辑处理页面
    editfiles.php 学生档案编辑页面
    addstudent.php 学生成绩添加页面
    db.php 数据库连接配置文件
    editStudent.php 学生成绩编辑页面
    footer.php 网页版权区域文件
    studentAction.php 学生成绩添加 修改 删除逻辑处理页面
    studentindex.php 学生登录首页(个人成绩查询)
    studentlogin.php 学生登录页面
    studentloginCheck.php 学生登录验证页面
    student.php 学生成绩列表页面

    数据库字段说明
    files(学生档案信息)
    字段名 类型 默认值 主外键 是否为空 注释
    id bigint(20) null 主键 NO ID
    name varchar(255) null YES 姓名
    password varchar(255) null YES 登录密码
    age int(11) null YES 年龄
    sex varchar(255) null YES 性别
    email varchar(255) null YES 邮箱
    phone varchar(255) null YES 电话
    hobbys varchar(255) null YES 爱好
    address varchar(255) null YES 地址
    createtime datetime null YES 创建时间
    zzmm varchar(255) null YES 政治面貌
    content varchar(255) null YES 个人简介

    student(学生成绩)
    字段名 类型 默认值 主外键 是否为空 注释
    id int(11) null 主键 NO 成绩ID
    coursename varchar(255) null YES 课程名称
    sid bigint(20) null YES 学号
    score int(255) null YES 分数
    addtime varchar(50) null YES 添加时间

    展开全文
  • Jenkins代码审查功能的实现方案

    万次阅读 2017-11-25 17:31:35
    Jenkins实现了代码审查功能

    前段时间试着在Jenkins上实现了代码审查功能,
    本篇博客记录一下具体的实施方案,主要包括Jenkins、Gerrit Trigger、Git Hook等。


    一、目的
    为了减少不必要的编译错误,同时提高代码书写质量,可以在Jenkins上实现了代码审查的功能。
    Jenkins具有该功能后,将自动对Gerrit上提交的代码进行编译及代码检查,并将检测的结果返回到Gerrit上。
    通过这种方式,代码提交人员能够及时地根据反馈结果,对代码进行修改和完善。

    二、Gerrit Trigger
    为了实现代码审查功能,我们首先需要在Jenkins上下载并安装Gerrit Trigger插件,然后进行相应的配置。

    2.1 Gerrit Trigger下载及安装
    SouthEast
    如上图所示,我们只需要点击Jenkins的Manage Jenkins选项,然后点击Manage Plugins选项,
    在新加载的页面中,搜索并选择Gerrit Trigger插件,点击下载及安装即可(进行上述工作前必须具有管理员权限)。
    SouthEast
    Jenkins成功安装Gerrit Trigger插件后,在Manage Jenkins界面中就会出现如上图所示的Gerrit Trigger图标。

    2.2 Gerrit Server配置
    点击Gerrit Trigger图标后,会出现如下图所示的界面:
    SouthEast
    点击Add New Server,就可以创建一个运行在Jenkins服务器上,专门用于监听Gerrit代码提交事件的Gerrit Server。
    SouthEast
    如上图所示,创建Gerrit Server时,我们只需要定义Server的名称,然后点击使用Default Configurations即可。
    完成上述操作,点击OK后,将出现类似如下界面:
    SouthEast
    如图所示,该界面主要配置Gerrit代码服务器的信息,以便Gerrit Server能够与Gerrit代码服务器通信。

    上图比较重要的部分已经用红线标出,其中:
    Hostname和Frontend URL主要填写Grerrit代码服务器的地址;
    SSH Keyfile是本地生成的SSH私钥地址,对应的公钥需要上传到Gerrit代码服务器,注意Username需要与SSH Keyfile一致。

    配置完成后,可以点击Test Connection测试Gerrit Server与Gerrit代码服务器的连通性。

    图中Gerrit Reporting Values主要设置代码审查完毕后,
    Gerrit Server返回给Gerrit代码服务器的值,即审查通过后+1, 不通过-1。

    当整个Gerrit Server配置完毕后,就可以点击Save按键保存。
    此时,将会出现如下界面,其中图片上方就是Grerrit Server的默认配置:
    SouthEast
    我们点击界面下方显示的Edit键时,可以重新对Gerrit Server进行配置;
    点击Remove键时,可以移除此次创建的Gerrit Server;
    如果检查Gerrit Server没有问题后,就可以点击Status下方的红色按键,正式启动Gerrit Server。

    Gerrit Server启动后,对应状态将变为:
    SouthEast

    2.3 Jenkins Item中配置Gerrit Trigger
    Gerrit Server创建成功后,我们就可以在Jenkins中创建Item处理Gerrit Server发送的事件。
    Jenkins中的Item才是执行代码审查工作的主体。

    在Gerrit上创建Item的方式比较简单,主要是在Jenkins的主界面点击New Item,
    然后选择创建Freestyle project即可。
    我们用于审查代码的Item名称为Code_Verify。

    Code_Verify的大部分配置与通常的线上编译Item类似,
    我们仅记录主要的不同之处。

    2.3.1 General部分
    SouthEast
    Code_Verify仅用于验证提交的代码能否编译通过、代码质量是否符合规范,不需要负责发布正式版本,
    因此出于节省内存空间的考虑,在General部分勾选了Discard old builds,丢弃历史编译的结果。
    SouthEast
    此外,为了避免过多地占用Jenkins资源,影响正常项目的发布,我们将Code_Verfiy的编译功能限制在专门为测试提供服务的androidtest节点上。

    2.3.2 Source Code Management部分
    与常规节点的代码管理策略不同,Code_Verify没有选择任何Jenkins支持代码管理工具,
    例如Git、Gerrit Repo等,如下图所示。
    SouthEast
    这里选择这种策略的原因是:
    一般情况下,项目的代码基于Gerrit进行管理。
    使用Jenkins内置的代码管理工具Gerrit Repo时,必须配置项目对应的分支信息。
    即一旦使用Gerrit Repo,那么在Gerrit Trigger触发具体的编译前,分支信息已经被定义好并且无法修改。
    这就要求一个项目对应一个代码检查节点。
    但我们试图用一个节点来监控所有项目的提交,即所有的项目共用一个代码检查的Item。
    因此,每次下载代码时使用的分支,必须能够根据实际的Gerrit提交动态地调整。

    基于以上原因,最终我们放弃使用Jenkins自带的代码管理工具,
    转而选择在编译前通过Shell命令动态下载所需分支的代码。

    2.3.3 Build Triggers部分
    Build Triggers部分的配置是触发代码审查的核心。
    SouthEast
    如上图所示,我们首先选择触发事件的类型为Gerrit event。

    然后,在新加载的界面内配置对应的Gerrit Trigger:
    SouthEast
    如上图所示, 我们在Gerrit Trigger中选择Gerrit Server为前面配置的gerrit。
    这样当gerrit监听到Gerrit代码服务器的通知后,就会触发Code_Verify进行代码检查。

    Trigger on事件目前限定为PatchSet Created、Change Restored和Ref Updated。
    其中,代码初次提交到Gerrit代码服务器时会触发PatchSet Created事件;
    代码从abandon状态恢复时会触发Change Restored事件;
    代码进行amend操作后会触发Ref Updated事件。

    SouthEast
    如上图所示,目前在Dynamic Trigger Configuration中定义project为**, Branch为beta3.0。
    于是, 用户向任何Project的beta3.0分支提交代码时,均会触发代码检查操作过程。

    2.3.4 Build Environment部分
    SouthEast
    最后,我们需要为Code_Verify添加SSH Agent(Jenkins需要提前安装SSH相关的插件)。
    如上图所示,添加一个有效的key值即可。
    需要注意的是:此处使用的key值必须与后文下载代码使用的账户一致。

    至此,Code_Verify的基本配置就介绍完毕了。
    接下来,Code_Verify只需要在检测到Gerrit代码提交时,
    解析其中携带的信息,并下载对应分支的代码,然后进行编译及代码检查即可。

    在介绍后续的内容前,我们先看一下正常情况下,我们下载代码所需要的命令:

    // 此处使用的账户名与Code_Verify中添加的SSH key一致
    repo init -u ssh://android@gerrit.xxxxx.org:29418/xxxx/test_Manifest -b master -m test_project.xml
    
    repo sync

    注意到repo init时,需要指明对应代码仓库的xml名称,如test_project.xml。
    但是Gerrit提交代码时携带的信息中,并不会包含该xml名称。

    为了解决这个问题,我们决定在每次提交代码时,
    将代码对应代码仓库的xml信息写入commit-msg中。

    不过,强制要求代码提交人员来手动写入xml信息,
    显然增加了大家的工作量,同时容易引入不必要的书写错误。
    为了避免这个问题,我们进一步引入了Git Hook机制。

    三、Git Hook
    简单来讲,Git Hook是内置在Git中的由特定动作触发的脚本,
    可以在每次代码提交前、后等各个时机执行一些指定的操作。

    举例来讲,当我们提交代码编辑对应的commit-msg时,仅会编辑commit-msg的正文部分。
    但是如果我们通过git log观察实际生成的commit-msg时,会发现commit-msg中自动添加了其它的信息,如下图所示:
    SouthEast
    其中的Author、Date、Change-Id字段就是Git Hook生成的。

    Git为不同时机定义了多种Git Hook,
    考虑到我们项目各个module的.git/hooks目录下均存在commit-msg Hook,
    且该Hook均有指向根节点.repo/repo/hooks目录下的commit-msg,
    因此我们决定统一修改.repo/repo/hooks中的commit-msg,
    使得每次编辑commit-msg后,Hook能够像添加Change-Id一样,
    自动添加对应project的xml信息。

    commit-msg Hook中基本上混用了Shell及AWK的语法,
    于是我们就以Shell脚本的风格实现了添加xml信息的函数,
    如下所示:

    #在原生的commit-msg hook中新增函数
    add_ManifestXml(){
        # 前面这一部分主要是学习add_ChangeId的写法
        # 主要目的就是判断commit-message有问题时,不添加xml信息
        clean_message=`sed -e '
                /^diff --git .*/{
                    s///
                q
                }
            /^Signed-off-by:/d
            /^#/d
        ' "$MSG" | git stripspace`
        if test -z "$clean_message"
        then
            return
        fi
        # Do not add xml to temp commits
        if echo "$clean_message" | head -1 | grep -q '^\(fixup\|squash\)!'
        then
            return
        fi
    
        # 以下部分就是功能的主体
        # commit-msg Hook运行在每个module的路径下
        # 我们首先获取.repo目录下manifest.xml链接的实际xml
        origin=$(ls -l ../.repo/manifest.xml)
        currentXml="Error.xml"
        if [ "$origin" != "" ]
        then
            tmp=${origin##*/}
        result=$(echo $tmp | grep ".xml")
        if [ "$result" != "" ]
        then
            currentXml=$tmp
            fi
        fi
        echo "currentXml: $currentXml"
    
        # 判断当前的commit-message中是否已经包含了有效的xml信息
        # 这主要处理git commit --amend的情况
        TAG="Manifest-Xml"
        if grep -i "^$TAG: $currentXml" "$MSG" >/dev/null
        then
            return
        fi
    
        # 如果当前的commit-message包含错误的xml信息,那么进行修正
        # 这里主要处理用户进行ln -sf相关的操作
        if grep -i "^Manifest-Xml:" "$MSG" >/dev/null
        then
            sed "s/^Manifest-Xml:.*/Manifest-Xml: $currentXml/g" $MSG > tmp.txt
            mv tmp.txt $MSG
        return
        fi
    
        # 如果当前的commit-message不包含xml信息,则直接添加
        # MSG就是最后生成的commit msg
        echo "Manifest-Xml: $currentXml" >> $MSG
    }
    
    #调用添加manifestXml函数
    add_ManifestXml
    
    #添加change-id的功能也在commit-msg中
    add_ChangeId

    修改commit-msg Hook后,当我们编辑commit-message后,xml信息就会自动添加上。
    对应的效果类似于:
    SouthEast
    从图中可以看出,自动添加了Manifest-Xml相关的信息。

    四、代码下载及编译
    当gerrit监听到代码提交时,会将该提交携带的信息一并传递Code_Verify。
    Code_Verify解析出需要的信息,然后进行代码下载、编译及审查等工作。

    代码下载和编译的工作都放在了Code_Verify的Build部分,主要依靠Shell脚本来完成工作。
    这里我就不过多的用文字进行描述了,直接给出实现脚本和对应的注释:

    #clean old data
    rm -rf /data/jenkins/workspace/Code_Verify/*
    
    #get xml info from commit msg
    #GERRIT_CHANGE_COMMIT_MESSAGE为Gerrit内置的变量,表示Gerrit代码提交时对应的commit-msg
    info=$(echo $(echo $GERRIT_CHANGE_COMMIT_MESSAGE | grep -Eo 'Manifest-Xml: .*.xml'))
    xml=${info##* }
    
    #download data
    #这里根据commit-msg中携带的消息,下载对应xml的代码
    repo init -u ssh://android@gerrit.xxxxx.org:29418/xxxx/test_Manifest -b master -m $xml
    repo sync
    
    #这里GERRIT_PROJECT、GERRIT_CHANGE_NUMBER和GERRIT_PATCHSET_NUMBER均为Gerrit内置的变量
    #指定了project、提交代码对应的的gerrit编号、patchSet应该是值同一个代码提交的次数(git commit --amend后,该值会递增)
    #我们在这里策略是先下载全部代码,然后更新提交对应的代码(即完成覆盖操作)
    repo download $GERRIT_PROJECT $GERRIT_CHANGE_NUMBER/$GERRIT_PATCHSET_NUMBER
    
    #之后就可以执行project相关的具体编译了
    .............

    五、代码检查
    代码编译完毕后,需要对代码规范性进行检查。
    我们的项目是通过在shell里启动task对代码进行审查,
    然后生成Lint.xml、CheckStyle.xml、FindBugs.xml及PMD.xml文件。

    我们在Jenkins的Post-build Actions部分对这些xml进行打包处理,
    然后根据检查的结果决定本次提交是否通过。
    这里写图片描述
    Jenkins内置了对Lint.xml、CheckStyle.xml、FindBugs.xml及PMD.xml文件结果的检查项,
    可以根据结果判定本次编译是否通过。
    如上图所示,我们可以采用最为严格的策略,即检查任务错误,均判定本次提交不通过。

    展开全文
  • 在网上搜“代码混淆”关键词,可以看到n多教程。包括本篇博客,大部分重要...总的来说,代码混淆有两种重要功能。其一,混淆代码。其二,优化代码。 进行代码混淆的程序被称为代码混淆器(混淆工具)。进行代码混淆的意

    在网上搜“代码混淆”关键词,可以看到n多教程。包括本篇博客,大部分重要内容也是从网上各位大神的博客里面看到然后摘取和总结出来的。虽然网上都有,但是对于我个人来说,很难找到一篇博客概括完全的,所以还是总结一下,也算是学习的纪录。


    首先看看代码混淆是什么。

    总的来说,代码混淆有两种重要功能。其一,混淆代码。其二,优化代码。

    进行代码混淆的程序被称为代码混淆器(混淆工具)。进行代码混淆的意义主要在于对代码进行一定程度的加密。那么,混淆器是如何进行代码加密的呢,或者说,混淆过的代码为什么会有加密的效果呢?

    首先说一点我比较坚持的观点“我们写的代码是给人看的,不是给机器看的”。通常,我们写代码的时候,代码都需要有一定的规范,而且变量名、函数名一般要能让人看到就知道是什么功能。所以,当我们不进行混淆的情况下发布了一个apk包,别人就可以通过反编译工具对apk包进行反编译,基本还原我们的源码。这样肯定是对我们不利的。此时就需要用到代码混淆。

    代码混淆的基本方法就是将我们写的易于读懂的代码,等价的替换为难以读懂而逻辑正确的代码,就是说,机器能够运行这段代码,但是一般人读不懂这段代码。这样,别人反编译了我们的apk包,得到的混淆后的代码看起来基本就是一堆杂乱无章、无法阅读的代码。

    代码混淆的时候还会进行一些优化,例如删除某些没用被使用到的代码,以及简单的重组代码,减少中间过程。

    比较重要的一点是,代码混淆并不能完全的加密代码,只是提高了程序包被反编译的难度,对代码起到一定的保护作用。

    关于代码混淆的定义,详情可以看这里     代码混淆-百科


    现在了解了代码混淆,就看看如何使用代码混淆吧。

    我自己用来测试的是使用cocos2d-x 3.10创建的工程,其中包括了多平台的工程。测试代码混淆,主要用到了其中的eclipse工程,android-studio工程。(通过这种方式创建的工程在文件结构方面可能和直接使用eclipse或android-studio创建的工程有略微差别,但是影响不大)

    在android 2.3之后,sdk中就已经集成了混淆器proguard(目录在sdk\tools\proguard),所以我们可以很方便的直接在工程中开启代码混淆。


    eclipse  android工程开启混淆功能,我们需要手动在项目文件.properties(我的是project.properties文件)中添加下面的代码

    # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
    proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
    某些方式创建的项目中可能已经有如上两行了,只是默认被注释掉了,只要把proguard.config这一行解注释就好了。这样代码混淆功能就开启了,在打签名包时,项目会自动进行代码混淆。

    对于eclipse工程来说,代码混淆的规则,在 proguard-project.txt 文件中,我们需要根据规则去选择哪些代码需要混淆,哪些代码(一般我们引用的第三发jar包,如果已经被混淆过,就不能再混淆,否则会报错。一般我们对外开放的借口不需要混淆哦)不需要混淆。编写proguard-project.txt文件的规则,后面介绍咯。


    android-studio工程开启混淆功能,我们需要在 app/build.gradle文件中添加如下代码

    buildTypes {
            debug {
                //启用代码混淆
                minifyEnabled false
                //混淆规则配置文件
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                //
                signingConfig signingConfigs.debug
            }
            release {
                //是否优化zip
                zipAlignEnabled true
                // 移除无用的resource文件
                shrinkResources true
                //启用代码混淆
                minifyEnabled true
                //混淆规则配置文件
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                //
                signingConfig signingConfigs.release
            }
        }
    按照上面的配置,在debug模式和release模式下build都会进行代码混淆(一般为了方便调试,在debug模式下不需要进行代码混淆)。混淆规则配置文件与eclipse工程略有不同,android-studio工程的混淆规则文件是 app/proguard-rules.pro 。虽然文件名和eclipse中的不同,但是配置规则都是相同的。

    关于代码混淆规则改如何写,我也不知道,哈哈,找了几篇大神的博客,其中有写到,可以参考一下。

    Android 编程下的代码混淆(感谢博主),其中提到了什么是代码混淆,以及混淆规则的模版文件。

    Android代码混淆(感谢博主),其中包含如何取舍对哪些代码进行混淆,也有一些关于混淆规则文件如何编写的内容。


    看完以上内容,自己动手配置代码混淆应该不是问题。不过我们使用代码混淆的时候可能还有一些坑,例如工程中引用了很多外部的库,导致代码中函数数量超过了65535,混淆的时候可能会出错。此时需要分文件混淆,也就是把所有的代码分成两个部分来进行混淆。这些内容后面补充吧。


    还有一点比较重要的,不止是Java代码可以混淆,理论上来说,任何代码都可以混淆,只要有对应的混淆器。关于如何使用其他混淆器,如何对其他语言的代码进行混淆,以后了解到了再补充。。。


    展开全文
  • 通过之前的博客,基本上已经将各个框架上传文件的功能逻辑理清楚,有文件下载肯定就需要有文件上传,那么接下来会跟大家一起分享各个框架上传文件的功能代码

    一. 前言
      通过之前的博客,基本上已经将各个框架上传文件的功能逻辑理清楚,有文件下载肯定就需要有文件上传,那么接下来会跟大家一起分享各个框架上传文件的功能代码;
      那么,今天我们将重点放在各个框架适用的java文件上传功能代码方面,直接切入主题:

    二. 实例

      1.方法实例1:

    	//upload file,普通java上传文件方式
    	public String uploadFile() throws IOException{
    		
    		//file为获取到的前台的文件,每个框架获取的方式不一样,可按需去查询
    		File file = "前台的文件";
    		
    		//fileName为文件的名称,可通过file获取,不同框架获取的方式不一样
    		String fileName = "文件的名称,包括格式";
    		
    		//获取文件的项目的根路径,不同框架获取的方式不一样,这里使用struts2的获取方式
    		String basePath=ServletActionContext.getServletContext().getRealPath("/upload");
    		
    		//拼接成完整的指定的文件路径名,创建新文件
            String filePath = basePath+File.separator+fileName;
            File filelocal = new File(filePath);
            if(filelocal.exists()){
            	filelocal.delete();
            }
    		
    		//使用输入流读取前台的file文件				
            InputStream is=new FileInputStream(file);  
    		
    		//循环读取输入流文件内容,通过输出流将内容写入新文件
            OutputStream os=new FileOutputStream(filelocal);  
            byte buffer[]=new byte[1024];  
            int cnt=0;  
            while((cnt=is.read(buffer))>0){  
                os.write(buffer, 0, cnt);  
            }  
            //关闭输入输出流
            os.close();
            is.close();  
            
            return null;            
    	}
    

      2.方法实例2,连起来的简单代码工具类:

    
    	//file为上传的文件File,转换为inputstream流	
    	InputStream stream=new FileInputStream(file);
    	//创建本地的临时空文件
    	File fileTem = new File("C:\\img\\tem"+new Date().getTime()+".jpg"); 
    	// 获得上传文件输入流
    	BufferedInputStream in = new BufferedInputStream(stream);
    	// 获得本地文件输出流
    	BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(fileTem));
    	// 将上传文件写到指定的本地文件里
    	org.apache.commons.fileupload.util.Streams.copy(in, out, true);
    
    	//关闭输入输出流
    	in.close();
    	out.close();
    	
    

    三. 总结
      1.使用java普通的上传文件的方式上传文件,主要涉及的两个点就是java对文件的输入输出流(inputStream和outputStream),如果程序员的输入输出流基本功够扎实的话对这些基本上都是得心应手的;

      2.java上传文件的基本逻辑就是:获取前台的file文件》获取文件名(包括格式)》获取指定保存上传文件的根路径》根据根路径和文件名,创建新文件》通过输入流循环读取前台的file文件》通过输出流循环将读取到的file文件写入到创建的新文件》关闭输入输出流;所以,如果了解了上传文件的基本逻辑之后,在解决上传问题的时候就游刃有余了

    上一篇:jfinal框架文件下载功能代码

    下一篇:ssh框架之springmvc文件上传功能代码

    展开全文
  • linux下让irb实现代码自动补全的功能

    千次阅读 2014-10-29 16:22:08
    我不知道其他系统上irb是否有此功能,但是在ubuntu上ruby2.1.2自带的irb默认是没有代码自动补全功能的,这多少让人觉得有所不便.其实加上也很简单,就是在irb里加载一个模块:require 'irb/completion' ,但是我们不可能...
  • 覆盖率验证——代码覆盖率+功能覆盖率

    万次阅读 多人点赞 2020-04-25 14:52:32
    文章目录一、基于覆盖率驱动的验证技术二、代码覆盖率功能覆盖率三、功能覆盖率建模3.1.功能覆盖率模型——covergroup3.2.覆盖点——coverpoint3.3.覆盖点的——bins四、代码code 一、基于覆盖率驱动的验证技术 采用...
  • VIM代码补全提示功能

    万次阅读 2014-09-20 22:04:08
    vim是一款支持插件、功能无比强大的编辑器,无论你的系统是linux、unix、mac还是windows,都能够选择他来编辑文件或是进行工程级别 的coding。如果能把vim用好了,不仅编程效率能得到大幅度提高,周围人也会因此而看...
  • unity脚本用vs打开没有代码提示功能

    千次阅读 2020-01-12 19:23:09
    问题:当我们在unity启动c#脚本时,即使安装了Visual Studio 2010 Tools for Unity,在vs中开启了代码提示功能也无法提示。 解决方法: 1、在unity的Edit-Preferences中选择External Tools,在External Script ...
  • 谈谈XCode代码自动完成Code Sense功能

    千次阅读 2012-05-21 17:22:19
    也许你已经注意到了,有时Xcode会在你键入代码的过程中给出建议,这就是Xcode的代码提示功能,通常叫做代码自动完成功能。编写程序时,Xcode会为所有内容生成索引,包括项目中变量名和方法名,以及导入的框架。它...
  • EA强大功能之生成代码

    千次阅读 热门讨论 2014-07-28 15:25:55
    并且只能给小伙伴们文档和所需部分的接口,避免交流,看文档写代码。我当时心想,这写的应该要多详细啊! 后来听说,EA可以直接生成代码,我心想这就方便多了,不用我手写接口了。直接画图,生成接口,让我们组的...
  • vim代码智能提示功能及相关配置

    万次阅读 2013-04-28 14:59:24
    vim 代码提示功能,让vim可以媲美IDE vim是一款支持插件、功能无比强大的编辑器,无论你的系统是linux、unix、mac还是windows,都能够选择他来编辑文件或是进行工程级别 的coding。如果能把vim用好了,不仅...
  • github和gitee(码云)的免费功能对比,包括仓库总容量、仓库个数、团队协作人数等等等。
  • 即时通讯源代码,im源码功能全套

    千次阅读 2016-06-23 15:59:03
    即时通讯源代码, im源码, im源代码 即时通讯全套源码语言:C/C++ 语言编写,VC++开发平台产品包含完善的即时通讯系统,是一套集即时通讯和视频会议为一体的企业级办公协同交流产品,可以广泛应用于政府、企业、教育...
  • abs 三种功能代码详解 matlab函数

    千次阅读 2020-06-26 11:52:01
    1.abs函数功能     求实数的绝对值、复数的模、字符串的ASCII值 2.基本用法     abs(x)函数是对数组元素进行绝对值处理的函数。       &...
  • 最近一直都在研究powershell 自动化,我属于入门...因为这些代码都是我一个一个敲进去的。powershell 脚本我已经0积分方式放在csdn下载里面了,当然大家希望了解神马功能,也可以和我说说,看下能不能帮大家实现相应的
  • vim 代码提示功能,让vim可以媲美IDE

    万次阅读 2018-05-24 16:38:07
    vim是一款支持插件、功能无比强大的编辑器,无论你的系统是linux、unix、mac还是windows,都能够选择他来编辑文件或是进行工程级别 的coding。如果能把vim用好了,不仅编程效率能得到大幅度提高,周围人也会因此而看...
  • 在该结构中,使用监听器模式实现了一个基础的框架,主要包括以下几个类和接口:1、HTTPThread——实现网络操作的功能类,实现网络的连接2、HTTPListener——网络监听器实现3、LoginForm——登录功能实现结构下载地址:...
  • JS实现打印功能(包括打印预览、打印设置等) 绪 最近在进行项目开发时,需要实现后台管理端打印功能,遂在网上一阵搜索,搜到了很多相关的文章。其中绝大部分文章都是使用的Lodop5.0(Web打印和套打控件)控件,而且...
  • 1、主题 之前我们已经在Getting Started Guide接触了代码拼写提示这一帮助功能,这里我们将详细的介绍它。... 事实上,拼写提示功能在你输入代码的过程中是默认启动的,当然也包括输入点号之后的域成员提示...
  • 功能简单的BBS系统源代码

    千次阅读 2008-03-12 19:20:00
    此系统主要参考尚学堂马士兵视频教程_”MySQL_JDBC_BBS论坛”,功能是实现一简单的BBS系统,,在原版本的基础上,对原版本的代码中做了一些修改,包括一些后门、漏洞做了修改,此系统不涉及多线程、分布式计算。...
  • 代码搜索功能发布,提升开发效率 开发一个项目,配置参数是必不可少的步骤,而项目规模越大需要配置的参数就越多。怎么样?是不是已经开始头疼了?dengdengdeng,开发者的福音来了!今天菌菌要介绍的第一个功能...
  • 历久而新,我的新书《第二行代码》已出版!

    万次阅读 多人点赞 2016-11-23 09:49:08
    《第二行代码》中的内容我相信很多人都会非常感兴趣,因为里面确实加入了很多很新的知识。略粗概括一下的话,新增内容就包括有Android Studio、Gradle、Material Design、运行时权限、多窗口模式、RecyclerView、...
  • 1.Win+X——程序和功能——左侧的启用或关闭功能, 去掉.net 4.6的勾选,点确定,等待完成 2. Win+X——命令提示符(管理员) dism.exe /online /add-package /packagepath:X:\sources\sxs\microsoft-...
  • 点击首页 查看跟过帮助 看图设置, 注意创建工程名要使用英文字母 本人亲测有效,
  • 包括后台的Android美食APP项目开源代码,androidapp 项目简介 小食光定位为一款集美食,社交,LBS服务于一体的美食推荐APP。为你发现周边美食的同时提供一个吃货分享的平台。 APP截图     ...
  • 在Vue项目中利用swagger配置自动生成访问后台WebApi代码功能WebApi后台配置Vue前端配置 最近在做Vue的前端项目,需要配置自动生成访问WebApi的代码,网上并没有找到相关教程,把我最终找到的解决方案放在这里帮助...
  • 在视频直播中,互动是不可缺少、不容小觑的内容,主要包括发送弹幕、打赏、点赞等。...其实,实现直播弹幕功能只需“四个步骤”和“几行代码”! 现在,我们使用云巴 Javascript SDK ,手把手教你实现直播弹幕功能吧!
  • 程序员在做web等项目的时候,往往都需要添加文件上传、下载、删除的功能,有时是单文件,有时多文件批量 操作,而这些功能代码程序员可以自己收藏起来当成工具使用,这样,程序员在进行程序设计的时候就会事半功倍...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,702,588
精华内容 681,035
关键字:

代码的功能包括