acts-as-func 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []