立即注册 登录
彼岸网 返回首页

天香公主的个人空间 http://www.bian-wang.com/discuz/?10005 [收藏] [复制] [分享] [RSS] txgz999@yahoo.com

日志

从代码修改到插件开发:头像编辑(续)

热度 5已有 522 次阅读2016-10-17 09:57 AM |个人分类:Discuz| 开发

在前文(链接)中我们讨论了基于HTML5的插件来替代Discuz原来的基于Flash的头像编辑功能。和Flash一样,HTML5里的画布(canvas)也能在客户端提供生成头像,以及在裁剪头像界面上按选择框和伸缩度的变化实时变动头像显示的作用。但后来我们发现画布也有个缺陷:动画图片经裁剪保存下来后成了静态图片,也就是说裁剪保存的只是动画图片中的第一幅。详见这里的讨论(链接)。另外画布还带有一定的安全隐患(链接)。所以本文讨论一种替代方案。头像的生成在服务器端完成,而裁剪头像界面则用普通的HTML元素来实现。这种新方法支持动画图片作为头像。

1) 生成头像
Discuz里的图片处理函数并不支持裁剪动画图片,而PHP里常用的GD函数库里的函数也不直接支持裁剪动画图片。所以我们使用了基于GD的函数库 ImageWorkshop (参见 这里 的介绍)。

在Discuz里储存头像是用户中心处理的,那么是不是必须将生成头像的代码加到那去,使之先生成再储存呢?这样做法虽然可行,但改动了Discuz的源代码,这样这个改动就不是一个可以散发的插件了。我们的做法是将生成头像的代码放在插件里。当用户点击提交头像的按钮后,先调用插件提供的PHP代码来生成头像,并将头像数据存在客户端的隐藏元素里,提交给服务器端,这样一来用户中心还是和原来一样储存头像。所以新方法还是插件形式的修改。

2) 头像裁剪界面
用画布来实现裁剪界面非常方便,因为画布提供了在它上面画图的功能。而用HTML元素来实现则费劲些。需要用上四个元素。最底层是用一个image元素来显示头像图片。在它上面是个以灰色为底色的半透明的div元素。在它上面是除边框外全透明的div元素作为选择框。在它上面又是一个image元素,它不透明,它将头像图片作为背景图片来达到只显示头像部分的效果。


这个做法的本身没用到HTML5的任何功能,但一些旧版的浏览器不支持它用到的一些HTML元素的风格设置如半透明。所以和原来的插件一样,在不支持HTML的浏览器里我们将这个插件退化成原来的Flash功能。

插件下载: http://www.bian-wang.com/discuz/data/userupload/10005/txgz_avatar2.zip (12/10/2016更新)

发表评论 评论 (30 个评论)

回复 东风 2016-10-31 04:18 PM
ludi99: 没有啦。其实我这人既爱偷懒又比较笨。觉得你们几个高手好厉害,所以来向你们请教。
大家一起研讨~ 新周快乐
回复 ludi99 2016-10-30 02:31 PM
东风: 我来试着回答你:第一,支持多数据库。第二,具备和第三方系统环境对接的API接口; 这两个在Discuz都没有问题, 北美生活网就是一个主站支持3个站点数据库; 第 ...
我给UCenter数据库话题另开了一篇日志 http://www.bian-wang.com/discuz/home.php?mod=space&uid=10364&do=blog&quickforward=1&id=1535

有空时来给提点建议。
回复 ludi99 2016-10-30 02:26 PM
东风: 向你学习!!
没有啦。其实我这人既爱偷懒又比较笨。觉得你们几个高手好厉害,所以来向你们请教。
回复 东风 2016-10-30 07:30 AM
发现问题所在了,上传的mp3是假的mp3格式,实际是mpeg编码,却用了mp3后缀。需要vlc-player来转码~
回复 东风 2016-10-30 07:24 AM
天香公主: 北美商城用的是品牌空间吗?那你用的三个数据库是不是就是下面这三个?
1)ucenter安装的数据库
2)discuz安装的数据库
3)品牌空间安装的数据库 ...
天香,向你求救来了:http://www.beimeilife.com/home.php?mod=space&uid=1469&do=blog&id=11992&_dsign=082910a7 上传的音乐在IE上可以播放,但是chrome 和firefox就不可以,甚至不能播放了。不知道怎么回事。
回复 东风 2016-10-30 07:19 AM
天香公主: 北美商城用的是品牌空间吗?那你用的三个数据库是不是就是下面这三个?
1)ucenter安装的数据库
2)discuz安装的数据库
3)品牌空间安装的数据库 ...
是的,三个不同的前缀。
回复 东风 2016-10-30 07:17 AM
ludi99: 惭愧惭愧,不幸被卷入到一些争端中。让大家见笑了。

是的,我同意你说的Discuz已经具备了支持多数据库的功能。目前UCenter只能做在一个数据库上,虽然一个UCent ...
向你学习!!
回复 天香公主 2016-10-29 06:58 PM
东风: 我来试着回答你:第一,支持多数据库。第二,具备和第三方系统环境对接的API接口; 这两个在Discuz都没有问题, 北美生活网就是一个主站支持3个站点数据库; 第 ...
北美商城用的是品牌空间吗?那你用的三个数据库是不是就是下面这三个?
1)ucenter安装的数据库
2)discuz安装的数据库
3)品牌空间安装的数据库
回复 ludi99 2016-10-29 03:21 PM
东风: 我来试着回答你:第一,支持多数据库。第二,具备和第三方系统环境对接的API接口; 这两个在Discuz都没有问题, 北美生活网就是一个主站支持3个站点数据库; 第 ...
惭愧惭愧,不幸被卷入到一些争端中。让大家见笑了。

是的,我同意你说的Discuz已经具备了支持多数据库的功能。目前UCenter只能做在一个数据库上,虽然一个UCenter可以支持多个站点,但UCenter只能有一个。我想把UCenter的功能再进一步加以扩展。希望能够做到在一个站点(或多个站点)上支持多个UCenter(每个UCenter可有独自的数据库和库表)。

从架构上来说,我觉得Discuz已经把UCenter和论坛内容剥离开了。也就是把用户管理和用户操作(发表文章)分离开了。估计可行性还是比较大的。
回复 ludi99 2016-10-29 03:08 PM
天香公主:    好象没写过吧?
也许我记错了。或是你在哪篇日志里做过一些说明,我一时也想不起来。

我有权限写日志了,简单地写几个字先挂出来。收集一些资料,慢慢再补充细化。
回复 carry0987 2016-10-28 01:15 PM
天香公主: 似乎明白了问题所在。你的web server要求向它发送的request的header里含有User-Agent,详见https://bugs.php.net/bug.php?id=22937#c64196里最后pollita的话。我 ...
感謝相助!我把這個問題記錄下來
回复 东风 2016-10-27 10:33 PM
ludi99: 不好意思,占用了有关头像编辑的话题空间。

我想象的“一个站点使用多个数据库”的情形比较符合你说的(3),同样的数表,不同的内容。但估计可能要有个master  ...
我来试着回答你:第一,支持多数据库。第二,具备和第三方系统环境对接的API接口; 这两个在Discuz都没有问题, 北美生活网就是一个主站支持3个站点数据库; 第三方“北美商城” --http://www.beimeilife.com/bmmall/与主站共享UCenter一个数据库登陆.但是添加视频认证等限制。

老是看到各种文章里提到“检测”“检测”, 如今如雷贯耳的感觉
回复 天香公主 2016-10-27 08:42 AM
ludi99: 好的。多谢费心!

有空的话亦请帮贴下你以前写的用户登录流程文章的链接,我再复习复习。
   好象没写过吧?
回复 ludi99 2016-10-26 09:34 PM
天香公主: 好像明白你的意思了。你希望用API的方式而不是plugin的方式在UCenter上自由搭建应用。等我有空时单独装个UCenter,尝试和比较下这两种方式的优劣再和你讨论吧 ...
好的。多谢费心!

有空的话亦请帮贴下你以前写的用户登录流程文章的链接,我再复习复习。
回复 天香公主 2016-10-25 11:05 PM
ludi99: 不好意思,占用了有关头像编辑的话题空间。

我想象的“一个站点使用多个数据库”的情形比较符合你说的(3),同样的数表,不同的内容。但估计可能要有个master  ...
好像明白你的意思了。你希望用API的方式而不是plugin的方式在UCenter上自由搭建应用。等我有空时单独装个UCenter,尝试和比较下这两种方式的优劣再和你讨论吧
回复 天香公主 2016-10-25 10:50 PM
carry0987: 嗯...iPhone 5 上用Safari測試結果:上傳失敗
第一版(HTML5)沒問題
似乎明白了问题所在。你的web server要求向它发送的request的header里含有User-Agent,详见https://bugs.php.net/bug.php?id=22937#c64196里最后pollita的话。我刚更新了下载文件。在第一版里我也为此找过个可行的解决办法,但现在的办法更简明。

细节:我用file_get_contents和dfsockopen来得到你服务器上的文件时都遇到了问题。前者的出错信息是"failed to open stream: HTTP request failed!",在我用ini_set添加了user_agent后问题就解决了。后者的出错信息是"curl_setopt(): CURLOPT_FOLLOWLOCATION cannot be activated when an open_basedir is set-/var/www/vhosts/fucknehs.com/httpdocs/source/function/function_filesock.php-43",用ini_get检查得知open_basedir设为/var/www/vhosts/fucknehs.com/:/tmp/。我在第一版里用了 http://slopjong.de/2012/03/31/curl-follow-locations-with-safe_mode-enabled-or-open_basedir-set/ 里的代码,它提供了一种饶过这个问题的办法。
回复 ludi99 2016-10-25 12:55 PM
天香公主: 问候检测兄。恐怕你的两个问题我一个都回答不了。我以前没用过php和mysql,也就是在学习Discuz系统时才接触到。我主要的精力用在了理解Discuz的代码,有时也考虑 ...
不好意思,占用了有关头像编辑的话题空间。

我想象的“一个站点使用多个数据库”的情形比较符合你说的(3),同样的数表,不同的内容。但估计可能要有个master 主数据库,里面需要多一个控制表做为主控。其他的数表都一样。(只是猜测而已)

现有的Discuz架构已经支持把论坛、博客的数据放在不同的数据库里的功能(多论坛共享UCenter)。虽然操作起来还有不少问题,从概念上不妨归类为“已经实现”。这项功能类似于你说的情形(2)。

情形(1)如你所说,属于备份。Discuz已经具备了。

至于解决(3)这个问题的好处在哪里,我一时也说不上非常特别的地方。但总觉得把UCenter限制只能在一个数据库上操作,等于人为地封顶。大体上觉得这个限制没有必要,也应该不难突破。

互联网正在朝虚拟世界的方向发展。如果能把Discuz进化成为一个真正开放的环境,它可以作为搭建基于社交网的互动系统网络内核的不错的选择。而打开UCenter却是必经之路。

打开UCenter,我琢磨着得做两件事。第一,支持多数据库。第二,具备和第三方系统环境对接的API接口。我不大清楚技术上是否可行。先从UCenter的多数据库功能扩展上着手,一步步探讨。

你是专家,这里还有不少关注Discuz的网友。也许你们会有独特的创见。如果真能实现的话,对Discuz环境或许是一项变革性的改进。

如何改进 UCenter我还没有想过具体方法。也许通过新增某种API函数接口,也许做Plugin更有效。听听你们的意见,越简单越好。
回复 天香公主 2016-10-24 08:59 PM
ludi99: 是我,问好!

我对网站技术是个门外汉,想请教一些整体框架上的问题。借个地方先简单说一说,你看合适的话再进一步展开。

据了解,Discuz支持在一个mySQL数据 ...
问候检测兄。恐怕你的两个问题我一个都回答不了。我以前没用过php和mysql,也就是在学习Discuz系统时才接触到。我主要的精力用在了理解Discuz的代码,有时也考虑下代码层面上的功能改进。没考虑过你说的这类问题。

你的第一个问题我好象没全明白,'一个站点使用多个数据库'?那这两个数据库有何不同呢?是下面三种情形中的哪一种,还是都不是:
1)两个数据库有同样的数表结构和数据,在一个数据库里加个record,同时就出现在另一个里,两个同步,一个是另一个的备份?
2)两个数据库有不同的数表,比如一个数据库里有与论坛有关的数表,另一个数据库里有与博客有关的数表?
3)两个数据库有同样的数表但不同的数据,比如一个数据库里有近期的数据,另一个里有之前添加的数据?

关于你的第二个问题,你说'便于在它上面自由地搭建更多的应用','它'指的是Discuz还是UCenter? 如果是指UCenter的话,你是想让UCenter也支持plugin对吧?
回复 ludi99 2016-10-24 01:50 PM
天香公主: 是检测兄吗?欢迎来一起讨论Discuz,并和大家分享你的心得体会。
是我,问好!

我对网站技术是个门外汉,想请教一些整体框架上的问题。借个地方先简单说一说,你看合适的话再进一步展开。

据了解,Discuz支持在一个mySQL数据库里开设多个站点。那么反过来是否可行?也就是说一个站点使用多个数据库。

顺便说下,尝试过两个站点分享同一UCenter,基本上可行(不过删除用户时会出现同步问题)。但我不知道是否能让UCenter架设在多个数据库上。让不同类型的用户有各自的注册入口。(或如增加一个表,作个简单的多数据库的管理环境)

多数据库能提升用户管理的机动性。我记得你写过有关用户登录流程的文献,故想请你对它的可行性做个评估。

另外我在考虑一个更远的问题,开通某种UCenter的标准接口。目地是打开一个通道,把Discuz作为用户管理的内核,便于在它上面自由地搭建更多的应用。虽然Discuz的Plugin界面可以实现外接功能,但是Discuz已经被层层叠叠包装太多层次,设计文档零零碎碎的,腾讯也不及时更新资料。Plugin的约束较多,虽然有后台管理环境支持的好处。但抛开那个环境的话,Plugin反而是个累赘。这个话题比较大,先提一句。以后有机会慢慢再探讨。

先谢过 !
回复 天香公主 2016-10-23 11:14 PM
ludi99: 试试有否回覆的权限。想请教一些有关Discuz的问题。由于权限不够,无法写日志或微博。先且在此问候。
是检测兄吗?欢迎来一起讨论Discuz,并和大家分享你的心得体会。
12下一页

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

小黑屋|Archiver|彼岸网  

Powered by Discuz! X3.1 © 2001-2014 Comsenz Inc.
GMT-4, 2017-2-22 04:14 PM , Processed in 0.062431 second(s), 19 queries.

返回顶部