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 +7 -0
- data/lib/fileupload.rb +114 -0
- data/lib/func.rb +103 -0
- data/lib/pager.rb +64 -0
- data/lib/pay_gateway.rb +47 -0
- data/lib/vcode.rb +46 -0
- metadata +48 -0
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}'><上一页</a>" : "<span class='#{@spagedis}'><上一页</span>"
|
16
|
+
xyiye = currentpage<pagecount ? "<a class='#{@xpageclass}' href='#{route}#{currentpage+1}'>下一页></a>" : "<span class='#{@xpagedis}'><下一页</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
|
data/lib/pay_gateway.rb
ADDED
@@ -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: []
|