- Android混淆(Proguard)详解
JuliusL
目录:1、混淆的作用及好处2、混淆的原理3、混淆的具体使用---3.1、混淆的基本语法---3.2、去除日志信息4、更详细的语法及demo1、混淆的作用及好处混淆属于整个应用程序开发生命周期偏后期阶段的技术了,所以要考虑应用的安全性及性能的问题,混淆就是为了这种需求产生的一种技术,简单说,混淆就是将关键字和关键类名,修改为无意义的字符以起到迷惑试图反编译去查看源码的人。在一定程度上能过滤掉起码95
- Android混淆-基本混淆模板+自定义混淆类NotProguard
MonkeyLei
proguard-rules.pro-第三方就增加了一个glide+rxjava+retrofit,别的按需添加即可#AddprojectspecificProGuardruleshere.#Youcancontrolthesetofappliedconfigurationfilesusingthe#proguardFilessettinginbuild.gradle.##Formoredetai
- Android混淆那些事
就酱
android混淆
前言作为一个Android开发,大家或多或少都有一些关于混淆的了解(毕竟披个纱布也比裸奔要好的多吧)。混淆的概念虽然容易理解,但相信大多数开发可能还是在网上搜索通用配置后通过C-V大法接入到自己的项目中,这也使得混淆配置比较混乱,缺乏针对性。来吧,让我们看看怎么才能穿好这件衣服!!混淆的必要性Java是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性。但不同于一般的编译语言或解释
- 自定义Android混淆规则--proguard-rules.pro(转载)
hudafei
#指定代码的压缩级别-optimizationpasses5#包名不混合大小写-dontusemixedcaseclassnames#不忽略非公共的库类-dontskipnonpubliclibraryclasses#优化/不优化输入的类文件-dontoptimize#预校验-dontpreverify#混淆时是否记录日志-verbose#混淆时所采用的算法-optimizations!code/
- Android 混淆相关
珊珊宝贝Catherine
Android混淆原则反射用到的类不混淆JNI方法不混淆AndroidMainfest中的类不混淆,四大组件和Application的子类和Framework层下所有的类默认不会进行混淆Parcelable的子类和Creator静态成员变量不混淆,否则会产生android.os.BadParcelableException异常使用GSON、fastjson等框架时,所写的JSON对象类不混淆,否则
- Android混淆
liu_12345_liu
androidandroid混淆
文章目录代码混淆资源压缩ProGuard的作用混淆的基本规则参考:代码混淆Android中配置代码混淆,需要在gradle中配置minifyEnabled为true,然后再混淆的配置文件中加入我们的混淆规则就可以,minifyEnabled开启后会进行代码压缩,混淆,优化android{...buildTypes{release{minifyEnabledtrueproguardFilesgetD
- 最全面的Android混淆
YBZha
基础知识
1、日常开发Debug包时不用混淆,正式发布Release包前开启代码混淆;2、混淆好处①→类、方法、变量名变成短且无意义的名字,提高反编译后代码的阅读成本;3、混淆好处②→删除无用的类、方法与属性,缩减了APK包的大小;4、混淆好处③→对字节码进行优化,移除无用指令,应用运行更快;5、怎么混淆→主项目的build.gradle设置minifyEnabledtrue,proguard-rules.
- 史上最全Android混淆模版【含海外广告SDK】
博艺
android安全
#AddprojectspecificProGuardruleshere.#Bydefault,theflagsinthisfileareappendedtoflagsspecified#inE:\developSoftware\Android\SDK/tools/proguard/proguard-android.txt#Youcanedittheincludepathandorderbycha
- Android混淆代码后崩溃日志中不显示行号解决办法
黄德志
在混淆规则文件(proguard-rules.pro)中添加以下代码就能解决:#forkeeplinenumber#将.class信息中的类名重新定义为"UnknownFile"字符串,可以随便写-renamesourcefileattributeUnknownFile#保留源文件名为"UnknownFile"字符串,而非原始的类名,并保留行号-keepattributesSourceFile,L
- flutter Android混淆
野外问
Flutterflutterandroidjava
1在android/app目录下新建文件,名为proguard-rules.pro。文件内容如下:-keepclassio.flutter.app.**{*;}-keepclassio.flutter.plugin.**{*;}-keepclassio.flutter.util.**{*;}-keepclassio.flutter.view.**{*;}-keepclassio.flutter.*
- 丧心病狂的Android混淆文件生成器
迷途小码农h
直接上效果!混淆前;混淆后;使用获取混淆文件自己生成规则使用intellijidea打开proguard-creater工程编辑Main.java根据提示填写相应参数运行即可使用已有规则前往proguard-file下载对应的文件即可Android工程配置开启混淆buildTypes{release{minifyEnabledtrueproguardFilesgetDefaultProguardF
- Android混淆你了解多少?,想跳槽涨薪的必看
m0_64604178
程序员面试移动开发android
它是一个包含代码文件压缩、优化、混淆和校验等功能的工具它能够检测并删除无用的类、变量、方法和属性它能够优化字节码并删除未使用的指令它能够将类、变量和方法的名字重命名为无意义的名称从而达到混淆效果最后,它还会校验处理后的代码,主要针对Java6及以上版本和JavaME资源压缩Android中,编译器为我们提供了另外一项强大的功能:资源的压缩。资源压缩能够帮助我们移除项目及依赖仓库中未使用到的资源,有
- Android开发:请你吃一顿史上最全的Android混淆大餐,kotlin开发app
m0_64319333
程序员面试android移动开发
Stringname=String.format(“img_%1d”,angle+1);res=getResources().getIdentifier(name,“drawable”,getPackageName());这时,我可以开启资源的严格审查模式,只会保留确定已使用的资源。移除备用资源Gradle资源压缩器只会移除未被应用引用的资源,这意味着它不会移除用于不同设备配置的备用资源。必要时,
- Android 混淆使用及其字典混淆(Proguard)
&岁月不待人&
Android开发android
1.使用背景ProGuard能够通过压缩、优化、混淆、预检等操作,检测并删除未使用的类,字段,方法和属性,分析和优化字节码,使用简短无意义的名称来重命名类,字段和方法。从而使代码更小、更高效、更难进行逆向工程。Android代码混淆,又称Android混淆,是一种AndroidAPP保护技术,用于保护APP不被破解和逆向分析。所以在大部分的项目里,基本都会把混淆打开。Tips:如果开启了混淆,Pr
- Android混淆
Liuuuuuuzi
混淆配置android{buildTypes{release{buildConfigField"boolean","LOG_DEBUG","false"//不显示logminifyEnabledtrueshrinkResourcestrueproguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
- Android代码混淆是什么
mcy_zq
android
本文主要是介绍Android混淆是什么,有什么需要注意的地方,便于初学者较好的了解什么是“混淆”与使用时的注意事项。1.由于Android项目是基于java语言的,而java属于高层抽象语言,易于反编译,其编译后的程序包包含了大量的源代码变量、函数名、数据结构等信息,根据其编译打包后的APK文件,可以非常容易的得到近乎源代码质量的反编译代码。如果不加混淆,相当于直接将源代码拱手送人,内容严密的ap
- Android 工程 混淆打包模板
风雨同舟jk
android
这篇博文不介绍混淆说明和规则,只存一份目前网络上公共混淆模板。混淆简介和简单规则请参考博文Android混淆简介,这篇博文里面也提供了另外一篇ProGuard最全混淆规则说明。直接上混淆模板:直接复制到项目中app下的proguard-rules.pro文件中###############################################基本指令区域(没什么别的需求不需要动)####
- Android kotlin高阶函数与Java lambda表达式介绍与实战
蜗牛、Z
kotlin语法androidandroidjavakotlin
一、介绍目前在JavaJDK版本的不断升高,新的表达式已开始出现,但是在Android混淆开发中,kotlin的语言与Java的语言是紧密贴合的。所以Javalambda表达式在kotlin中以新的身份出现:高阶函数与lambda表达式特别类似。接下来我讲会先讲Java的lambda,再介绍kotlin的高阶函数。二、Javalambda表达式介绍与实战2.1lambda的表达式格式介绍1.不需要
- JavaMail 混淆规则
yuGodddddd
JavaMailForAndroid混淆规则-dontwarnjava.awt.**-dontwarnjavax.activation.**-dontwarnjava.beans.**-keepclassjavamail.**{*;}-keepclassjavax.mail.**{*;}-keepclassjavax.activation.**{*;}-keepclasscom.sun.mail.
- 使用友盟组件,android混淆后程序报错解决方案
小洋人最happy
android应用友盟混淆
这几天在对程序进行混淆处理测试时,在程序中使用了友盟组件的地方会报错,比如自动更新,报错异常如:java.lang.RuntimeException:UnabletostartactivityComponentInfo{com.example/com.umeng.update.UpdateDialogActivity}:java.lang.IllegalArgumentException:ResC
- android混淆
胖胖O蓝胖子
proguard:Proguard是一个集文件压缩,优化,混淆和校验等功能的工具它检测并删除无用的类,变量,方法和属性它优化字节码并删除无用的指令.它通过将类名,变量名和方法名重命名为无意义的名称实现混淆效果.最后它还校验处理后的代码只要在工程应用目录的gradle文件中设置minifyEnabled:true即可。然后我们就可以到proguard-rules.pro文件中加入我们的混淆规则了
- ProGuard 进阶系列(一): 运行源代码
罗昭成-csdn
androidandroidstudiojavagradleide
在前面的文章深入Android混淆实践:ProGuard通关秘籍和深入Android混淆实践:多模块打包爬坑之旅中,已经讲到了如何在Android中使用ProGuard,以及如何自定义实现混淆规则的生成。为了更深入地理解ProGuard的细节,本系列文章从我感兴趣的点出发,记录在阅读ProGuard源码过程中的思考与启发,希望对你也有所帮助。本文为此系列文章的开篇,将最基础的讲起,使用ProGua
- ProGuard 最全混淆规则说明
中v中
说明:本文参考(翻译)自AndroidSDK根目录下的proguard目录下的说明文档,是其中的一篇。,文中除了翻译外加了一些作者的实际验证。文章对Android混淆规则做一个解释说明。作者才疏学浅,如有错误,请谅解!Android混淆入门可参考《Android代码混淆零基础入门》imageInput/OutputOptions输入输出选项-includefilename递归引入目录的配置文件-b
- Android混淆:了解一下代码混淆
嘤嘤嘤999
简介作为Android开发者,如果你不想开源你的应用,那么在应用发布前,就需要对代码进行混淆处理,从而让我们代码即使被反编译,也难以阅读。混淆概念虽然容易,但很多初学者也只是网上搜一些成型的混淆规则粘贴进自己项目,并没有对混淆有个深入的理解。本篇文章的目的就是让一个初学者在看完后,能在不进行任何帮助的情况下,独立写出适合自己代码的混淆规则。说在前面这里我们直接用AndroidStudio来说明如何
- 打包,编译和混淆
普通的程序员
先了解一个apk是如何打包的AndroidAAPT详解https://www.jianshu.com/p/8d691b6bf8b4混淆就看这三个Android混淆查缺补漏https://mp.weixin.qq.com/s/g7AxmLHvJTX-JyGqs4SaHg写给Android开发者的混淆使用手册https://www.jianshu.com/p/158aa484da13我自己的混淆笔记h
- android混淆
黎院根
#压缩质量0~7-optimizationpasses5#不采用大小写命名的混淆-dontusemixedcaseclassnames#不跳过类库例的非公共类-dontskipnonpubliclibraryclasses#混淆时是否记录日志(混淆后生产映射文件map类名->转化后类名的映射-verbose#不跳过类库中的非公共方法-dontskipnonpubliclibraryclassmem
- 保险一账通前端技术周报(第十八期)
掌雄
本期导读:本期为大家带来原创文章:AndroidUI架构浅析、Android混淆规则、WebVR开发教程——交互事件、H5多媒体实践,语言基础专题:彻底理解AndroidBinder通信架构、关于Object.assign的性能问题,工具框架推荐大家阅读ReactJS底层揭秘、AndroidProguard(混淆),文末是cannon.js物理引擎的WebVR例子,欢迎赏鉴。原创专题1)Andro
- Android混淆详解
taoyyyy
1.混淆的作用利用Proguard或者R8工具,对代码进行重命名,并删掉没有被引用的类、字段或者方法。对无用资源进行删除。2.混淆的用法2.1如何开启混淆android{buildTypes{release{minifyEnabledtrueshrinkResourcestrueproguardFilesgetDefaultProguardFile('proguard-android.txt'),
- Android混淆的配置
simit
打开混淆:release{//打开混淆minifyEnabledtrue//打开资源压缩shrinkResourcestrue//不显示logbuildConfigField"boolean","LOG_DEBUG","true"proguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'}}在ap
- android混淆规则配置记录
月塘路
title:android混淆记录date:2018-10-2218:45:08tags:混淆最近为了增加自己app的反编译难道,也为了减少压缩包体积,所以配置了混淆规则,这里坑还是蛮多的。大体上我是参考这篇博客:https://www.jianshu.com/p/b5b2a5dfaaf4并且直接复制了他的模板,对于而外的内容在这里记录对实体类(bean类)避免混淆-dontwarncom.exa
- Spring的注解积累
yijiesuifeng
spring注解
用注解来向Spring容器注册Bean。
需要在applicationContext.xml中注册:
<context:component-scan base-package=”pagkage1[,pagkage2,…,pagkageN]”/>。
如:在base-package指明一个包
<context:component-sc
- 传感器
百合不是茶
android传感器
android传感器的作用主要就是来获取数据,根据得到的数据来触发某种事件
下面就以重力传感器为例;
1,在onCreate中获得传感器服务
private SensorManager sm;// 获得系统的服务
private Sensor sensor;// 创建传感器实例
@Override
protected void
- [光磁与探测]金吕玉衣的意义
comsci
这是一个古代人的秘密:现在告诉大家
信不信由你们:
穿上金律玉衣的人,如果处于灵魂出窍的状态,可以飞到宇宙中去看星星
这就是为什么古代
- 精简的反序打印某个数
沐刃青蛟
打印
以前看到一些让求反序打印某个数的程序。
比如:输入123,输出321。
记得以前是告诉你是几位数的,当时就抓耳挠腮,完全没有思路。
似乎最后是用到%和/方法解决的。
而今突然想到一个简短的方法,就可以实现任意位数的反序打印(但是如果是首位数或者尾位数为0时就没有打印出来了)
代码如下:
long num, num1=0;
- PHP:6种方法获取文件的扩展名
IT独行者
PHP扩展名
PHP:6种方法获取文件的扩展名
1、字符串查找和截取的方法
1
$extension
=
substr
(
strrchr
(
$file
,
'.'
), 1);
2、字符串查找和截取的方法二
1
$extension
=
substr
- 面试111
文强chu
面试
1事务隔离级别有那些 ,事务特性是什么(问到一次)
2 spring aop 如何管理事务的,如何实现的。动态代理如何实现,jdk怎么实现动态代理的,ioc是怎么实现的,spring是单例还是多例,有那些初始化bean的方式,各有什么区别(经常问)
3 struts默认提供了那些拦截器 (一次)
4 过滤器和拦截器的区别 (频率也挺高)
5 final,finally final
- XML的四种解析方式
小桔子
domjdomdom4jsax
在平时工作中,难免会遇到把 XML 作为数据存储格式。面对目前种类繁多的解决方案,哪个最适合我们呢?在这篇文章中,我对这四种主流方案做一个不完全评测,仅仅针对遍历 XML 这块来测试,因为遍历 XML 是工作中使用最多的(至少我认为)。 预 备 测试环境: AMD 毒龙1.4G OC 1.5G、256M DDR333、Windows2000 Server
- wordpress中常见的操作
aichenglong
中文注册wordpress移除菜单
1 wordpress中使用中文名注册解决办法
1)使用插件
2)修改wp源代码
进入到wp-include/formatting.php文件中找到
function sanitize_user( $username, $strict = false
- 小飞飞学管理-1
alafqq
管理
项目管理的下午题,其实就在提出问题(挑刺),分析问题,解决问题。
今天我随意看下10年上半年的第一题。主要就是项目经理的提拨和培养。
结合我自己经历写下心得
对于公司选拔和培养项目经理的制度有什么毛病呢?
1,公司考察,选拔项目经理,只关注技术能力,而很少或没有关注管理方面的经验,能力。
2,公司对项目经理缺乏必要的项目管理知识和技能方面的培训。
3,公司对项目经理的工作缺乏进行指
- IO输入输出部分探讨
百合不是茶
IO
//文件处理 在处理文件输入输出时要引入java.IO这个包;
/*
1,运用File类对文件目录和属性进行操作
2,理解流,理解输入输出流的概念
3,使用字节/符流对文件进行读/写操作
4,了解标准的I/O
5,了解对象序列化
*/
//1,运用File类对文件目录和属性进行操作
//在工程中线创建一个text.txt
- getElementById的用法
bijian1013
element
getElementById是通过Id来设置/返回HTML标签的属性及调用其事件与方法。用这个方法基本上可以控制页面所有标签,条件很简单,就是给每个标签分配一个ID号。
返回具有指定ID属性值的第一个对象的一个引用。
语法:
&n
- 励志经典语录
bijian1013
励志人生
经典语录1:
哈佛有一个著名的理论:人的差别在于业余时间,而一个人的命运决定于晚上8点到10点之间。每晚抽出2个小时的时间用来阅读、进修、思考或参加有意的演讲、讨论,你会发现,你的人生正在发生改变,坚持数年之后,成功会向你招手。不要每天抱着QQ/MSN/游戏/电影/肥皂剧……奋斗到12点都舍不得休息,看就看一些励志的影视或者文章,不要当作消遣;学会思考人生,学会感悟人生
- [MongoDB学习笔记三]MongoDB分片
bit1129
mongodb
MongoDB的副本集(Replica Set)一方面解决了数据的备份和数据的可靠性问题,另一方面也提升了数据的读写性能。MongoDB分片(Sharding)则解决了数据的扩容问题,MongoDB作为云计算时代的分布式数据库,大容量数据存储,高效并发的数据存取,自动容错等是MongoDB的关键指标。
本篇介绍MongoDB的切片(Sharding)
1.何时需要分片
&nbs
- 【Spark八十三】BlockManager在Spark中的使用场景
bit1129
manager
1. Broadcast变量的存储,在HttpBroadcast类中可以知道
2. RDD通过CacheManager存储RDD中的数据,CacheManager也是通过BlockManager进行存储的
3. ShuffleMapTask得到的结果数据,是通过FileShuffleBlockManager进行管理的,而FileShuffleBlockManager最终也是使用BlockMan
- yum方式部署zabbix
ronin47
yum方式部署zabbix
安装网络yum库#rpm -ivh http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm 通过yum装mysql和zabbix调用的插件还有agent代理#yum install zabbix-server-mysql zabbix-web-mysql mysql-
- Hibernate4和MySQL5.5自动创建表失败问题解决方法
byalias
J2EEHibernate4
今天初学Hibernate4,了解了使用Hibernate的过程。大体分为4个步骤:
①创建hibernate.cfg.xml文件
②创建持久化对象
③创建*.hbm.xml映射文件
④编写hibernate相应代码
在第四步中,进行了单元测试,测试预期结果是hibernate自动帮助在数据库中创建数据表,结果JUnit单元测试没有问题,在控制台打印了创建数据表的SQL语句,但在数据库中
- Netty源码学习-FrameDecoder
bylijinnan
javanetty
Netty 3.x的user guide里FrameDecoder的例子,有几个疑问:
1.文档说:FrameDecoder calls decode method with an internally maintained cumulative buffer whenever new data is received.
为什么每次有新数据到达时,都会调用decode方法?
2.Dec
- SQL行列转换方法
chicony
行列转换
create table tb(终端名称 varchar(10) , CEI分值 varchar(10) , 终端数量 int)
insert into tb values('三星' , '0-5' , 74)
insert into tb values('三星' , '10-15' , 83)
insert into tb values('苹果' , '0-5' , 93)
- 中文编码测试
ctrain
编码
循环打印转换编码
String[] codes = {
"iso-8859-1",
"utf-8",
"gbk",
"unicode"
};
for (int i = 0; i < codes.length; i++) {
for (int j
- hive 客户端查询报堆内存溢出解决方法
daizj
hive堆内存溢出
hive> select * from t_test where ds=20150323 limit 2;
OK
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
问题原因: hive堆内存默认为256M
这个问题的解决方法为:
修改/us
- 人有多大懒,才有多大闲 (评论『卓有成效的程序员』)
dcj3sjt126com
程序员
卓有成效的程序员给我的震撼很大,程序员作为特殊的群体,有的人可以这么懒, 懒到事情都交给机器去做 ,而有的人又可以那么勤奋,每天都孜孜不倦得做着重复单调的工作。
在看这本书之前,我属于勤奋的人,而看完这本书以后,我要努力变成懒惰的人。
不要在去庞大的开始菜单里面一项一项搜索自己的应用程序,也不要在自己的桌面上放置眼花缭乱的快捷图标
- Eclipse简单有用的配置
dcj3sjt126com
eclipse
1、显示行号 Window -- Prefences -- General -- Editors -- Text Editors -- show line numbers
2、代码提示字符 Window ->Perferences,并依次展开 Java -> Editor -> Content Assist,最下面一栏 auto-Activation
- 在tomcat上面安装solr4.8.0全过程
eksliang
Solrsolr4.0后的版本安装solr4.8.0安装
转载请出自出处:
http://eksliang.iteye.com/blog/2096478
首先solr是一个基于java的web的应用,所以安装solr之前必须先安装JDK和tomcat,我这里就先省略安装tomcat和jdk了
第一步:当然是下载去官网上下载最新的solr版本,下载地址
- Android APP通用型拒绝服务、漏洞分析报告
gg163
漏洞androidAPP分析
点评:记得曾经有段时间很多SRC平台被刷了大量APP本地拒绝服务漏洞,移动安全团队爱内测(ineice.com)发现了一个安卓客户端的通用型拒绝服务漏洞,来看看他们的详细分析吧。
0xr0ot和Xbalien交流所有可能导致应用拒绝服务的异常类型时,发现了一处通用的本地拒绝服务漏洞。该通用型本地拒绝服务可以造成大面积的app拒绝服务。
针对序列化对象而出现的拒绝服务主要
- HoverTree项目已经实现分层
hvt
编程.netWebC#ASP.ENT
HoverTree项目已经初步实现分层,源代码已经上传到 http://hovertree.codeplex.com请到SOURCE CODE查看。在本地用SQL Server 2008 数据库测试成功。数据库和表请参考:http://keleyi.com/a/bjae/ue6stb42.htmHoverTree是一个ASP.NET 开源项目,希望对你学习ASP.NET或者C#语言有帮助,如果你对
- Google Maps API v3: Remove Markers 移除标记
天梯梦
google maps api
Simply do the following:
I. Declare a global variable:
var markersArray = [];
II. Define a function:
function clearOverlays() {
for (var i = 0; i < markersArray.length; i++ )
- jQuery选择器总结
lq38366
jquery选择器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
- 基础数据结构和算法六:Quick sort
sunwinner
AlgorithmQuicksort
Quick sort is probably used more widely than any other. It is popular because it is not difficult to implement, works well for a variety of different kinds of input data, and is substantially faster t
- 如何让Flash不遮挡HTML div元素的技巧_HTML/Xhtml_网页制作
刘星宇
htmlWeb
今天在写一个flash广告代码的时候,因为flash自带的链接,容易被当成弹出广告,所以做了一个div层放到flash上面,这样链接都是a触发的不会被拦截,但发现flash一直处于div层上面,原来flash需要加个参数才可以。
让flash置于DIV层之下的方法,让flash不挡住飘浮层或下拉菜单,让Flash不档住浮动对象或层的关键参数:wmode=opaque。
方法如下:
- Mybatis实用Mapper SQL汇总示例
wdmcygah
sqlmysqlmybatis实用
Mybatis作为一个非常好用的持久层框架,相关资料真的是少得可怜,所幸的是官方文档还算详细。本博文主要列举一些个人感觉比较常用的场景及相应的Mapper SQL写法,希望能够对大家有所帮助。
不少持久层框架对动态SQL的支持不足,在SQL需要动态拼接时非常苦恼,而Mybatis很好地解决了这个问题,算是框架的一大亮点。对于常见的场景,例如:批量插入/更新/删除,模糊查询,多条件查询,联表查询,