front.go 25 KB

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