Browse Source

wip:增加资源扣减、敏感词过滤

wangkaiyue 2 years ago
parent
commit
a9e3f9447b

+ 2 - 0
go.mod

@@ -5,7 +5,9 @@ go 1.15
 require (
 require (
 	app.yhyue.com/moapp/jybase v0.0.0-20230405040249-a36a23595798
 	app.yhyue.com/moapp/jybase v0.0.0-20230405040249-a36a23595798
 	app.yhyue.com/moapp/jypkg v0.0.0-20230330033424-b61bb6a4ad7e
 	app.yhyue.com/moapp/jypkg v0.0.0-20230330033424-b61bb6a4ad7e
+	bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.7
 	github.com/gogf/gf/contrib/drivers/mysql/v2 v2.3.3
 	github.com/gogf/gf/contrib/drivers/mysql/v2 v2.3.3
 	github.com/gogf/gf/contrib/nosql/redis/v2 v2.3.3
 	github.com/gogf/gf/contrib/nosql/redis/v2 v2.3.3
 	github.com/gogf/gf/v2 v2.3.1
 	github.com/gogf/gf/v2 v2.3.1
+	github.com/zeromicro/go-zero v1.4.4
 )
 )

+ 5 - 2
internal/controller/chatWs.go

@@ -11,7 +11,10 @@ import (
 // ChatWs 聊天websocket请求
 // ChatWs 聊天websocket请求
 var ChatWs = func(r *ghttp.Request) {
 var ChatWs = func(r *ghttp.Request) {
 	session, _ := model.GetSession(r)
 	session, _ := model.GetSession(r)
-	wsChat := model.NewMessage(gctx.New(), session.AccountId)
+	model.SessionCtx.Init(r, &model.Context{
+		JSession: session,
+	})
+	wsChat := model.NewMessage(gctx.New())
 	// 创建ws链接
 	// 创建ws链接
 	ws, err := r.WebSocket()
 	ws, err := r.WebSocket()
 	if err != nil {
 	if err != nil {
@@ -34,6 +37,6 @@ var ChatWs = func(r *ghttp.Request) {
 			return
 			return
 		}
 		}
 		// 处理ws
 		// 处理ws
-		wsChat.Handle(ws, msg, r.GetClientIp(), r.UserAgent())
+		wsChat.Handle(ws, msg)
 	}
 	}
 }
 }

+ 3 - 3
internal/middleware/resMiddleware.go

@@ -25,9 +25,9 @@ func MiddlewareHandlerResponse(r *ghttp.Request) {
 	r.Middleware.Next()
 	r.Middleware.Next()
 
 
 	// There's custom buffer content, it then exits current handler.
 	// There's custom buffer content, it then exits current handler.
-	//if r.Response.BufferLength() > 0 {
-	//	return
-	//}
+	if r.Response.BufferLength() > 0 {
+		return
+	}
 
 
 	var (
 	var (
 		msg  string
 		msg  string

+ 24 - 7
internal/model/chatHistory.go

@@ -1,6 +1,7 @@
 package model
 package model
 
 
 import (
 import (
+	"context"
 	"fmt"
 	"fmt"
 	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/os/gctx"
 	"github.com/gogf/gf/v2/os/gctx"
@@ -11,12 +12,12 @@ import (
 
 
 var (
 var (
 	ChatHistroy = &cChatHistroy{
 	ChatHistroy = &cChatHistroy{
-		Arr: make([]*SaveMessage, 0, 100),
+		Arr: make([]*ChatRecord, 0, 100),
 	}
 	}
 )
 )
 
 
 type cChatHistroy struct {
 type cChatHistroy struct {
-	Arr []*SaveMessage
+	Arr []*ChatRecord
 }
 }
 
 
 type ResHistory struct {
 type ResHistory struct {
@@ -27,7 +28,7 @@ type ResHistory struct {
 	CreateTime time.Time `json:"create_time" dc:"聊天时间"`
 	CreateTime time.Time `json:"create_time" dc:"聊天时间"`
 }
 }
 
 
-type SaveMessage struct {
+type ChatRecord struct {
 	Content    string `json:"content" dc:"内容"`
 	Content    string `json:"content" dc:"内容"`
 	Type       int    `json:"type" dc:"1:用户提问 2:智能助手回复"`
 	Type       int    `json:"type" dc:"1:用户提问 2:智能助手回复"`
 	Useful     int    `json:"useful" dc:"1:有用 -1:无用 0:暂无评价"`
 	Useful     int    `json:"useful" dc:"1:有用 -1:无用 0:暂无评价"`
@@ -37,12 +38,12 @@ type SaveMessage struct {
 	CreateTime string `json:"create_time" dc:"时间"`
 	CreateTime string `json:"create_time" dc:"时间"`
 }
 }
 
 
-// SaveMessage 保存聊天信息
-func (m *cChatHistroy) SaveMessage(msg *SaveMessage) {
+// CacheSave 保存聊天信息
+func (m *cChatHistroy) CacheSave(msg *ChatRecord) {
 	m.Arr = append(m.Arr, msg)
 	m.Arr = append(m.Arr, msg)
-	if len(m.Arr) > 0 {
+	if len(m.Arr) > 100 {
 		tmp, ctx := m.Arr, gctx.New()
 		tmp, ctx := m.Arr, gctx.New()
-		m.Arr = make([]*SaveMessage, 0, 5)
+		m.Arr = make([]*ChatRecord, 0, 5)
 
 
 		val := gconv.Maps(tmp)
 		val := gconv.Maps(tmp)
 		r, err := g.Model("ai_message_history").Data(val).Insert()
 		r, err := g.Model("ai_message_history").Data(val).Insert()
@@ -60,6 +61,22 @@ func (m *cChatHistroy) SaveMessage(msg *SaveMessage) {
 	}
 	}
 }
 }
 
 
+// Save 保存聊天记录 返回最后一条记录id
+func (m *cChatHistroy) Save(ctx context.Context, msgs ...*ChatRecord) (id int64) {
+	val := gconv.Maps(msgs)
+	r, err := g.Model("ai_message_history").Data(val).Insert()
+	if err != nil {
+		glog.Error(ctx, "插入聊天记录异常,error:%s\ndata:%v", err, val)
+		g.Dump(val)
+	} else {
+		if id, err = r.LastInsertId(); err != nil {
+			glog.Error(ctx, "插入聊天记录异常")
+			g.Dump(val)
+		}
+	}
+	return
+}
+
 // GetMessage 查询聊天信息
 // GetMessage 查询聊天信息
 func (m *cChatHistroy) GetMessage(userId int64, pageNum, pageSize int) (h []ResHistory, err error) {
 func (m *cChatHistroy) GetMessage(userId int64, pageNum, pageSize int) (h []ResHistory, err error) {
 	err = g.Model("ai_message_history").Where("person_id = ?", userId).OrderDesc("create_time").OrderDesc("id").Limit(pageNum, (pageNum+1)*pageSize).Scan(&h)
 	err = g.Model("ai_message_history").Where("person_id = ?", userId).OrderDesc("create_time").OrderDesc("id").Limit(pageNum, (pageNum+1)*pageSize).Scan(&h)

+ 51 - 31
internal/model/ws.go

@@ -1,9 +1,12 @@
 package model
 package model
 
 
 import (
 import (
+	"aiChat/utility"
 	. "app.yhyue.com/moapp/jybase/common"
 	. "app.yhyue.com/moapp/jybase/common"
 	"app.yhyue.com/moapp/jybase/date"
 	"app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jybase/fsw"
 	"context"
 	"context"
+	"fmt"
 	"github.com/gogf/gf/v2/encoding/gjson"
 	"github.com/gogf/gf/v2/encoding/gjson"
 	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/net/ghttp"
 	"github.com/gogf/gf/v2/net/ghttp"
@@ -11,46 +14,63 @@ import (
 	"time"
 	"time"
 )
 )
 
 
-type wsChat struct {
-	Ctx    context.Context
-	UserId int64
+type WsChat struct {
+	Ctx context.Context
 }
 }
 
 
-func NewMessage(ctx context.Context, userId int64) *wsChat {
-	return &wsChat{
-		Ctx:    ctx,
-		UserId: userId,
+func NewMessage(ctx context.Context) *WsChat {
+	return &WsChat{
+		Ctx: ctx,
 	}
 	}
 }
 }
 
 
 // Handle 处理消息
 // Handle 处理消息
-func (m *wsChat) Handle(ws *ghttp.WebSocket, msg []byte, ip, agent string) {
+func (m *WsChat) Handle(ws *ghttp.WebSocket, msg []byte) {
 	defer Catch()
 	defer Catch()
+	jSession := SessionCtx.Get(m.Ctx).JSession
 	req := &QuestionReq{}
 	req := &QuestionReq{}
 	if err := gjson.Unmarshal(msg, req); err != nil {
 	if err := gjson.Unmarshal(msg, req); err != nil {
-		glog.Errorf(m.Ctx, "%d 接收消息Unmarshal出错:%v", m.UserId, err)
-	}
-	ChatHistroy.SaveMessage(&SaveMessage{
-		Content:    req.Prompt,
-		Type:       1,
-		Useful:     0,
-		Refer:      req.Href,
-		PersonId:   m.UserId,
-		CreateTime: time.Now().Format(date.Date_Full_Layout),
-	})
-	reply, from, err := Question.DetailQuestion(m.Ctx, req)
-	if err != nil {
-		g.Log().Error(m.Ctx, err)
-		_ = ws.WriteJSON(g.Map{"error_code": -1, "error_msg": err.Error()})
+		glog.Errorf(m.Ctx, "%d 接收消息Unmarshal出错:%v", jSession.AccountId, err)
 		return
 		return
 	}
 	}
-	ChatHistroy.SaveMessage(&SaveMessage{
-		Content:    req.Prompt,
-		Type:       2,
-		Refer:      req.Href,
-		PersonId:   m.UserId,
-		Item:       from,
-		CreateTime: time.Now().Format(date.Date_Full_Layout),
-	})
-	_ = ws.WriteJSON(g.Map{"error_code": 0, "error_msg": "", "data": reply})
+	// 问题敏感词过滤
+	req.Prompt = fsw.Repl(req.Prompt)
+	reply, errMsg := func() (string, error) {
+		reply, from, err := Question.DetailQuestion(m.Ctx, req)
+		// 回答敏感词过滤
+		reply = fsw.Repl(reply)
+		if err != nil {
+			g.Log().Error(m.Ctx, "问答异常", err)
+			return "", fmt.Errorf("问答异常")
+		}
+
+		// 记录问答
+		id := ChatHistroy.Save(m.Ctx, &ChatRecord{
+			Content:    req.Prompt,
+			Type:       1,
+			Refer:      req.Href,
+			PersonId:   jSession.AccountId,
+			CreateTime: time.Now().Format(date.Date_Full_Layout),
+		}, &ChatRecord{
+			Content:    reply,
+			Type:       2,
+			Refer:      req.Href,
+			PersonId:   jSession.AccountId,
+			Item:       from,
+			CreateTime: time.Now().Format(date.Date_Full_Layout),
+		})
+		if id <= 0 {
+			return "", fmt.Errorf("数据存储异常")
+		}
+
+		if err = utility.ResourcePowerDeduct(m.Ctx, jSession.AccountId, jSession.EntAccountId, fmt.Sprintf("%d", id)); err != nil {
+			return "", fmt.Errorf("扣减异常")
+		}
+		return reply, nil
+	}()
+	if errMsg != nil {
+		_ = ws.WriteJSON(g.Map{"error_code": -1, "error_msg": errMsg.Error(), "data": nil})
+	} else {
+		_ = ws.WriteJSON(g.Map{"error_code": 0, "error_msg": "", "data": reply})
+	}
 }
 }

+ 2 - 5
main.go

@@ -3,16 +3,13 @@ package main
 import (
 import (
 	"aiChat/internal/cmd"
 	"aiChat/internal/cmd"
 	_ "aiChat/utility"
 	_ "aiChat/utility"
+	"app.yhyue.com/moapp/jybase/fsw"
 	_ "github.com/gogf/gf/contrib/drivers/mysql/v2"
 	_ "github.com/gogf/gf/contrib/drivers/mysql/v2"
 	_ "github.com/gogf/gf/contrib/nosql/redis/v2"
 	_ "github.com/gogf/gf/contrib/nosql/redis/v2"
-	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/os/gctx"
 	"github.com/gogf/gf/v2/os/gctx"
-	"regexp"
 )
 )
 
 
 func main() {
 func main() {
-	var regExpSmart = regexp.MustCompile("smart_\\S+_smart")
-	g.Dump(regExpSmart.FindStringSubmatch("啊啥的smart_问你_smart啊啥的"))
-	return
+	fsw.ReadFswDict("./manifest/baidu_fsw.dict")
 	cmd.Main.Run(gctx.New())
 	cmd.Main.Run(gctx.New())
 }
 }

+ 1000 - 0
manifest/baidu_fsw.dict

@@ -0,0 +1,1000 @@
+台独
+tai独
+台du
+taidu
+全能神
+quan能神
+quanneng神
+quannengshen
+全neng神
+全negnshen
+全能shen
+藏du
+藏独
+zang独
+zangdu
+疆独
+jiang独
+疆du
+占中
+zhan中
+占zhong
+zhanzhong
+占领中环
+zhan领中环
+zhanling中环
+zhanlingzhong环
+zhanlingzhonghuan
+占ling中环
+占lingzhong环
+占lingzhonghuan
+占领zhong环
+占领zhonghuan
+占领中huan
+西藏独立
+枪支
+qiang支
+枪zhi
+一党
+多党
+专政
+自慰
+吹萧
+内裤
+底裤
+私处
+变态
+作爱
+鸡巴
+阴茎
+阳具
+开苞
+肛门
+阴道
+阴蒂
+荡妇
+阴囊
+干你
+干她
+干他
+手淫
+口淫
+阴户
+阴门
+下体
+龟头
+阴毛
+你妈逼
+大鸡巴
+红智
+法轮
+法论
+法沦
+法伦
+发轮
+发论
+发沦
+发伦
+轮功
+轮公
+轮攻
+沦功
+沦公
+沦攻
+论攻
+论功
+论公
+伦攻
+伦公
+民运
+新疆独立
+一黨
+多黨
+專政
+自慰
+吹蕭
+底褲
+私處
+變態
+造愛
+性愛
+做愛
+雞巴
+陰莖
+陽具
+開苞
+肛門
+陰道
+陰蒂
+蕩婦
+陰囊
+幹你
+幹他
+陰戶
+陰門
+下體
+龜頭
+陰毛
+你媽逼
+大雞巴
+大紀元
+紅志
+紅智
+法輪
+法論
+法淪
+法倫
+發輪
+發論
+發淪
+輪功
+輪公
+輪攻
+淪功
+淪公
+淪攻
+論攻
+論功
+論公
+倫攻
+倫功
+倫公
+民運
+台獨
+臺灣獨立
+藏獨
+西藏獨立
+疆獨
+新疆獨立
+專制
+賣淫
+八九
+八老
+巴赫
+白立朴
+白梦
+保钓
+鲍戈
+鲍彤
+暴乱
+暴政
+北大三角地论坛
+北韩
+北京当局
+北京之春
+北美自由论坛
+持不同政见
+赤匪
+赤化
+春夏自由论坛
+达赖
+大参考
+大纪元新闻网
+大纪园
+大家论坛
+大史
+大史记
+大史纪
+大中国论坛
+大中华论坛
+大众真人真事
+两岸三地论坛
+两个中国
+台盟
+台湾狗
+台湾建国运动组织
+台湾青年独立联盟
+台湾政论区
+台湾自由联盟
+太子党
+中国复兴论坛
+中国孤儿院
+中国论坛
+中国社会进步党
+中国社会论坛
+中国威胁论
+中国问题论坛
+中国真实内容
+中国之春
+中国猪
+中华大地
+中华大众
+中华讲清
+中华人民实话实说
+中华人民正邪
+中华时事
+中华养生益智功
+中华真实报道
+钟山风雨论坛
+自焚
+自民党
+自已的故事
+自由民主论坛
+253507912
+28315551
+308071906
+317474453
+326276498
+39864274
+507、6308
+70210989
+77手枪价格
+77手枪销售
+77手枪子弹电话qq
+77手枪子弹订购qq
+77手枪子弹供应qq
+77手枪子弹提供qq
+77手槍出售
+77手槍价格
+77手槍買賣銷售
+77手槍销售
+77手槍专卖
+77手槍子彈電話qq
+77手槍子彈訂購qq
+77手槍子彈供應
+77手槍子彈供應qq
+77手槍子彈提供qq
+78158909
+788.Lcn.cc
+799886.cn
+80w.sov.tw
+80色区
+81军刺专卖
+81軍刺专卖
+8558.wtianx.com
+865110933
+865110933.qzone.qq.com
+86864387
+876ok.com
+8818野战旅弓弩
+8898.52113.com
+891084598
+8996819
+909983805
+91taiji
+91UP快学堂
+920121460
+92woool2
+92猎枪買賣銷售
+92式9mm枪提供
+92式9mm手枪销售
+92式出售
+92式军用手枪出售
+92式军用手枪模型出售
+92式手枪出售
+92式手槍出售
+92式销售QQ
+92手qiang出售
+92手qiang价格
+92手qiang子弹出售
+92手qiang子弹电话
+92手qiang子弹电话qq
+92手qiang子弹订购
+92手qiang子弹订购qq
+92手qiang子弹供应
+92手qiang子弹供应qq
+92手qiang子弹提供
+92手qiang子弹提供qq
+92手qiang子弹销售
+92手qiang子彈出售
+92手qiang子彈電話
+92手qiang子彈電話qq
+92手qiang子彈訂購
+92手qiang子彈訂購qq
+92手qiang子彈供應
+92手qiang子彈供應qq
+92手qiang子彈提供
+92手qiang子彈提供qq
+92手qiang子彈銷售
+92手狗出售
+92手狗买卖
+92手枪出售
+92手枪价格
+92手枪销售
+92手枪子弹出售
+92手枪子弹电话
+92手枪子弹电话qq
+92手枪子弹订购
+92手枪子弹订购qq
+92手枪子弹供应
+92手枪子弹供应qq
+92手枪子弹提供
+92手枪子弹提供qq
+92手枪子弹销售
+92手枪子彈供应
+92手枪子彈供應
+92手槍出售
+92手槍价格
+92手槍買賣銷售
+92手槍销售
+92手槍专卖
+92手槍子弹訂購
+92手槍子彈出售
+92手槍子彈電話
+92手槍子彈電話qq
+92手槍子彈訂購
+92手槍子彈訂購qq
+92手槍子彈供應
+92手槍子彈供應qq
+92手槍子彈提供
+92手槍子彈提供qq
+92手槍子彈銷售
+93手狗买卖
+9533567644
+953538158
+95步枪子弹供应
+95步枪子彈供应
+95步枪子彈供應
+97614475
+97juhui.com
+97步枪子弹供应
+97步枪子彈供应
+97步枪子彈供應
+98148.com
+986824012
+99wed.com
+99结婚网
+a-level.hk
+a-levelbbs.com
+A4U人体艺术
+aa.cyxiu.com
+aaaljz
+ad.cyxiu.com
+ah.huatu.com
+ah930.com
+ahgwykw.com
+ahhome.com
+ahhqw.com
+ahons.cn
+ahyanjing.com
+ahzscom
+aibabaw
+aijms.com
+aixiaoshuow
+AK-47刺刀专卖
+AK-47军刀出售
+AKABEAR阿卡贝尔
+anhui.htexam.com
+anhuilala.cn
+anhuitc.com
+ASP甩棍专卖
+ATOM弹制造
+AV狼
+AV女优影片
+AV文檔
+av资源
+A片基地
+baixing.com
+bbs.0551.com
+bbs.6tie.com
+bbs.ahw.cc
+bbs.anhuinews.com
+bbs.hqdoor.com
+bbs.wulinlu.net
+bbs.zps.cc
+bjtuku
+blog.sina.com.cn/u/3265089003
+boqii
+BOTOX
+BUCK夜鹰平刃专卖
+BUCK夜鷹平刃专卖
+buliuming.com
+C4的制作方法
+C4塑胶炸药
+C4炸药的成分
+C4制作完全手册
+CBH
+CFX气枪出售
+CFX气枪销售
+chenming
+chinagop.com
+chinasqzx.cn
+ck108
+cndanbaifen
+CO2-A1000出货
+CO2-A1000到货
+CO2-A1000电话
+CO2-A1000订购
+CS狗出售
+cxxfcy.com
+D9军刺军刀
+daliniu.com
+dapao.cc
+df168.cn
+dinobicyle
+diyitouzhu
+DIY核弹
+DIY原子弹
+doubanhui
+dwz.cn/6MVJG
+e乐姿脱毛术
+E夜情
+e夜情俱乐部
+fangtoo.com
+fapiao大量供应
+fapiao销售
+fcw012.cn
+fei-news
+fenke.in
+FFX氣槍出售
+FFX氣槍銷售
+FlexiSPY代码
+FlexiSPY代碼
+FlexiSPY改良版
+FlexiSPY免费版
+FlexiSPY免费试用
+FlexiSPY免費版
+FlexiSPY免費試用
+FlexiSPY破解版
+Flexispy破解版
+FlexiSpy下载
+FlexiSPY源代码
+FlexiSPY源代碼
+FlexiSPY增強版
+FlexiSPY增强版
+FlexiSPY专业版
+FlexiSPY專業版
+FlexiSPY最新版
+focus.cn
+fsjml.com
+FX气皇出售
+FX气皇专卖
+geimysun
+goo.gl/Em62c6
+GO易尚网
+guancheng4s.com
+hefei.baixing.com
+hefei77
+hefeipk.com
+hefeitc.com
+hefeixz.cn
+hefeizsyy
+hefeizuche8.com
+hellohf.com
+hf.comcv.cn
+hf.ganji.com
+hf517
+hfbinhu
+hfchenming
+hffc365.com
+hffcxx.com
+hfgogo
+hfhqw.com
+hfkszs.com
+hftogo
+hfwangluo
+hfxxw.net
+hhyy.sov.tw
+high粉出货
+high粉到货
+high粉订购
+high粉配方
+high粉送货上门
+high粉销售
+home0551.cn
+houseren.com
+hqdoor
+http://blog.sina.com.cn/u/2746702742
+http://cnrdn.com/njY5
+http://ganyinghua.hzrd168.com
+http://www.0592taozai.com
+http://www.bangxuetang.com
+http://www.bluesky12.com
+http://www.chinajiuyutang.com/brand-367-c0.html
+http://www.cnpcdr.net/
+http://www.dxb1.com/ditu0.html
+http://www.fulinmendc.com
+http://www.gbxiehe.com/ygzx/
+http://www.huyikang.com/UpFile/201210/2012100959348813.png
+http://www.igo.cn
+http://www.jiandaov.com/baodian/379.html
+http://www.qyjlzx.com
+http://www.sbjkzx.com/zixun/
+http://www.shanghitv.com/
+http://www.shumeil.com
+http://www.stmingliu.cn/
+http://www.suoyinnet.org
+http://www.typmbl.com
+http://www.waterbaby.asia/
+http://www.zhf100.com
+huatu.com
+hwit.net
+hxs999.com
+IED炸弹制作
+images.55bbs.com
+img2081.poco.cn
+imini
+Inkever(盈克)软件
+jiajinliang@hotmail.com
+jianzhuan8
+jiayouhf
+jmwei.cn
+joycall.cn
+junlongzs.com
+jyclub.info
+jz.35114.cc
+J总病危
+K7娱乐城
+k8祛疤产品
+king粉出货
+king粉到货
+king粉订购
+king粉合成
+king粉配方
+king粉送货上门
+king粉销售
+kitopp
+kkwoool
+KOE理财团队
+ktv52.com
+ktv988.com
+kz.zqgame.com
+K粉qq
+K粉出货
+K粉出售
+k粉出售
+K粉到货
+k粉的价格
+k粉的制作技术方法
+K粉电话
+K粉订购
+K粉合成
+K粉技术转让
+K粉配方
+K粉手枪
+K粉送货上门
+K粉销售
+K粉摇头丸出售
+K粉制作
+k粉制作
+K粉製作
+K粉专卖
+lashou.com
+LB-M4型弹弓弩
+leidoo.com
+lezhi2.111n.com
+lhzhang.cn
+life0551.com
+LINK
+linxu
+liux168
+ljhua.cn
+llcckk.sov.tw
+longxun2car.com
+lpfwang.com
+LQB362qq
+LQB362出货
+LQB362到货
+LQB362电话
+LQB362订购
+LQB362技术
+LQB362图纸
+LQB362制造
+lryf1314.taobao
+M300出售
+M3长刺专卖
+M9-D80军刀专卖
+M9-D80軍刀专卖
+M92F式手槍出售
+M92F式手槍买卖
+M9长刺专卖
+M9军刀专卖
+macao388.com
+meituan.com
+MM视频裸聊
+mnop
+mohci
+MT-虎牙专卖
+newhouse.com.cn
+ohyeee
+ok.hfzone.cc
+oldyouth
+OM瑜伽
+ons22.com
+oo.cd.sd.cn
+oohyee
+ourh2
+p57
+paikebbs.com
+paranoidzhan.uu1001.com
+pba.com
+pcp气枪分解图纸
+PCP气枪专卖网
+PCP新贵出售
+popohefei
+PPK出售
+PPK销售
+qiang支出售
+qiang支弹药购买
+qi狗出售
+qi狗专卖
+qq.cd.sd.cn
+qq.hfzone.cc
+qq出售银行卡
+QQ订购high粉
+QQ订购king粉
+QQ订购K粉
+QQ订购白粉
+QQ订购白牙签
+QQ订购白牙簽
+QQ订购冰毒
+QQ订购冰砖
+QQ订购冰磚
+QQ订购大冰砖
+QQ订购大冰磚
+QQ订购海洛因
+QQ订购胡椒基甲酮
+QQ订购黃牙簽
+QQ订购黄牙签
+QQ订购甲卡西酮
+QQ订购间苯三酚
+QQ订购間苯三酚
+QQ订购氯胺酮
+QQ订购麻古
+QQ订购麻谷
+QQ订购麻黃素
+QQ订购麻黄素
+QQ订购麦角酸
+QQ订购麥角酸
+QQ订购迷魂粉
+QQ订购迷魂水
+QQ订购迷魂药
+QQ订购迷魂藥
+QQ订购奶油冰
+QQ订购鉆石冰
+QQ订购青蒿素
+QQ订购三唑侖
+QQ订购神仙水
+QQ订购神仙糖
+QQ订购小冰砖
+QQ订购小冰磚
+QQ订购盐酸羟亚胺
+qq订购盐酸羟亚胺
+QQ订购鹽酸羥亞胺
+QQ订购搖頭糖
+QQ订购搖頭丸
+QQ订购摇头糖
+QQ订购摇头丸
+QQ订购乙醚
+QQ订购钻石冰
+QQ订购左旋麻黃素
+QQ订购左旋麻黄素
+qq訂購鹽酸羥亞胺
+QQ供应high粉
+QQ供应king粉
+QQ供应K粉
+qq供应K粉
+QQ供应白粉
+QQ供应白牙签
+QQ供应白牙簽
+qq供应冰毒
+QQ供应冰鉆石
+QQ供应冰砖
+QQ供应冰磚
+QQ供应大冰砖
+QQ供应大冰磚
+QQ供应海洛因
+QQ供应胡椒基甲酮
+QQ供应黃牙簽
+QQ供应黄牙签
+QQ供应甲卡西酮
+QQ供应间苯三酚
+QQ供应間苯三酚
+QQ供应氯胺酮
+QQ供应麻古
+QQ供应麻谷
+QQ供应麻黃素
+QQ供应麻黄素
+QQ供应麦角酸
+QQ供应麥角酸
+QQ供应迷魂粉
+QQ供应迷魂水
+QQ供应迷魂药
+QQ供应迷魂藥
+QQ供应奶油冰
+QQ供应青蒿素
+QQ供应三唑侖
+QQ供应神仙水
+QQ供应神仙糖
+QQ供应小冰砖
+QQ供应小冰磚
+QQ供应盐酸羟亚胺
+QQ供应鹽酸羥亞胺
+QQ供应搖頭糖
+QQ供应搖頭丸
+QQ供应摇头糖
+QQ供应摇头丸
+QQ供应乙醚
+QQ供应钻石
+QQ供应钻石冰
+QQ供应左旋麻黃素
+QQ供应左旋麻黄素
+qq供應K粉
+qq供應冰毒
+QQ供應獵槍子彈
+QQ供應手槍子彈
+QQ假币出售
+QQ假钞出售
+qq假身份证办理
+QQ军刀网
+QQ裸聊
+qq裸聊
+QQ买卖冰毒
+qq买卖冰毒
+QQ买卖销售92手qiang
+qq买卖销售92手qiang
+qq买销售虎头猎枪
+qq買銷售虎頭獵槍
+QQ卖45MM狗粮
+qq卖45MM狗粮
+qq卖54式64式
+qq卖64式
+qq卖64式手枪
+qq卖64式手槍
+qq卖64手qiang
+qq卖64手qiang子弹
+qq卖64手qiang子彈
+qq卖64手枪
+qq卖64手枪子弹
+qq卖64手槍
+qq卖64手槍子彈
+qq卖77猎枪
+qq卖77猎槍
+qq卖92式
+qq卖92式手枪
+qq卖92式手槍
+qq卖92手qiang
+qq卖92手qiang子弹
+qq卖92手qiang子彈
+qq卖92手枪
+qq卖92手枪子弹
+qq卖92手槍
+qq卖92手槍子彈
+qq卖CFX气枪
+qq卖PCP新贵
+qq卖PPK
+qq卖步qiang
+qq卖步qiang子弹
+qq卖步槍
+qq卖出售双管猎枪
+qq卖单管猎枪
+qq卖娥眉气枪
+qq卖防身麻醉枪
+qq卖防身武器
+qq卖仿真狙击枪
+qq卖仿真来复枪
+qq卖仿真枪模
+qq卖仿真槍模
+qq卖钢珠狗
+qq卖钢珠猎狗
+qq卖高压狗
+qq卖高压气枪
+qq卖高壓氣槍
+qq卖工字牌汽枪
+qq卖工字牌汽槍
+qq卖工字牌氣槍
+qq卖广州三箭
+qq卖广州三箭气
+qq卖广州三箭气枪
+qq卖廣州三箭氣
+qq卖虎头猎枪
+qq卖虎头双管
+qq卖虎頭獵槍
+qq卖健卫小口径
+qq卖健衛小口徑
+qq卖金钟气枪
+qq卖进口汽狗
+qq卖立式双管猎枪
+qq卖猎枪
+qq卖獵qiang子彈
+qq卖獵槍
+qq卖獵槍麻醉槍
+qq卖獵槍手槍
+qq卖麻醉qiang
+qq卖麻醉枪
+qq卖美国秃鹰
+qq卖铅弹气枪
+qq卖鉛彈氣槍
+qq卖散弹狗
+qq卖散弹枪
+qq卖散弹槍
+QQ卖肾
+qq卖手狗
+qq卖手槍
+qq卖双管平式枪
+qq卖司马系列气狗
+qq卖台湾秃鹰
+qq卖禿鷹汽槍
+qq卖秃鹰汽枪
+qq卖瓦斯手狗
+qq卖袖珍手枪
+qq卖英国骚本气枪
+qq卖子弹
+qq卖自用电狗
+qq卖自製手狗
+qq卖左轮钢珠狗
+qq卖左轮手枪
+QQ賣45MM狗糧
+qq賣54式64式
+qq賣CFX氣槍
+qq賣防身武器
+qq賣仿真槍模
+qq賣高壓氣槍
+qq賣工字牌汽槍
+qq賣廣州三箭氣
+qq賣合成K粉
+qq賣虎頭雙管
+qq賣健衛小口徑
+qq賣金鐘氣槍
+qq賣進口汽狗
+qq賣獵槍
+qq賣鉛彈氣槍
+qq賣熱武器
+qq賣禿鷹汽槍
+qq賣瓦斯手狗
+qq賣左輪手槍
+qq群:287178308
+QQ视频裸聊
+QQ销售54手qiang
+QQ销售64手qiang
+QQ销售77手qiang
+QQ销售92手qiang
+QQ销售high粉
+QQ销售king粉
+QQ销售K粉
+qq销售K粉
+QQ销售白粉
+QQ销售白牙签
+QQ销售白牙簽
+QQ销售冰毒
+QQ销售冰砖
+QQ销售冰磚
+QQ销售冰钻
+QQ销售大冰砖
+QQ销售大冰磚
+QQ销售仿真枪
+QQ销售海洛因
+QQ销售胡椒基甲酮
+QQ销售黃牙簽
+QQ销售黄牙签
+QQ销售甲卡西酮
+QQ销售间苯三酚
+QQ销售間苯三酚
+QQ销售氯胺酮
+QQ销售麻古
+QQ销售麻谷
+QQ销售麻黃素
+QQ销售麻黄素
+QQ销售麦角酸
+QQ销售麥角酸
+QQ销售迷魂粉
+QQ销售迷魂水
+QQ销售迷魂药
+QQ销售迷魂藥
+QQ销售奶油冰
+QQ销售鉆石冰
+QQ销售青蒿素
+QQ销售三唑侖
+QQ销售神仙水
+QQ销售神仙糖
+QQ销售小冰砖
+QQ销售小冰磚
+QQ销售盐酸羟亚胺
+QQ销售鹽酸羥亞胺
+QQ销售搖頭糖
+QQ销售搖頭丸
+QQ销售摇头糖
+QQ销售摇头丸
+QQ销售乙醚
+QQ销售钻石冰
+QQ销售左旋麻黃素
+QQ销售左旋麻黄素
+qq銷售K粉
+QQ小口径手枪专卖
+qq小口径手枪专卖
+qq制作K粉
+qq制作冰毒
+qq製作K粉
+qq製作冰毒
+QQ专卖54手qiang
+QQ专卖64手qiang
+QQ专卖77手qiang
+QQ专卖92手qiang
+QQ专卖小口径步qiang
+qq专卖小口径步qiang
+QQ专卖小口径步枪
+qq专卖小口径步枪
+qq专卖小口径手qiang
+QQ专卖小口径手qiang
+qq专卖小口径手枪
+QQ专卖小口径手枪
+qq专业办假证
+qtwsj.cn
+qvod成人
+qyzyw.com
+qzheng.cn
+ra3811.com
+rbllt
+renchenwen
+resources.baomihua.com
+roombra
+sc.sina.com.cn/health
+SD-98遥控解码器
+secretchina
+sh1985
+shangfang
+shop33803734
+show.hifly.tv
+siminda
+sjjkqc.com
+skyshebei
+SM女王调教
+SN8遥控解码器
+snshf.cn
+soho.work@soho.work.info
+soufun
+spyflexispy软件
+spyflexispy下载
+ssq500w.cn
+ssq789.com
+sy01.net
+sydcch.com
+szxunyu.com
+t.cn
+t56
+tangyikang.net
+thyclub.cn
+tianya.www76xy.com/
+tinyurl.com
+tmall520.com
+tnt出售
+tnt的制作
+TNT配方
+TNT炸弹制作
+TNT炸弹制作方法
+tnt炸药成分
+tnt炸药配方
+TNT炸药制作方法
+TNT制作技术
+TNT制作完全手册
+TOGO网
+toguko
+TOPS钢鹰战斗刀专卖
+TOPS鋼鷹戰鬥刀专卖
+ttnjh
+tulesi
+tv365w.com
+ufotiy
+uoid.me/123456111
+url.cn/C0svWk
+usb电视棒QQ
+USB电视棒QQ
+usb电视棒出售
+usb电视棒电话
+usb电视棒手机
+vikki胶原蛋白
+wencongpan.cn
+win100319
+woderensheng
+woduyu.cn
+woool689
+wujie
+www.0551book.com.cn
+www.0551club.com/
+www.0551hi.com
+www.0551jcw.com
+www.0551spa.com
+www.0551ys.cn
+www.0579579.com
+www.099555.com
+www.100soft.net.cn
+www.10zk.com
+www.19lou.com
+www.1s8s.com
+www.35114.cc
+www.3658168.com
+www.52luoliao.com
+www.58.com
+www.58ggw.com
+www.5i28.cn
+www.64125.cn

+ 11 - 4
manifest/config/config.yaml

@@ -16,16 +16,23 @@ chat:
   appId: "10000"
   appId: "10000"
   usuallyProblem: 5 # 常见问题返回数量
   usuallyProblem: 5 # 常见问题返回数量
   guessQuestion: 5 # 猜你想问返回数量
   guessQuestion: 5 # 猜你想问返回数量
+  resourceCode: "ai_helper" # 资源扣减
   api:
   api:
     addr: "http://49.233.60.39:7880"
     addr: "http://49.233.60.39:7880"
     identity: "剑鱼chat"
     identity: "剑鱼chat"
   businessRpc: "127.0.0.1:5051"
   businessRpc: "127.0.0.1:5051"
 
 
 etcd:
 etcd:
-  hosts:
-    - 192.168.3.149:2379
-  powerCheckCenterKey: "powercheck.rpc" #权益校验中台
-  userCenterKey: "usercenter.rpc" #用户中台rpc
+  powerCheckCenter:
+    hosts:
+      - 192.168.3.149:2379
+    powerCheckCenterKey: "powercheck.rpc" #权益校验中台
+    userCenterKey: "usercenter.rpc" #用户中台rpc
+  # 资源中台配置
+  resourceCenter:
+    key: resource.rpc
+    address:
+      - 192.168.3.206:2379
 
 
 redis:
 redis:
   session:
   session:

+ 19 - 0
resource/aiChat.sql

@@ -20,3 +20,22 @@ CREATE TABLE `ai_question_list` (
     `update_time` datetime DEFAULT NULL,
     `update_time` datetime DEFAULT NULL,
     PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */
     PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci AUTO_INCREMENT=30001 COMMENT='常见问题列表';
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci AUTO_INCREMENT=30001 COMMENT='常见问题列表';
+
+
+CREATE TABLE `ai_question` (
+   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '问题表id',
+   `ai_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT 'actionCode',
+   `question` text CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '问题',
+   `answer` text CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '答案内容',
+   `status` tinyint(4) DEFAULT '1' COMMENT '状态:0:无效 1:有效',
+   `source` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT 'index:网站首页 detail:三级页 workDesk:工作桌面首页 ',
+   `joggle` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT 'rpc业务接口地址',
+   `auto_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '默认url',
+   `isbusiness` tinyint(4) DEFAULT '0' COMMENT '是否业务企图:0:否 1:是',
+   `check_member` int(11) DEFAULT '0' COMMENT '是否校验大会员权限:0:否 1:是',
+   `service_id` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '大会员功能服务id 多个都好拼接',
+   `noperm` text CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '无权限回复',
+   `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+   `update_time` datetime DEFAULT NULL,
+   PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci AUTO_INCREMENT=30001;

+ 14 - 0
utility/elastic.go

@@ -0,0 +1,14 @@
+package utility
+
+type esConf struct {
+	Address string `json:"address"`
+	Size    int    `json:"size"`
+}
+
+func init() {
+	//var EsConf esConf
+	//ctx := gctx.New()
+	//_ = g.Cfg().MustGet(ctx, "elasticsearch", "").Scan(&EsConf)
+	//elastic.InitElasticSize(EsConf.Address, EsConf.Size)
+	//g.Log().Info(ctx, "初始化 elasticsearch", EsConf)
+}

+ 0 - 28
utility/init.go

@@ -1,28 +0,0 @@
-package utility
-
-import (
-	"app.yhyue.com/moapp/jypkg/middleground"
-	"github.com/gogf/gf/v2/frame/g"
-	"github.com/gogf/gf/v2/os/gctx"
-)
-
-var (
-	Middleground *middleground.Middleground
-)
-
-type esConf struct {
-	Address string `json:"address"`
-	Size    int    `json:"size"`
-}
-
-func init() {
-	//var EsConf esConf
-	ctx := gctx.New()
-	//_ = g.Cfg().MustGet(ctx, "elasticsearch", "").Scan(&EsConf)
-	//elastic.InitElasticSize(EsConf.Address, EsConf.Size)
-	//g.Log().Info(ctx, "初始化 elasticsearch", EsConf)
-
-	Middleground = middleground.NewMiddleground(g.Cfg().MustGet(ctx, "etcd.hosts").Strings()).
-		RegPowerCheckCenter(g.Cfg().MustGet(ctx, "etcd.powerCheckCenterKey").String()).
-		RegUserCenter(g.Cfg().MustGet(ctx, "etcd.userCenterKey").String())
-}

+ 58 - 0
utility/resource.go

@@ -0,0 +1,58 @@
+package utility
+
+import (
+	"bp.jydev.jianyu360.cn/BaseService/resourceCenter/rpc/pb"
+	"bp.jydev.jianyu360.cn/BaseService/resourceCenter/rpc/resource"
+	"fmt"
+	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/net/gtrace"
+	"github.com/gogf/gf/v2/os/gctx"
+	"github.com/zeromicro/go-zero/core/discov"
+	"github.com/zeromicro/go-zero/zrpc"
+)
+
+var ResourceCenterRpc resource.Resource
+
+func init() {
+	ctx := gctx.New()
+	ResourceCenterRpc = resource.NewResource(zrpc.MustNewClient(zrpc.RpcClientConf{
+		Etcd: discov.EtcdConf{
+			Key:   g.Cfg().MustGet(ctx, "etcd.resourceCenter.key", nil).String(),
+			Hosts: g.Cfg().MustGet(ctx, "etcd.resourceCenter.address", nil).Strings(),
+		},
+	}))
+}
+
+// ResourcePowerDeduct 资源中心消费
+// accountId 账户id
+// entAccountId 企业账户id
+// funcCode 业务代码
+// deductNum 扣除数量
+// ids 扣除详情id;例如数据导出信息id等数据
+func ResourcePowerDeduct(ctx g.Ctx, accountId, entAccountId int64, id string) error {
+	ctx, span := gtrace.NewSpan(ctx, "ResourcePowerDeduct")
+	defer span.End()
+	res, err := ResourceCenterRpc.Deduction(ctx, &pb.DeductionReq{
+		Appid:        g.Config().MustGet(ctx, "chat.appId").String(),
+		AccountId:    accountId,
+		EntAccountId: entAccountId,
+		FunctionCode: g.Config().MustGet(ctx, "chat.resourceCode").String(),
+		Count:        1,
+		Ids:          []string{id},
+	})
+	if err != nil {
+		return fmt.Errorf("资源异常")
+	}
+	//0:失败 1:成功 -1:不在有效期内 -2:数量不足 -3:没有授权
+	switch res.Status {
+	case 0:
+		return fmt.Errorf("账户 accountId:%d entAccountId:%d 扣除业务失败  聊天记录:%s权限", accountId, entAccountId, id)
+	case -1:
+		return fmt.Errorf("账户 accountId:%d entAccountId:%d 扣除业务权限失败,权限已过期 聊天记录:%s权限", accountId, entAccountId, id)
+	case -2:
+		return fmt.Errorf("账户 accountId:%d entAccountId:%d 扣除业务权限失败,余额不足 聊天记录:%s权限", accountId, entAccountId, id)
+	case -3:
+		return fmt.Errorf("账户 accountId:%d entAccountId:%d 扣除业务权限失败,没有授权 聊天记录:%s权限", accountId, entAccountId, id)
+	}
+	return nil
+}

+ 18 - 0
utility/userCenter.go

@@ -0,0 +1,18 @@
+package utility
+
+import (
+	"app.yhyue.com/moapp/jypkg/middleground"
+	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/os/gctx"
+)
+
+var (
+	Middleground *middleground.Middleground
+)
+
+func init() {
+	ctx := gctx.New()
+	Middleground = middleground.NewMiddleground(g.Cfg().MustGet(ctx, "etcd.powerCheckCenter.hosts").Strings()).
+		RegPowerCheckCenter(g.Cfg().MustGet(ctx, "etcd.powerCheckCenter.powerCheckCenterKey").String()).
+		RegUserCenter(g.Cfg().MustGet(ctx, "etcd.powerCheckCenter.userCenterKey").String())
+}