mixin.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. import { v4 as uuidv4 } from "uuid";
  2. import { fetchEventSource } from "@microsoft/fetch-event-source";
  3. export const myMixin = {
  4. data() {
  5. return {
  6. userJson: {},
  7. new_url: 'https://appapi.cocorobo.cn',
  8. model: {}
  9. };
  10. },
  11. methods: {
  12. async getServerTime() {
  13. try {
  14. let res = await this.ajax.get(this.$store.state.api + 'getServerTime');
  15. console.log(res)
  16. let time = res.data.time
  17. return new Date(time).toLocaleString("zh-CN", {
  18. hour12: false,
  19. timeZone: "Asia/Shanghai"
  20. }).replace(/\//g, "-")
  21. } catch (error) {
  22. return new Date().toLocaleString("zh-CN", {
  23. hour12: false,
  24. timeZone: "Asia/Shanghai"
  25. }).replace(/\//g, "-")
  26. }
  27. },
  28. detectBrowser() {
  29. const ua = navigator.userAgent;
  30. // 按优先级顺序检测
  31. if (ua.includes("Edg/") || ua.includes("Edge/")) {
  32. return "Microsoft Edge";
  33. } else if (ua.includes("Firefox")) {
  34. return "Mozilla Firefox";
  35. } else if (ua.includes("Trident") || ua.includes("MSIE")) {
  36. return "Internet Explorer";
  37. } else if (ua.includes("360EE")) {
  38. return "360 Browser (极速模式)";
  39. } else if (ua.includes("360SE")) {
  40. return "360 Browser (安全模式)";
  41. } else if (ua.includes("SLBrowser")) {
  42. return "QQ Browser";
  43. } else if (ua.includes("UCBrowser")) {
  44. return "UC Browser";
  45. } else if (ua.includes("Opera") || ua.includes("OPR/")) {
  46. return "Opera";
  47. } else if (ua.includes("Chrome") && !ua.includes("Edg/")) {
  48. return "Google Chrome";
  49. } else if (ua.includes("Safari/") && !ua.includes("Chrome")) {
  50. return "Safari";
  51. } else {
  52. return "Other Browser";
  53. }
  54. },
  55. async addOp3(userTime, loadTime, object, status,api = 'selectUser') {
  56. if (!this.$route.query.userid) return
  57. try {
  58. if(!this.userJson || !this.userJson.accountNumber){
  59. let res = await this.ajax.get(this.$store.state.api + api, {
  60. userid: this.$route.query.userid
  61. });
  62. this.userJson = res.data[0][0]
  63. }
  64. } catch (e) {
  65. console.log(e);
  66. setTimeout(() => {
  67. this.addOp3(userTime, loadTime, object, status,'selectUser2');
  68. }, 10000);
  69. return
  70. }
  71. let _time = new Date()
  72. .toLocaleString("zh-CN", { hour12: false, timeZone: "Asia/Shanghai" })
  73. .replace(/\//g, "-");
  74. let browser = this.detectBrowser();
  75. let params = {
  76. userid: this.$route.query.userid,
  77. username: this.userJson.username,
  78. accountNumber: this.userJson.accountNumber,
  79. org: this.userJson.orgName,
  80. school: this.userJson.schoolName,
  81. role: this.userJson.type =='1'?'老师':'学生',
  82. browser: browser,
  83. userTime: userTime == "1" ? _time : userTime, // 使用时间 1次的就1 其次传秒
  84. loadTime: loadTime, //load的时间没有就“”
  85. object: JSON.stringify(object), //执行信息传json
  86. status: status //成功返回success。失败返回error的信息
  87. };
  88. console.log('params',params);
  89. this.ajax
  90. .post(this.$store.state.apiM + "updateUserData2", [params])
  91. .then(res => {
  92. if (res.data.status == 1) {
  93. console.log("保存成功");
  94. } else {
  95. console.log("保存失败");
  96. }
  97. })
  98. .catch(e => {
  99. console.log("保存失败");
  100. console.log(e);
  101. });
  102. },
  103. async chat_no_stream(prompt=[], response_format = {
  104. "type": "text"
  105. }) {
  106. return await new Promise((resolve) => {
  107. let uid = uuidv4();
  108. let data = JSON.stringify({
  109. model: 'gpt-4o-2024-11-20',
  110. temperature: 0,
  111. max_tokens: 4096,
  112. top_p: 1,
  113. frequency_penalty: 0,
  114. presence_penalty: 0,
  115. messages: prompt,
  116. uid: uid,
  117. mind_map_question: '',
  118. stream: false,
  119. response_format: response_format
  120. });
  121. let config = {
  122. method: 'post',
  123. url: this.new_url + '/api/common/chat',
  124. headers: {
  125. 'Content-Type': 'application/json'
  126. },
  127. data: data,
  128. };
  129. this.ajax.post(config.url,data)
  130. .then((response) => {
  131. resolve(response.data.FunctionResponse.choices[0].message.content);
  132. })
  133. .catch( (error)=> {
  134. console.log(error);
  135. //this.$message.error('服务器繁忙');
  136. resolve(false);
  137. });
  138. });
  139. },
  140. async ai_generate_image(prompt) {
  141. return await new Promise((resolve) => {
  142. this.ajax
  143. .post(this.new_url + "/api/agents/generateImage", {
  144. prompt,
  145. size: "1024x1024"
  146. }).then(res => {
  147. resolve(res.data);
  148. }).catch(function (error) {
  149. console.log(error);
  150. resolve(false);
  151. });
  152. })
  153. },
  154. async getAgentModel(agentId) {
  155. if (this.model[agentId]) {
  156. return this.model[agentId]
  157. }
  158. const res = await this.ajax.get('https://appapi.cocorobo.cn/api/agents/agent/' + agentId)
  159. this.model[agentId] = res
  160. return this.model[agentId]
  161. },
  162. getTtsLanguage(language) {
  163. if (language === 'com') {
  164. return 'en-US'
  165. } else if (language === 'hk') {
  166. return 'zh-HK'
  167. } else {
  168. return 'zh-CN'
  169. }
  170. },
  171. chat_stream(msg, agentId, userId, language, onMessage, session_name, file_ids, modelName) {
  172. const self = this
  173. return new Promise(function(resolve) {
  174. self.getAgentModel(agentId).then(function(agentData) {
  175. var params = {
  176. id: agentId,
  177. file_ids: file_ids || [],
  178. message: 'Language: ' + (language === 'com' ? 'English' : (language === 'hk' ? 'Traditional Chinese' : 'Chinese')) + ' ' + msg + ' ' + (language === 'hk' ? '請用繁體中文回复' : (language === 'com' ? 'Please reply in English' : '请用中文回复')),
  179. uid: uuidv4(),
  180. stream: true,
  181. model: modelName || (agentData && agentData.modelType) || 'open-doubao',
  182. userId: userId,
  183. tts_language: self.getTtsLanguage(language),
  184. session_name: session_name || uuidv4()
  185. }
  186. var ctrl = new AbortController()
  187. var content = ''
  188. fetchEventSource('https://appapi.cocorobo.cn/api/agentchats/ai_agent_chat', {
  189. method: 'POST',
  190. body: JSON.stringify(params),
  191. signal: ctrl.signal,
  192. headers: {
  193. 'Content-Type': 'application/json',
  194. },
  195. onmessage: function(event) {
  196. var data = JSON.parse(event.data)
  197. if (data.content) {
  198. if (data.content != '[DONE]') {
  199. content += data.content
  200. onMessage({
  201. type: 'message',
  202. data: content
  203. })
  204. } else {
  205. onMessage({
  206. type: 'messageEnd',
  207. data: content
  208. })
  209. }
  210. }
  211. },
  212. onclose: function() {
  213. onMessage({
  214. type: 'close',
  215. data: 'SSE Connection closed'
  216. })
  217. },
  218. onerror: function(err) {
  219. onMessage({
  220. type: 'error',
  221. data: err.message || 'Unknown error'
  222. })
  223. throw err
  224. },
  225. }).catch(function(err) {
  226. onMessage({
  227. type: 'error',
  228. data: err || 'Unknown error'
  229. })
  230. console.log('err', err)
  231. })
  232. resolve({
  233. abort: function() { ctrl.abort() }
  234. })
  235. })
  236. })
  237. },
  238. // 新增:上课/备课数据实时同步接口
  239. async syncClassData2(classData,api = 'selectUser') {
  240. if (!this.$route.query.userid) return
  241. try {
  242. if(!this.userJson || !this.userJson.accountNumber){
  243. let res = await this.ajax.get(this.$store.state.api + api, {
  244. userid: this.$route.query.userid
  245. });
  246. this.userJson = res.data[0][0]
  247. }
  248. } catch (e) {
  249. console.log(e);
  250. setTimeout(() => {
  251. this.syncClassData2(classData,'selectUser2');
  252. }, 10000);
  253. return;
  254. }
  255. if(!this.packageArray || this.packageArray.length == 0){
  256. let res = await this.ajax.get(this.$store.state.api + "selectai6AllCourse");
  257. this.packageArray = res.data[0].map(item => {
  258. let json = JSON.parse(item.package);
  259. return json;
  260. });
  261. console.log(this.packageArray);
  262. }
  263. console.log(this.packageArray);
  264. let coursePackageName2 = '';
  265. let courseName = '';
  266. let courseGrade2 = '';
  267. for(let item of this.packageArray){
  268. if(classData.ctitle.includes(item.courseName)){
  269. coursePackageName2 = item.coursePackage;
  270. courseName = item.courseName;
  271. courseGrade2 = item.grade;
  272. break;
  273. }
  274. }
  275. let courseGrade = classData.courseGrade ? await this.ajax.get(this.$store.state.api + "getClassById", { id: classData.courseGrade }) : '';
  276. let coursePackageName = await this.ajax.get(this.$store.state.api + "getCopyCourseName", { id: classData.courseId });
  277. if(courseGrade && !courseGrade2){
  278. let array = this.packageArray.sort((a, b) => a.sort - b.sort)
  279. for(let item2 of array){
  280. if(courseGrade.data && courseGrade.data[0] && courseGrade.data[0][0] && courseGrade.data[0][0].grade.includes(item2.grade)){
  281. coursePackageName2 = item2.coursePackage;
  282. courseName = item2.courseName;
  283. courseGrade2 = item2.grade;
  284. break;
  285. }
  286. }
  287. }
  288. let area = this.areaJson.find(item => this.userJson.schooldest.includes(item.code) || this.userJson.schooldest.includes(item.name));
  289. let dest = area ? area.name : '未知';
  290. let params = {
  291. "serverName": "深教AI6",
  292. "dataType": 0,
  293. "teacherName": this.userJson.username,
  294. "teacherAccount": this.userJson.accountNumber,
  295. "teacherPhone": this.userJson.phonenumber,
  296. "eduId": this.userJson.eduid || this.userJson.sessionid,
  297. "schoolName": this.userJson.schoolName,
  298. "area": dest,
  299. "coursePackageName": coursePackageName2 ? coursePackageName2 : coursePackageName.data[0][0].title,
  300. "courseId": classData.courseId,
  301. "courseName": courseName || classData.title,
  302. "courseGrade": courseGrade2 ? courseGrade2 : courseGrade.data && courseGrade.data[0] && courseGrade.data[0][0] ? courseGrade.data[0][0].name : '无年级',
  303. "courseTime": classData.courseTime,
  304. "startTime": classData.startTime,
  305. "endTime": classData.endTime
  306. }
  307. try {
  308. const response = await this.ajax.post(
  309. this.$store.state.apiSz + 'sync/class',
  310. params
  311. );
  312. return { success: true, data: response.data };
  313. } catch (error) {
  314. console.error("同步失败:", error);
  315. return { success: false, msg: error };
  316. }
  317. }
  318. }
  319. };