组保留的标签 余下为需要删除的标签
unset($oldtag[$key]);
}
}
}
if (!empty($oldtag)) {
$tagids = array();
foreach ($oldtag as $tagid => $tagname) {
$tagids[] = $tagid;
}
well_oldtag_delete($tagids, $tid);
}
$r = well_tag_process($tid, $fid, $create_tag, $tagarr);
return $r;
}
// 删除标签和绑定的主题
function well_oldtag_delete($tagids, $tid)
{
$pagesize = count($tagids);
$arrlist = well_tag_find_by_tagids($tagids, 1, $pagesize);
$delete_tagids = array(); // 删除
$tagids = array();
$n = 0;
foreach ($arrlist as $val) {
++$n;
if (1 == $val['count']) {
// 只有一个主题
$delete_tagids[] = $val['tagid'];
} else {
$tagids[] = $val['tagid'];
}
}
!empty($delete_tagids) and well_tag_delete($delete_tagids);
$arlist = well_tag_thread_find_by_tid($tid, 1, $n);
if ($arlist) {
$ids = array();
foreach ($arlist as $val) $ids[] = $val['id'];
well_tag_thread_delete($ids);
}
!empty($tagids) and well_tag_update($tagids, array('count-' => 1));
}
// 标签数据处理 $arr=新提交的数组 $tagarr=保留的旧标签
function well_tag_process($tid, $fid, $new_tags = array(), $tagarr = array())
{
if (empty($tid)) return '';
// 新标签处理入库
if ($new_tags) {
$threadarr = array();
$tagids = array();
$i = 0;
$size = 5;
$n = count($tagarr);
$n = $n > $size ? $size : $size - $n;
foreach ($new_tags as $name) {
++$i;
$name = trim($name);
$name = stripslashes($name);
$name = strip_tags($name);
$name = str_replace(array(' ', '#', "@", "$", "%", "^", '&', '·', '<', '>', ';', '`', '~', '!', '¥', '……', ';', '?', '?', '-', '—', '_', '=', '+', '.', '{', '}', '|', ':', ':', '、', '/', '。', '[', ']', '【', '】', '‘', ' ', ' ', ' ', ' ', ' '), '', $name);
$name = htmlspecialchars($name, ENT_QUOTES);
if ($name && $i <= $n) {
// 查询标签
$read = well_tag_read_name($name);
if ($read) {
// 存在 count+1
$tagids[] = $read['tagid'];
} else {
// 入库
$arr = array('name' => $name, 'count' => 1);
$tagid = well_tag_create($arr);
FALSE === $tagid and message(-1, lang('create_failed'));
$read = array('tagid' => $tagid, 'name' => $name);
}
$tag_thread = array('tagid' => $read['tagid'], 'tid' => $tid);
$threadarr[] = $tag_thread;
$tagarr[$read['tagid']] = $read['name'];
}
}
!empty($threadarr) and tag_thread_big_insert($threadarr);
!empty($tagids) and well_tag_update($tagids, array('count+' => 1));
}
$json = empty($tagarr) ? '' : xn_json_encode($tagarr);
return $json;
}
?>
一款灵活优秀的开源工单系统-阿南达文事网
一款灵活优秀的开源工单系统
编程日记10
更新时间:2025-05-26 09:20:12 一款灵活优秀的开源工单系统
简介
本系统是集工单统计、任务钩子、权限管理、灵活配置流程与模版等等于一身的开源工单系统,当然也可以称之为工作流引擎。致力于减少跨部门之间的沟通,自动任务的执行,提升工作效率与工作质量,减少不必要的工作量与人为出错率。
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
功能介绍
工单系统相关功能:
- 工单提交申请
- 工单统计
- 多维度工单列表,包括(我创建的、我相关的、我待办的、所有工单)
- 自定义流程
- 自定义模版
- 任务钩子
- 任务管理
- 催办
- 转交
- 手动结单
- 加签
- 多维度处理人,包括(个人,变量(创建者、创建者负责人))
- 排他网关,即根据条件判断进行工单跳转
- 并行网关,即多个节点同时进行审批处理
- 通知提醒(目前仅支持邮件)
- 流程分类管理
权限管理相关功能,使用casbin实现接口权限控制:
- 用户、角色、岗位的增删查改,批量删除,多条件搜索
- 角色、岗位数据导出Excel
- 重置用户密码
- 维护个人信息,上传管理头像,修改当前账户密码
- 部门的增删查改
- 菜单目录、跳转、按钮及API接口的增删查改
- 登陆日志管理
- 左菜单权限控制
- 页面按钮权限控制
- API接口权限控制
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
脚本部署
以下软件是需要自己部署安装的。根据不同的系统,百度一下方法即可,网上很多方法。
需注意因使用到了json类型的字段,因此MySQL需是5.7以上的版本。
- MySQL > 5.7
- Go >= 1.14
- Redis 新版即可
- node >= v12 (稳定版本)
- npm >= v6.14.8
拉取代码
代码语言:javascript
代码运行次数:0运行
复制
git clone .git
或者
代码语言:javascript
代码运行次数:0运行
复制
git clone .git
进入项目目录
代码语言:javascript
代码运行次数:0运行
复制
cd ferry
执行部署脚本
代码语言:javascript
代码运行次数:0运行
复制
./build.sh install
按照脚本提示的要求,进行输入。
需要注意的一点是,MySQL和Redis配置信息修改的时候,不要关闭 ./build.sh 的脚本程序,直接去修改脚本提供的配置文件路径即可。
修改完后,进入下一步即可。
启动服务
代码语言:javascript
代码运行次数:0运行
复制
cd build
./ferry server -c=config/settings.yml
访问脚本最开始让你输入的地址,测试一下能否访问到。
界面预览
主页
权限
创建流程
催办
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-03-23,如有侵权请联系 cloudcommunity@tencent 删除权限系统开源管理脚本
本文发布于:2025-05-25,感谢您对本站的认可!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:一款灵活优秀的开源工单系统
发布评论