front.go 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945
  1. // front
  2. package front
  3. import (
  4. "fmt"
  5. "io/ioutil"
  6. "log"
  7. qu "qfw/util"
  8. mgdb "qfw/util/mongodb"
  9. "qfw/util/redis"
  10. "regexp"
  11. "sort"
  12. "spider"
  13. util "spiderutil"
  14. "strconv"
  15. "strings"
  16. "sync"
  17. "time"
  18. u "util"
  19. "github.com/go-xweb/httpsession"
  20. "github.com/go-xweb/xweb"
  21. "github.com/lauyoume/gopinyin"
  22. "github.com/tealeg/xlsx"
  23. "gopkg.in/mgo.v2/bson"
  24. )
  25. type Front struct {
  26. *xweb.Action
  27. login xweb.Mapper `xweb:"/"`
  28. logout xweb.Mapper `xweb:"/center/logout"` //退出
  29. loadIndex xweb.Mapper `xweb:"/center"` //控制中心
  30. spidernew xweb.Mapper `xweb:"/center/spider"` //爬虫保存
  31. reg xweb.Mapper `xweb:"/center/reg"` //爬虫注册
  32. assign xweb.Mapper `xweb:"/center/user/assign"` //分配爬虫
  33. loadSpider xweb.Mapper `xweb:"/center/spider/edit/(.*)"` //爬虫加载
  34. viewSpider xweb.Mapper `xweb:"/center/spider/view/(.*)"` //爬虫查看
  35. downSpider xweb.Mapper `xweb:"/center/spider/download/(.*)"` //爬虫下载
  36. upState xweb.Mapper `xweb:"/center/spider/upstate"` //爬虫状态更新
  37. assort xweb.Mapper `xweb:"/center/spider/assort"` //审核人员分类
  38. batchShelves xweb.Mapper `xweb:"/center/spider/batchShelves"` //爬虫状态更新
  39. checktime xweb.Mapper `xweb:"/center/spider/checktime"` //爬虫核对
  40. disables xweb.Mapper `xweb:"/center/spider/disable"` //批量作废
  41. changeEvent xweb.Mapper `xweb:"/center/changeEvent"` //节点更新
  42. getJson xweb.Mapper `xweb:"/center/spider/json"` //
  43. delRedis xweb.Mapper `xweb:"/center/spider/delRedis"` //清理Redis
  44. updateESP xweb.Mapper `xweb:"/center/spider/updateesp"` //修改爬虫的节点和状态
  45. spiderModel xweb.Mapper `xweb:"/center/model"` //获取补充模型
  46. runStep xweb.Mapper `xweb:"/center/run"` //方法测试
  47. spiderPass xweb.Mapper `xweb:"/center/spider/pass"` //整体测试
  48. runPinYin xweb.Mapper `xweb:"/center/runpy"` //获取拼音
  49. saveStep xweb.Mapper `xweb:"/center/save"` //保存脚本
  50. loadModel xweb.Mapper `xweb:"/center/gmodel/(.*)"` //加载模型
  51. importdata xweb.Mapper `xweb:"/center/importdata"` //导入脚本
  52. importfile xweb.Mapper `xweb:"/center/importfile"` //批量导入爬虫
  53. oldedit xweb.Mapper `xweb:"/center/oldedit"` //老文件编辑
  54. findName xweb.Mapper `xweb:"/center/findname"` //即时查询名称
  55. checkrepeat xweb.Mapper `xweb:"/center/spider/isrepeat"` //脚本代码判重
  56. heart xweb.Mapper `xweb:"/center/heart"` //心跳监控
  57. Base Base
  58. OtherBase OtherBase
  59. Step1 Step1
  60. Step2 Step2
  61. Step3 Step3
  62. StepRe3 StepRe3
  63. U U
  64. luaList xweb.Mapper `xweb:"/center/lualist.html"` //脚本管理
  65. user xweb.Mapper `xweb:"/center/user.html"` //用户管理
  66. delUser xweb.Mapper `xweb:"/center/user/del"` //删除用户
  67. updateUser xweb.Mapper `xweb:"/center/user/updateUser"` //修改用户信息
  68. checkUsenamer xweb.Mapper `xweb:"/center/user/checkUsenamer"` //校验用户名的唯一性
  69. checkEmail xweb.Mapper `xweb:"/center/user/checkEmail"` //校验邮箱的唯一性
  70. saveNewUser xweb.Mapper `xweb:"/center/user/saveNewUser"` //添加用户
  71. getCity xweb.Mapper `xweb:"/center/getCity"` //获取城市
  72. }
  73. const role_admin, role_examine, role_dev = 3, 2, 1 //管理员,审核员,开发员
  74. const Sp_state_0, Sp_state_1, Sp_state_2, Sp_state_3, Sp_state_4, Sp_state_5, Sp_state_6, Sp_state_7 = 0, 1, 2, 3, 4, 5, 6, 7 //0待完成,1待审核,2打回,3发布,4作废,5已上架,6已下架,7其他
  75. var spinfos sync.Map = sync.Map{}
  76. var SessMap map[string]*httpsession.Session
  77. var AutoTpl map[string]interface{}
  78. var Mails *util.Mail
  79. var Reg = regexp.MustCompile(`(http|https)://([\w]+\.)+[\w]+`)
  80. var Transfercode map[string]interface{}
  81. var LuaStateMap = map[int]string{
  82. 0: "待完成",
  83. 1: "待审核",
  84. 2: "未通过",
  85. 3: "已通过",
  86. 4: "已作废",
  87. 5: "已上架",
  88. 6: "已下架",
  89. 7: "无发布",
  90. 8: "需登录",
  91. 9: "无法处理",
  92. 10: "已删除",
  93. }
  94. func (f *Front) Login() error {
  95. username := f.GetString("username")
  96. password := f.GetString("password")
  97. f.SetSession("password", password)
  98. password = util.Se.EncodeString(password)
  99. query := bson.M{
  100. "s_name": username,
  101. "s_pass": password,
  102. }
  103. user := *mgdb.FindOne("user", query)
  104. if user != nil && user["i_delete"] == 0 {
  105. f.SetSession("userid", user["_id"].(bson.ObjectId).Hex())
  106. f.SetSession("username", user["s_fullname"])
  107. f.SetSession("loginuser", user["s_name"])
  108. f.SetSession("email", user["s_email"])
  109. f.SetSession("auth", user["i_auth"])
  110. comeintime := time.Unix(user["l_comeintime"].(int64), 0).Format("2006-01-02")
  111. f.SetSession("comeintime", comeintime)
  112. if qu.IntAll(user["i_auth"]) > role_admin {
  113. return f.Redirect("/center/user.html")
  114. } else if qu.IntAll(user["i_auth"]) == role_dev {
  115. return f.Redirect("/center/mytask")
  116. } else {
  117. return f.Redirect("/center")
  118. }
  119. } else {
  120. if username != "" {
  121. f.T["fail"] = "fail"
  122. }
  123. return f.Render("login.html", &f.T)
  124. }
  125. }
  126. //用户管理
  127. func (f *Front) User() {
  128. if f.Method() == "POST" {
  129. auth := qu.IntAll(f.GetSession("auth"))
  130. if auth > role_admin {
  131. start, _ := f.GetInteger("start")
  132. limit, _ := f.GetInteger("length")
  133. draw, _ := f.GetInteger("draw")
  134. query := bson.M{
  135. "i_delete": 0, //可用用户
  136. "i_auth": bson.M{
  137. "$lt": auth,
  138. },
  139. }
  140. user := *mgdb.Find("user", query, nil, nil, false, start, limit)
  141. count := mgdb.Count("user", query)
  142. page := start / 10
  143. for k, v := range user {
  144. v["num"] = k + 1 + page*10
  145. v["l_comeintime"] = time.Unix(v["l_comeintime"].(int64), 0).Format("2006-01-02")
  146. v["s_pass"] = util.Se.DecodeString(v["s_pass"].(string))
  147. v["userid"] = v["_id"].(bson.ObjectId).Hex()
  148. }
  149. f.ServeJson(map[string]interface{}{
  150. "draw": draw,
  151. "data": user,
  152. "recordsFiltered": count,
  153. "recordsTotal": count,
  154. })
  155. }
  156. } else {
  157. f.Render("user.html")
  158. }
  159. }
  160. //删除用户
  161. func (f *Front) DelUser() {
  162. userid := f.GetString("userid")
  163. auth := qu.IntAll(f.GetSession("auth"))
  164. if auth > role_admin {
  165. query := bson.M{
  166. "_id": bson.ObjectIdHex(userid),
  167. }
  168. update := bson.M{
  169. "$set": bson.M{
  170. "i_delete": 1,
  171. },
  172. }
  173. ok := mgdb.Update("user", query, update, false, false)
  174. if ok {
  175. f.ServeJson(map[string]interface{}{
  176. "status": "y",
  177. })
  178. } else {
  179. f.ServeJson(map[string]interface{}{
  180. "status": "n",
  181. })
  182. }
  183. } else {
  184. f.ServeJson(map[string]interface{}{
  185. "status": "e",
  186. })
  187. }
  188. }
  189. //修改用户
  190. func (f *Front) UpdateUser() {
  191. // username := f.GetString("username")
  192. password := f.GetString("password")
  193. userid := f.GetString("userid")
  194. f.SetSession("password", password)
  195. userAuth := f.GetString("userAuth")
  196. auth := qu.IntAll(f.GetSession("auth"))
  197. self := f.GetString("self")
  198. //log.Println("userid----:", userid, "username----:", username, "password----:", password, "auth----:", auth, "self----:", self)
  199. query := bson.M{
  200. "_id": bson.ObjectIdHex(userid),
  201. }
  202. update := bson.M{}
  203. if "y" == self { //修改个人信息 只修改个人密码
  204. password = util.Se.EncodeString(password)
  205. update = bson.M{
  206. "$set": bson.M{
  207. "s_pass": password,
  208. },
  209. }
  210. } else if "y" != self && auth == 4 { //修改他人信息 只修改他人权限
  211. if userAuth == "开发员" || userAuth == "审核员" || userAuth == "管理员" {
  212. switch userAuth {
  213. case "开发员":
  214. update = bson.M{
  215. "$set": bson.M{
  216. "i_auth": 1,
  217. },
  218. }
  219. case "审核员":
  220. update = bson.M{
  221. "$set": bson.M{
  222. "i_auth": 2,
  223. },
  224. }
  225. case "管理员":
  226. update = bson.M{
  227. "$set": bson.M{
  228. "i_auth": 3,
  229. },
  230. }
  231. }
  232. }
  233. } else {
  234. f.ServeJson("没有权限!")
  235. return
  236. }
  237. ok := mgdb.Update("user", query, update, false, false)
  238. if ok {
  239. f.ServeJson(map[string]interface{}{
  240. "status": "y",
  241. })
  242. } else {
  243. f.ServeJson(map[string]interface{}{
  244. "status": "n",
  245. })
  246. }
  247. }
  248. func (f *Front) CheckUsenamer() {
  249. username := f.GetString("username")
  250. if username != "" {
  251. query := bson.M{
  252. "s_name": username,
  253. }
  254. user := *mgdb.FindOne("user", query)
  255. if user != nil {
  256. f.ServeJson(map[string]interface{}{
  257. "status": "hasUser",
  258. })
  259. } else {
  260. f.ServeJson(map[string]interface{}{
  261. "status": "notHasUser",
  262. })
  263. }
  264. }
  265. }
  266. func (f *Front) CheckEmail() {
  267. email := f.GetString("email")
  268. //校验邮箱
  269. if email != "" {
  270. query := bson.M{
  271. "s_email": email,
  272. }
  273. user := *mgdb.FindOne("user", query)
  274. if user != nil {
  275. f.ServeJson(map[string]interface{}{
  276. "status": "hasEmail",
  277. })
  278. } else {
  279. f.ServeJson(map[string]interface{}{
  280. "status": "notHasEmail",
  281. })
  282. }
  283. }
  284. }
  285. //新增用户
  286. func (f *Front) SaveNewUser() {
  287. auth := qu.IntAll(f.GetSession("auth"))
  288. if auth != 4 {
  289. f.ServeJson("没有权限!")
  290. return
  291. } else {
  292. i_auth := 1
  293. username := f.GetString("username")
  294. password := f.GetString("password")
  295. relname := f.GetString("relname")
  296. password = util.Se.EncodeString(password)
  297. email := f.GetString("email")
  298. userAuth := f.GetString("userAuth")
  299. if userAuth == "开发员" {
  300. i_auth = 1
  301. } else if userAuth == "审核员" {
  302. i_auth = 2
  303. } else {
  304. i_auth = 3
  305. }
  306. time := time.Now().Unix()
  307. save := bson.M{
  308. "s_name": username,
  309. "s_fullname": relname,
  310. "s_email": email,
  311. "s_pass": password,
  312. "i_auth": i_auth,
  313. "i_delete": 0,
  314. "l_comeintime": time,
  315. }
  316. ok := mgdb.Save("user", save)
  317. if ok != "" {
  318. f.ServeJson(map[string]interface{}{
  319. "status": "y",
  320. })
  321. } else {
  322. f.ServeJson(map[string]interface{}{
  323. "status": "n",
  324. })
  325. }
  326. }
  327. }
  328. func (f *Front) Logout() {
  329. email := f.GetSession("email").(string)
  330. f.DelSession("username")
  331. f.DelSession("userid")
  332. f.DelSession("email")
  333. f.DelSession("user")
  334. f.DelSession("loginuser")
  335. f.DelSession("auth")
  336. delete(SessMap, email)
  337. f.Redirect("/center")
  338. }
  339. //控制中心
  340. func (f *Front) LoadIndex() {
  341. auth := qu.IntAll(f.GetSession("auth"))
  342. if f.Method() == "POST" {
  343. start, _ := f.GetInteger("start")
  344. limit, _ := f.GetInteger("length")
  345. draw, _ := f.GetInteger("draw")
  346. searchStr := f.GetString("search[value]")
  347. event, _ := f.GetInteger("taskEvent") //节点
  348. //searchN := strings.Replace(searchStr, " ", "", -1)
  349. //search := strings.Replace(searchN, "\n", "", -1)
  350. search := strings.TrimSpace(searchStr)
  351. state, _ := f.GetInteger("state")
  352. urgency, _ := f.GetInteger("urgency") //节点
  353. platform := f.GetString("platform")
  354. query := bson.M{}
  355. if event > -1 {
  356. query["event"] = event
  357. }
  358. if urgency > -1 {
  359. query["urgency"] = urgency
  360. }
  361. if platform != "-1" {
  362. query["platform"] = platform
  363. }
  364. if auth == role_examine { //审核员
  365. if state > -1 {
  366. query["state"] = state
  367. } else {
  368. query["state"] = Sp_state_1
  369. }
  370. if search != "" {
  371. query["$or"] = []interface{}{
  372. bson.M{"code": bson.M{"$regex": search}},
  373. bson.M{"createuser": bson.M{"$regex": search}},
  374. bson.M{"param_common.1": bson.M{"$regex": search}},
  375. }
  376. }
  377. } else if auth == role_dev { //开发员
  378. if state > -1 {
  379. query["state"] = state
  380. }
  381. query["createuserid"] = f.GetSession("userid")
  382. query["$or"] = []interface{}{
  383. bson.M{"code": bson.M{"$regex": search}},
  384. bson.M{"createuser": bson.M{"$regex": search}},
  385. bson.M{"param_common.1": bson.M{"$regex": search}},
  386. }
  387. } else { //管理员
  388. if state > -1 {
  389. query["state"] = state
  390. }
  391. query["$or"] = []interface{}{
  392. bson.M{"code": bson.M{"$regex": search}},
  393. bson.M{"createuser": bson.M{"$regex": search}},
  394. bson.M{"param_common.1": bson.M{"$regex": search}},
  395. }
  396. }
  397. sort := `{"%s":%d}`
  398. orderIndex := f.GetString("order[0][column]")
  399. orderName := f.GetString(fmt.Sprintf("columns[%s][data]", orderIndex))
  400. orderType := 1
  401. if f.GetString("order[0][dir]") != "asc" {
  402. orderType = -1
  403. }
  404. if orderName == "param_common" {
  405. orderName = orderName + ".1"
  406. }
  407. sort = fmt.Sprintf(sort, orderName, orderType)
  408. page := start / 10
  409. //log.Println("sort", sort, orderName)
  410. luas := *mgdb.Find("luaconfig", query, sort, list_fields, false, start, limit)
  411. count := mgdb.Count("luaconfig", query)
  412. for k, v := range luas {
  413. v["num"] = k + 1 + page*10
  414. if v["modifytime"] != nil {
  415. v["modifytime"] = time.Unix(v["modifytime"].(int64), 0).Format("2006-01-02 15:04:05")
  416. } else {
  417. v["modifytime"] = "-"
  418. }
  419. if v["modifyuser"] == nil {
  420. v["modifytime"] = "-"
  421. }
  422. v["encode"] = util.Se.Encode2Hex(fmt.Sprint(v["code"]))
  423. if v["event"] == nil { //节点
  424. v["event"] = 0
  425. }
  426. //v["state"] = LuaStateMap[qu.IntAll(v["state"])]
  427. }
  428. f.ServeJson(map[string]interface{}{"draw": draw, "data": luas, "recordsFiltered": count, "recordsTotal": count})
  429. } else {
  430. events := []string{}
  431. for k, _ := range util.Config.Uploadevents {
  432. events = append(events, k)
  433. }
  434. sort.Strings(events)
  435. f.T["events"] = events
  436. f.Render("index.html", &f.T)
  437. }
  438. }
  439. func (f *Front) Checkrepeat() {
  440. code := f.GetString("code")
  441. one := *mgdb.FindOne("luaconfig", bson.M{"code": code})
  442. if len(one) > 0 {
  443. f.ServeJson("y")
  444. } else {
  445. f.ServeJson("n")
  446. }
  447. }
  448. //新建
  449. func (f *Front) Spidernew() error {
  450. auth := qu.IntAll(f.GetSession("auth"))
  451. if auth != role_admin {
  452. return nil
  453. }
  454. copy := f.GetString("copy")
  455. if copy != "" {
  456. one := *mgdb.FindOne("luaconfig", bson.M{"code": copy})
  457. delete(one, "_id")
  458. delete(one, "code")
  459. base := one["param_common"].([]interface{})
  460. base[0] = ""
  461. base[1] = ""
  462. one["param_common"] = base
  463. f.T["lua"] = one
  464. }
  465. f.T["isflow"] = 1 //新建爬虫时,初始化isflow的值
  466. f.T["actiontext"] = "新建"
  467. f.T["restate"] = 4 //此处设置restate=4无意义,只为了页面不报错
  468. return f.Render("spideredit.html", &f.T)
  469. }
  470. //得到模型
  471. func (f *Front) SpiderModel() {
  472. f.ServeJson(util.Config.Model)
  473. }
  474. func (f *Front) RunPinYin() {
  475. word := f.GetString("word")
  476. str := gopinyin.Convert(word, true)
  477. f.Write(str)
  478. }
  479. type U struct {
  480. User string
  481. Name string
  482. Pwd string
  483. }
  484. func (f *Front) Reg() {
  485. }
  486. func (f *Front) Assort() {
  487. state, _ := f.GetInteger("state")
  488. code := f.GetString("code")
  489. sql := bson.M{
  490. "$set": bson.M{
  491. "state": state,
  492. "modifytime": time.Now().Unix(),
  493. },
  494. }
  495. queryT := bson.M{
  496. "code": code,
  497. }
  498. //下架爬虫
  499. lua := *mgdb.FindOne("luaconfig", queryT)
  500. upresult, err := spider.UpdateSpiderByCodeState(code, "6", qu.IntAll(lua["event"]))
  501. qu.Debug("下架爬虫:", code, upresult, err)
  502. if upresult && err == nil {
  503. //更新爬虫
  504. mgdb.Update("luaconfig", queryT, sql, false, false)
  505. //关闭任务
  506. query := bson.M{
  507. "s_code": code,
  508. }
  509. s := *mgdb.Find("task", query, nil, nil, false, -1, -1)
  510. if s != nil {
  511. var idArr []string
  512. for _, v := range s {
  513. idArr = append(idArr, v["_id"].(bson.ObjectId).Hex())
  514. }
  515. for _, id := range idArr {
  516. sql = bson.M{
  517. "$set": bson.M{
  518. "i_state": 6,
  519. },
  520. }
  521. mgdb.Update("task", bson.M{"_id": bson.ObjectIdHex(id)}, sql, false, false)
  522. }
  523. }
  524. }
  525. f.ServeJson(bson.M{"upresult": upresult})
  526. }
  527. func (f *Front) Importfile() {
  528. auth := qu.IntAll(f.GetSession("auth"))
  529. if auth != role_admin {
  530. f.ServeJson("没有权限")
  531. return
  532. }
  533. if f.Method() == "POST" {
  534. mf, _, err := f.GetFile("xlsx")
  535. errorinfo := map[string]interface{}{}
  536. if err == nil {
  537. binary, _ := ioutil.ReadAll(mf)
  538. xls, _ := xlsx.OpenBinary(binary)
  539. sheet := xls.Sheets[0]
  540. rows := sheet.Rows
  541. for k, v := range rows {
  542. if k != 0 {
  543. cells := v.Cells
  544. if cells[1].Value != "" {
  545. o := make(map[string]interface{})
  546. o["name"] = cells[0].Value
  547. o["code"] = cells[1].Value
  548. o["channel"] = cells[2].Value
  549. o["channeladdr"] = cells[3].Value
  550. o["author"] = cells[4].Value
  551. o["timestamp"] = time.Now().Unix()
  552. o["status"] = 1
  553. o["next"] = cells[4].Value
  554. o["event"] = cells[5].Value
  555. o["historyevent"] = cells[6].Value
  556. if cells[7].Value == "是" {
  557. o["isflow"] = 1
  558. } else {
  559. o["isflow"] = 0
  560. }
  561. if cells[8].Value == "紧急" {
  562. o["urgency"] = 1
  563. } else {
  564. o["urgency"] = 0
  565. }
  566. o["platform"] = cells[9].Value
  567. // table := cells[6].Value
  568. // o["table"] = table
  569. // o["transfercode"] = qu.IntAll(Transfercode[table])
  570. query := bson.M{"code": cells[1].Value}
  571. rs := *mgdb.FindOne("import", query)
  572. if len(rs) > 0 {
  573. errorinfo[cells[1].Value] = "第" + strconv.Itoa(k) + "行重复,已经过滤"
  574. } else {
  575. ok, name := pf(o) //保存爬虫
  576. if ok == false {
  577. errorinfo[cells[1].Value] = "第" + strconv.Itoa(k) + "行找不到作者,已经过滤"
  578. } else {
  579. o["author"] = name
  580. mgdb.Save("import", o)
  581. }
  582. }
  583. }
  584. }
  585. }
  586. f.ServeJson(errorinfo)
  587. } else {
  588. f.ServeJson(false)
  589. }
  590. }
  591. }
  592. func pf(o map[string]interface{}) (bool, string) {
  593. AutoTpl["Base.SpiderName"] = o["name"]
  594. AutoTpl["Base.SpiderCode"] = o["code"]
  595. AutoTpl["Base.SpiderChannel"] = o["channel"]
  596. AutoTpl["Base.SpiderTargetChannelUrl"] = o["channeladdr"]
  597. author := o["author"].(string)
  598. one := *mgdb.FindOne("user", bson.M{"s_email": author})
  599. id := one["_id"].(bson.ObjectId).Hex()
  600. if len(one) == 0 {
  601. return false, ""
  602. }
  603. common := []interface{}{
  604. AutoTpl["Base.SpiderCode"],
  605. AutoTpl["Base.SpiderName"],
  606. AutoTpl["Base.SpiderChannel"],
  607. AutoTpl["Base.SpiderDownDetailPage"],
  608. AutoTpl["Base.SpiderStartPage"],
  609. AutoTpl["Base.SpiderMaxPage"],
  610. AutoTpl["Base.SpiderRunRate"],
  611. //AutoTpl["Base.Spider2Collection"],
  612. "bidding", //爬虫导入新建默认为bidding
  613. AutoTpl["Base.SpiderPageEncoding"],
  614. AutoTpl["Base.SpiderStoreMode"],
  615. AutoTpl["Base.SpiderStoreToMsgEvent"],
  616. AutoTpl["Base.SpiderTargetChannelUrl"],
  617. AutoTpl["Base.SpiderLastDownloadTime"],
  618. AutoTpl["Base.SpiderIsHistoricalMend"],
  619. AutoTpl["Base.SpiderIsMustDownload"],
  620. }
  621. ptime := []interface{}{
  622. AutoTpl["Step1.DateFormat"],
  623. AutoTpl["Step1.Address"],
  624. AutoTpl["Step1.ContentChooser"],
  625. }
  626. list := []interface{}{
  627. AutoTpl["Step2.Listadd"],
  628. AutoTpl["Step2.Listadds"],
  629. AutoTpl["Step2.BlockChooser"],
  630. AutoTpl["Step2.AddressChooser"],
  631. AutoTpl["Step2.TitleChooser"],
  632. AutoTpl["Step2.DateChooser"],
  633. AutoTpl["Step2.DateFormat"],
  634. }
  635. content := []interface{}{
  636. AutoTpl["Step3.ContentChooser"],
  637. AutoTpl["Step3.ElementChooser"],
  638. }
  639. param := map[string]interface{}{}
  640. param["param_common"] = common
  641. param["param_common"] = common
  642. //向导模式
  643. param["param_time"] = ptime
  644. param["param_list"] = list
  645. param["param_content"] = content
  646. param["type_time"] = 0
  647. param["type_list"] = 0
  648. param["type_content"] = 0
  649. //专家模式
  650. param["str_time"] = ""
  651. param["str_list"] = ""
  652. param["str_content"] = ""
  653. param["comeintime"] = time.Now().Unix()
  654. param["code"] = o["code"]
  655. param["createuser"] = one["s_name"]
  656. param["createuserid"] = id
  657. param["createuseremail"] = one["s_email"]
  658. param["modifyuser"] = one["s_name"]
  659. param["modifyuserid"] = id
  660. param["modifytime"] = time.Now().Unix()
  661. param["state"] = 0 //未完成
  662. if qu.IntAll(o["event"]) > 0 {
  663. param["event"] = qu.IntAll(o["event"])
  664. }
  665. s_model := "bid"
  666. configModel := util.Config.Model[s_model]
  667. model := map[string]interface{}{}
  668. for k, _ := range configModel {
  669. model[k] = ""
  670. }
  671. param["model"] = model
  672. param["next"] = o["next"]
  673. param["urgency"] = o["urgency"]
  674. param["isflow"] = o["isflow"]
  675. param["spidertype"] = "history"
  676. historyevent := qu.ObjToString(o["historyevent"])
  677. if movevent, ok := util.Config.Uploadevents[historyevent].(string); ok && movevent != "" {
  678. param["spidermovevent"] = movevent
  679. } else {
  680. param["spidermovevent"] = "7700"
  681. }
  682. param["historyevent"] = qu.IntAll(o["historyevent"])
  683. param["spiderhistorymaxpage"] = 1
  684. param["platform"] = o["platform"]
  685. //qu.Debug("param---", param)
  686. issave := spider.SaveSpider(o["code"].(string), param)
  687. return issave, one["s_name"].(string)
  688. }
  689. func (f *Front) Importdata() {
  690. auth := qu.IntAll(f.GetSession("auth"))
  691. if auth == role_admin {
  692. if f.Method() == "GET" {
  693. f.Render("import.html")
  694. } else {
  695. rss := *mgdb.Find("import", nil, `{"timestamp": -1}`, nil, false, -1, -1)
  696. f.ServeJson(map[string]interface{}{
  697. "data": rss,
  698. })
  699. }
  700. } else {
  701. f.Write("您没有导入脚本的权限")
  702. }
  703. }
  704. func Wlog(name, code, man, manid, types string, content map[string]interface{}) {
  705. obj := bson.M{
  706. "name": name,
  707. "code": code,
  708. "man": man,
  709. "manid": manid,
  710. "types": types,
  711. "time": time.Now().Unix(),
  712. "content": content,
  713. }
  714. mgdb.Save("lua_logs", obj)
  715. }
  716. func (f *Front) Oldedit() {
  717. if f.Method() == "GET" {
  718. f.Render("oldedit.html")
  719. } else {
  720. }
  721. }
  722. func (f *Front) FindName() {
  723. words := f.GetString("words")
  724. if words == "" {
  725. f.ServeJson(bson.M{"error": "null"})
  726. }
  727. query := bson.M{"$or": []interface{}{
  728. bson.M{"param_common.0": bson.M{"$regex": words}},
  729. bson.M{"param_common.1": bson.M{"$regex": words}},
  730. bson.M{"createuser": bson.M{"$regex": words}},
  731. }, "oldlua": bson.M{"$exists": false}}
  732. rs := *mgdb.Find("luaconfig", query, bson.M{"modifytime": -1}, bson.M{"param_common": 1}, false, -1, -1)
  733. if len(rs) > 0 {
  734. f.ServeJson(bson.M{"data": rs})
  735. } else {
  736. f.ServeJson(bson.M{"error": "data"})
  737. }
  738. }
  739. //分配爬虫
  740. func (f *Front) Assign() {
  741. auth := qu.IntAll(f.GetSession("auth"))
  742. if auth != role_admin {
  743. f.Write("n")
  744. return
  745. }
  746. ids := f.GetString("ids")
  747. codes := f.GetString("codes")
  748. email := f.GetString("email")
  749. idarr := strings.Split(ids, ",")
  750. codesarr := strings.Split(codes, ",")
  751. var idsinter []interface{}
  752. isemail := strings.Index(ids, "@")
  753. user := *mgdb.FindOne("user", bson.M{"s_email": email})
  754. if len(user) > 0 {
  755. userid := user["_id"].(bson.ObjectId).Hex()
  756. name := user["s_name"].(string)
  757. var query bson.M
  758. if isemail > -1 {
  759. query = bson.M{
  760. "createuseremail": bson.M{
  761. "$in": idarr,
  762. },
  763. }
  764. } else {
  765. idsinter = make([]interface{}, len(idarr))
  766. for k, v := range idarr {
  767. idsinter[k] = bson.ObjectIdHex(v)
  768. }
  769. query = bson.M{
  770. "_id": bson.M{
  771. "$in": idsinter,
  772. },
  773. }
  774. }
  775. set := bson.M{
  776. "$set": bson.M{
  777. "createuserid": userid,
  778. "createuser": user["s_name"],
  779. "createuseremail": user["s_email"],
  780. "modifyuser": user["s_name"],
  781. "modifyuserid": userid,
  782. },
  783. }
  784. b := mgdb.Update("luaconfig", query, set, false, true)
  785. if b {
  786. f.Write("y")
  787. editModify(codesarr, userid, name) //分配
  788. } else {
  789. f.Write("n")
  790. }
  791. } else {
  792. f.Write("null")
  793. }
  794. }
  795. //修改维护人
  796. func editModify(codesarr []string, userid, name string) {
  797. //修改modifyid和modify
  798. for _, v := range codesarr {
  799. query := bson.M{
  800. "s_code": v,
  801. "i_state": bson.M{
  802. "$ne": 4,
  803. },
  804. }
  805. task := *mgdb.Find("task", query, nil, nil, false, -1, -1)
  806. if len(task) > 0 {
  807. for _, v := range task { //循环 修改任务
  808. update := bson.M{
  809. "$set": bson.M{
  810. "s_modify": name,
  811. "s_modifyid": userid,
  812. },
  813. }
  814. queryT := bson.M{
  815. "_id": v["_id"],
  816. }
  817. flag := mgdb.Update("task", queryT, update, false, false)
  818. log.Println("分配修改任务维护人:", flag)
  819. }
  820. } else {
  821. continue
  822. }
  823. }
  824. }
  825. //清理Redis
  826. func (f *Front) DelRedis() {
  827. hrefs := f.GetString("href")
  828. hrefsarr := strings.Split(hrefs, ",")
  829. auth := qu.IntAll(f.GetSession("auth"))
  830. err := []string{}
  831. if auth == role_admin { //权限控制
  832. if len(hrefsarr) > 0 {
  833. for k1, h := range hrefsarr {
  834. href := Reg.FindString(h)
  835. if href != "" {
  836. href = "url_repeat_" + href + "*"
  837. res := redis.GetKeysByPattern("title_repeat_judgement", href)
  838. if res != nil {
  839. for _, v := range res {
  840. hf := string(v.([]uint8))
  841. b := redis.Del("title_repeat_judgement", hf)
  842. if !b {
  843. err = append(err, "第"+strconv.Itoa(k1+1)+"个")
  844. }
  845. }
  846. }
  847. } else {
  848. err = append(err, "第"+strconv.Itoa(k1+1)+"个")
  849. }
  850. }
  851. }
  852. } else {
  853. err = append(err, "没有权限")
  854. }
  855. f.ServeJson(err)
  856. }
  857. func (f *Front) UpdateESP() {
  858. val := f.GetString("val")
  859. w := f.GetString("w")
  860. id := f.GetString("id")
  861. query := map[string]interface{}{
  862. "_id": qu.StringTOBsonId(id),
  863. }
  864. set := map[string]interface{}{}
  865. update := map[string]interface{}{
  866. "$set": set,
  867. }
  868. if w == "state" { //修改状态为待完成
  869. set["state"] = 0
  870. } else if w == "platform" {
  871. set["platform"] = val
  872. } else { //修改节点
  873. event, _ := strconv.Atoi(val)
  874. set["event"] = event
  875. set["historyevent"] = event
  876. //state := f.GetString("s")
  877. //if state == "5" { //已上架状态改为下架
  878. code := f.GetString("c")
  879. set["state"] = 6
  880. b, err := UpStateAndUpSpider(code, "", "", "", Sp_state_6) //线上爬虫下架
  881. if !b || err != nil {
  882. f.Write("n")
  883. return
  884. }
  885. //}
  886. }
  887. if mgdb.Update("luaconfig", query, update, false, false) {
  888. log.Println("Id:", id, " Update", w, val, "Success")
  889. f.Write("y")
  890. } else {
  891. log.Println("Id:", id, " Update", w, val, "Failed")
  892. f.Write("n")
  893. }
  894. f.Write("n")
  895. }
  896. func (f *Front) GetCity() {
  897. area := f.GetString("area")
  898. cityArr := []string{}
  899. cityArr = u.Province[area]
  900. f.ServeJson(cityArr)
  901. }