acts-as-func 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3f7b2ba2a65928856b5a499662c004f809e5ca92
4
+ data.tar.gz: a0590bd2edf14a571646a8bf0294dd35873ff1cc
5
+ SHA512:
6
+ metadata.gz: 230fc08c03295e2708c8579741a7418bd8817928346fc9893e073ce51fc14ab4234af5d743bc35513e734ce438dd19b1593c5850686e28e6c0ad4361c0897434
7
+ data.tar.gz: 026f35f6a26e4e963df4b5942d94f448152d113253664d39999e6f1b429b0bc008af3c50da23c2b20ac7053a342b52bd3a0ff42d3bc8b8bfd5fd76aeb63df735
data/lib/fileupload.rb ADDED
@@ -0,0 +1,114 @@
1
+ class Fileupload
2
+ #file upload
3
+ #params: file->file stream,filepath->file save path,rule->can upload file format("jpg|xls"),minsize and maxsize->minsize<file's size<maxsize
4
+ #return: {state: true, result: "new filename"} or {state: false, result: "error message"}
5
+ def Fileupload.upload(file, filepath="", rule="jpg|xls", minsize=1, maxsize=4000)
6
+ result = Fileupload.rule_validata(file, rule, minsize, maxsize)
7
+ if result[:state]
8
+ sname = Fileupload.getname(file, filepath)
9
+ begin
10
+ unless Dir::exist?(filepath)
11
+ unless system("mkdir -p #{filepath}")
12
+ return {state: false, result: "目录创建失败,请于管理员联系"}
13
+ end
14
+ end
15
+ File.open(filepath+sname, "wb") do |f|
16
+ f.write(file.read)
17
+ end
18
+ return {state: true, result: sname}
19
+ rescue
20
+ return {state: false, result: "写入文件失败:#{$!}"}
21
+ end
22
+ else
23
+ return {state: false, result: result[:message]}
24
+ end
25
+ end
26
+
27
+ #validate file
28
+ #params:file->file stream,rule->can upload file format,minsize<file's size<maxsize
29
+ #return:{state: true} or return {state: false, message: "error message"}
30
+ def Fileupload.rule_validata(file, rule, minsize, maxsize)
31
+ rule_for = Fileupload.filename_validata(file, rule)
32
+ unless rule_for
33
+ return {state: false, message: "错误:文件格式不对,只允许上传#{rule}格式!\\n"}
34
+ end
35
+ if file.size<minsize*1024 || file.size>maxsize*1024
36
+ return {state: false, message: "错误:文件大小错误,只允许#{minsize}kb~#{maxsize}kb!\\n"}
37
+ end
38
+ return {state: true}
39
+ end
40
+
41
+ #validate file format
42
+ #params: file-> file stream; rule-> validate rule ("jpg|xls")
43
+ #return: validate result -> true | false
44
+ def Fileupload.filename_validata(file, rule)
45
+ !eval("/\.(#{rule})+$/").match(file.original_filename).blank?
46
+ end
47
+
48
+ #get new file's name
49
+ #params:filestream->file stream file name,filepath->file save path
50
+ #return:new file's name
51
+ def Fileupload.getname(filestream, filepath)
52
+ file_for = Fileupload.file_format(filestream.original_filename)
53
+ filename = Time.now.strftime("%Y%m%d%h%m%s")<<rand(99999).to_s<<file_for
54
+ file = filepath+filename
55
+ while File.exist?(file) do
56
+ filename = Time.now.strftime("%Y%m%d%h%m%s")<<rand(99999).to_s<<file_for
57
+ file = filepath+filename
58
+ end
59
+ filename
60
+ end
61
+
62
+ #get file format
63
+ #params: filename->file's name
64
+ #return: file format '.jpg','.exe'
65
+ def Fileupload.file_format(filename)
66
+ /\.[^\.]+$/.match(filename)[0]
67
+ end
68
+
69
+ #image upload
70
+ #params: file->file stream; filepath->file save path; rule->can upload file format("jpg|xls"); minsize and maxsize->minsize<file's size<maxsize; w->new image width, h->new image height
71
+ #return: {state: true, result: "new filename"} or {state: false, result: "error message"}
72
+ def Fileupload.imageupload(imgfile, filepath="", rule="jpg|jpeg", minsize=0, maxsize=2000, w=0, h=0)
73
+ result = Fileupload.rule_validata(imgfile, rule, minsize, maxsize)
74
+ if result[:state]
75
+ sname = Fileupload.getname(imgfile, filepath)
76
+ begin
77
+ unless Dir::exist?(filepath)
78
+ unless system("mkdir -p #{filepath}")
79
+ return {state: false, result: "目录创建失败,请于管理员联系"}
80
+ end
81
+ end
82
+ File.open(filepath+sname, "wb") do |f|
83
+ f.write(imgfile.read)
84
+ end
85
+ Fileupload.resize(filepath + sname, w, h)
86
+ return {state: true, result: sname}
87
+ rescue
88
+ return {state: false, result: "写入图片失败:#{$!}"}
89
+ end
90
+ else
91
+ return {state: false, result: result[:message]}
92
+ end
93
+ end
94
+
95
+ #delete dir
96
+ #params: dir-> dir path
97
+ #return true or false
98
+ def Fileupload.rmdir(dir)
99
+ system("rm -rf #{dir}")
100
+ end
101
+
102
+ #image resize
103
+ #params: imagepath-> image file path; w-> new image width; h-> new image height
104
+ def Fileupload.resize(imagepath, w, h)
105
+ img = Magick::Image.read(imagepath)[0]
106
+ if w==0 || h==0
107
+ w=img.columns
108
+ h=img.rows
109
+ end
110
+ newimg = img.resize_to_fill(w, h)
111
+ newimg.write(imagepath)
112
+ end
113
+
114
+ end
data/lib/func.rb ADDED
@@ -0,0 +1,103 @@
1
+ class Func
2
+ # 判断是否含有中文
3
+ def self.ischinese(temp)
4
+ (temp=~/[\u4e00-\u9fa5]/).nil? ? false : true
5
+ end
6
+
7
+ # 判断是否只含有中英文,数字和下划线
8
+ def self.iscn_zn_num(temp)
9
+ (temp=~/^[\u4e00-\u9fa5_a-zA-Z0-9]+$/).nil? ? false : true
10
+ end
11
+
12
+ # 格式化时间
13
+ def self.formattime(time)
14
+ time.strftime("%Y-%m-%d %H:%M:%S")
15
+ end
16
+
17
+ # 限制文字长度
18
+ def self.truncate_u(text, length = 30, truncate_string = "...")
19
+ l=0
20
+ char_array=text.unpack("U*")
21
+ char_array.each_with_index do |c, i|
22
+ l = l+ (c<127 ? 0.5 : 1)
23
+ if l>=length
24
+ return char_array[0..i].pack("U*")+(i<char_array.length-1 ? truncate_string : "")
25
+ end
26
+ end
27
+ return text
28
+ end
29
+
30
+ # 金额大写小转换
31
+ def self.uppercase(nums)
32
+ cstr = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"]
33
+ cn_nums1 = ["元", "拾", "佰", "仟", "萬", "拾", "佰", "仟", "億", "拾", "佰", "仟"]
34
+ cn_nums2 = ['分', '角']
35
+ s = ""
36
+ # 整数部分
37
+ array = nums.to_s.split(".")
38
+ p h = array[0].to_s.split(//)
39
+ ai = h.count
40
+ h.each_with_index do |a, j|
41
+ s+=cstr[a.to_i]+cn_nums1[ai-1]
42
+ ai=ai-1
43
+ end
44
+ # 小数部分
45
+ p h1 = array[1].to_s.split(//)
46
+ aj = h1.count
47
+ h1.each_with_index do |o, p|
48
+ s+=cstr[o.to_i]+cn_nums2[aj-1]
49
+ aj=aj-1
50
+ end
51
+ rstr = ""
52
+ rstr=s.gsub("拾零", "拾")
53
+ rstr=rstr.gsub("零拾", "零");
54
+ rstr=rstr.gsub("零佰", "零");
55
+ rstr=rstr.gsub("零仟", "零");
56
+ rstr=rstr.gsub("零萬", "萬");
57
+ for i in 1..6 do
58
+ rstr=rstr.gsub("零零", "零");
59
+ rstr=rstr.gsub("零萬", "零");
60
+ rstr=rstr.gsub("零億", "億");
61
+ rstr=rstr.gsub("零零", "零");
62
+ end
63
+ rstr=rstr.gsub("零角", "零");
64
+ rstr=rstr.gsub("零分", "");
65
+ rstr=rstr.gsub("零元", "");
66
+ end
67
+
68
+ require 'net/http'
69
+ require 'net/https'
70
+ require 'uri'
71
+
72
+ # get请求
73
+ # 参数url:网址,header:请求头json类型如:{'Accept' => 'application/json', 'X-Requested-With' => 'XMLHttpRequest'}
74
+ # 返回response对象,response.code 状态200/304/404;response.body 内容
75
+ def self.get(url, params=nil, header=nil)
76
+ uri = URI.parse(url)
77
+ http = Net::HTTP.new(uri.host, uri.port)
78
+ http.use_ssl = true if uri.scheme == 'https'
79
+ request = Net::HTTP::Get.new(uri.request_uri)
80
+ if !params.blank?
81
+ request.form_data = params
82
+ end
83
+ if !header.nil?
84
+ request.initialize_http_header(header)
85
+ end
86
+ http.request(request)
87
+ end
88
+
89
+ def self.post(url, params=nil, header=nil)
90
+ uri = URI.parse(url)
91
+ http = Net::HTTP.new(uri.host, uri.port)
92
+ http.use_ssl = true if uri.scheme == 'https'
93
+ request = Net::HTTP::Post.new(uri.request_uri)
94
+ if !params.blank?
95
+ request.set_form_data(params)
96
+ end
97
+ if !header.nil?
98
+ request.initialize_http_header(header)
99
+ end
100
+ http.request(request)
101
+ end
102
+
103
+ end
data/lib/pager.rb ADDED
@@ -0,0 +1,64 @@
1
+ class Pager
2
+ def initialize(dqyclass='page-navigator-current PNNW-S',aclass='page-navigator-number PNNW-S',
3
+ spageclass='page-navigator-prev',xpageclass='page-navigator-next',spagedis='page-navigator-prev-disable',
4
+ xpagedis='page-navigator-next-disable',dianclass='page-navigator-dots')
5
+ @dqyclass = dqyclass
6
+ @aclass = aclass
7
+ @spageclass = spageclass
8
+ @xpageclass = xpageclass
9
+ @spagedis = spagedis
10
+ @xpagedis = xpagedis
11
+ @dianclass = dianclass
12
+ end
13
+ def getpage(currentpage, pagecount, route)
14
+ shenglvhao = "<span class='#{@dianclass}'>...</span>"
15
+ syiye = currentpage>1 ? "<a class='#{@spageclass}' href='#{route}#{currentpage-1}'>&lt;上一页</a>" : "<span class='#{@spagedis}'>&lt;上一页</span>"
16
+ xyiye = currentpage<pagecount ? "<a class='#{@xpageclass}' href='#{route}#{currentpage+1}'>下一页&gt;</a>" : "<span class='#{@xpagedis}'>&lt;下一页</span>"
17
+ pages=""
18
+ if currentpage<7 && pagecount>10
19
+ for i in 1..9
20
+ if currentpage==i
21
+ pages += "<span class='#{@dqyclass}'>#{currentpage}</span>"
22
+ else
23
+ pages += "<a class='#{@aclass}' href='#{route}#{i}'>#{i}</a>"
24
+ end
25
+ end
26
+ pages += shenglvhao
27
+ pages += "<a class='#{@aclass}' href='#{route}#{pagecount}'>#{pagecount}</a>"
28
+ elsif currentpage>=7 && currentpage<=pagecount-7
29
+ pages = "<a class='#{@aclass}' href='1'>1</a>"
30
+ pages += shenglvhao
31
+ pages += "<a class='#{@aclass}S' href='#{route}#{currentpage-4}'>#{currentpage-4}</a>"
32
+ pages += "<a class='#{@aclass}' href='#{route}#{currentpage-3}'>#{currentpage-3}</a>"
33
+ pages += "<a class='#{@aclass}' href='#{route}#{currentpage-2}'>#{currentpage-2}</a>"
34
+ pages += "<a class='#{@aclass}' href='#{route}#{currentpage-1}'>#{currentpage-1}</a>"
35
+ pages += "<span class='#{@dqyclass}'>#{currentpage}</span>"
36
+ pages += "<a class='#{@aclass}' href='#{route}#{currentpage+1}'>#{currentpage+1}</a>"
37
+ pages += "<a class='#{@aclass}' href='#{route}#{currentpage+2}'>#{currentpage+2}</a>"
38
+ pages += "<a class='#{@aclass}' href='#{route}#{currentpage+3}'>#{currentpage+3}</a>"
39
+ pages += "<a class='#{@aclass}' href='#{route}#{currentpage+4}'>#{currentpage+4}</a>"
40
+ pages += shenglvhao
41
+ pages += "<a class='#{@aclass}' href='#{route}#{pagecount}'>#{pagecount}</a>"
42
+ elsif currentpage>=7 && currentpage>pagecount-7
43
+ pages = "<a class='#{@aclass}' href='1'>1</a>"
44
+ pages += shenglvhao
45
+ for i in 1..9
46
+ fpage = pagecount-9+i
47
+ if currentpage == fpage
48
+ pages += "<span class='#{@dqyclass}'>#{currentpage}</span>"
49
+ else
50
+ pages += "<a class='#{@aclass}' href='#{route}#{fpage}'>#{fpage}</a>"
51
+ end
52
+ end
53
+ elsif currentpage>0 && pagecount<=10
54
+ for i in 1..10
55
+ if currentpage==i
56
+ pages += "<span class='#{@dqyclass}'>#{currentpage}</span>"
57
+ else
58
+ pages += "<a class='#{@aclass}' href='#{route}#{i}'>#{i}</a>"
59
+ end
60
+ end
61
+ end
62
+ syiye + pages +xyiye
63
+ end
64
+ end
@@ -0,0 +1,47 @@
1
+ #gemfile中加入 gem 'iconv'
2
+ class PayGateway
3
+ require 'net/https'
4
+ require 'uri'
5
+ # 支付接口地址
6
+ URL_UTF8 = "https://pay3.chinabank.com.cn/PayGate?encoding=UTF-8"
7
+ # 图片和css文件地址
8
+ URL = "https://pay3.chinabank.com.cn"
9
+ # 功能:网银在线,网管支付;
10
+ # 参数:
11
+ # v_mid:商户编号
12
+ # key:商户md5密钥
13
+ # v_url:支付成功后跳转的页面
14
+ # remark2:异步订单状态地址
15
+ # v_oid:订单编号
16
+ # v_amount:订单金额
17
+ # v_moneytype:支付货币类型
18
+ def self.pay(v_mid, key, v_url, remark2, v_oid, v_amount, v_moneytype = "CNY")
19
+ v_md5info = Digest::MD5.hexdigest(v_amount.to_s + v_moneytype + v_oid + v_mid + v_url + key).upcase
20
+ response = Func.post(URL_UTF8,{'v_mid'=>v_mid,'v_oid'=>v_oid,'v_amount'=>v_amount,'v_moneytype'=>v_moneytype,'v_url'=>v_url,'v_md5info'=>v_md5info,'remark2'=>remark2})
21
+ html = Iconv.iconv('utf-8', 'gbk', response.body).first
22
+ html.scan(/[href|src]=("[^"]*.[css|js|gif|jpg]")/).each do |h|
23
+ html = html.gsub(h[0],URL+eval(h[0]).gsub('..',''))
24
+ end
25
+ html
26
+ end
27
+
28
+ # 功能:自动验证结果
29
+ # 参数:
30
+ # params参数
31
+ # key商户的md5密钥
32
+ # 返回:如果支付成功返回订单号,否则返回nil
33
+ def self.receive(params,key)
34
+ v_oid = params["v_oid"]
35
+ v_pstatus = params["v_pstatus"]
36
+ v_md5str = params["v_md5str"] #该参数的MD5字符串的顺序为:v_oid,v_pstatus,v_amount,v_moneytype,key
37
+ v_amount = params["v_amount"]
38
+ v_moneytype = params["v_moneytype"]
39
+ # 20(表示支付成功)
40
+ # 30(表示支付失败)
41
+ if v_pstatus=="20" && v_md5str==Digest::MD5.hexdigest(v_oid+v_pstatus+v_amount+v_moneytype+key)
42
+ return params["v_oid"]
43
+ else
44
+ return nil
45
+ end
46
+ end
47
+ end
data/lib/vcode.rb ADDED
@@ -0,0 +1,46 @@
1
+ #首先 gem 'rmagick'
2
+ class Vcode
3
+ #controller
4
+ #def getcode
5
+ # vcode = Vcode.getvcode
6
+ # session[:code]=vcode[:code]
7
+ # send_data vcode[:img], content_type: 'image/jpeg', disposition: 'inline'
8
+ #end
9
+ #view
10
+ # <img src="/getcode">
11
+ #Vcode.getvcode(90,40,24)
12
+ #w宽,h高,fontsize字体大小
13
+ #返回json类型
14
+ def self.getvcode(w=90,h=40,fontsize=24)
15
+ #创建画布
16
+ img = Magick::Image.new(w, h) {
17
+ self.background_color = 'white'
18
+ self.format="JPG"
19
+ }
20
+ text= Magick::Draw.new
21
+ text.pointsize = fontsize
22
+ text.kerning = -1
23
+ text.fill('blue')
24
+ #随机文字
25
+ code=""
26
+ 4.times{code << (97 + rand(26)).chr}
27
+ #设置文字
28
+ text.text(rand(w/2-5),h/2-5+ rand(h/2), code)
29
+ #随机直线
30
+ for i in 1..rand(4)
31
+ text.line(rand(w), rand(h), rand(w), rand(h)) #直线
32
+ end
33
+ text.fill('blue')
34
+ #燥点
35
+ for i in 1..280
36
+ text.point(rand(w), rand(h))
37
+ end
38
+ text.draw(img)
39
+ #模糊
40
+ img = img.sketch(0, 10, 50)
41
+ #扭曲
42
+ img = img.wave(5.5, 50)
43
+ #返回图片数据流
44
+ {img: img.to_blob,code: code}
45
+ end
46
+ end
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: acts-as-func
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - lean
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-06-01 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: vcode,fileupload,pager,func,pay_gateway
14
+ email: 1404126220@qq.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/fileupload.rb
20
+ - lib/func.rb
21
+ - lib/pager.rb
22
+ - lib/pay_gateway.rb
23
+ - lib/vcode.rb
24
+ homepage: http://rubygems.org/gems/acts-as-func
25
+ licenses:
26
+ - acts-as-func
27
+ metadata: {}
28
+ post_install_message:
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubyforge_project:
44
+ rubygems_version: 2.2.2
45
+ signing_key:
46
+ specification_version: 4
47
+ summary: acts-as-func!
48
+ test_files: []